KMeans算法是一种无监督的聚类算法,它能够将数据分为若干个簇,算法的核心思想是通过迭代寻找各簇的中心点来优化聚类结果。使用Python实现KMeans算法主要涉及初始化簇中心、计算数据点到簇中心的距离、重新分配数据点到最近的簇、更新簇中心以及迭代上述步骤直至收敛。在Python中,可以通过sklearn.cluster
中的KMeans
类来实现这一算法,也可以编写自定义函数实现从零开始的KMeans算法,其中,选择合适的距离度量、初始化方法和收敛条件是关键。
在下面的内容中,我们将详细介绍如何使用sklearn
库中的KMeans
类实现算法,以及如何从零开始编写KMeans算法。
在使用sklearn.cluster
的KMeans
类之前,需要安装scikit-learn
库。接着,通过导入必要的模块,创建一个KMeans的实例,并调用fit
方法来训练模型。
from sklearn.cluster import KMeans
import numpy as np
模拟一些数据
data = np.array([[1, 2], [1, 4], [1, 0],
[10, 2], [10, 4], [10, 0]])
创建KMeans实例
kmeans = KMeans(n_clusters=2, random_state=0)
训练模型
kmeans.fit(data)
获取聚类标签
labels = kmeans.labels_
打印聚类标签
print(labels)
获取簇中心
centroids = kmeans.cluster_centers_
打印簇中心
print(centroids)
在上面的示例中,我们先创建了一些简单的数据,然后使用了两个簇进行KMeans聚类。n_clusters
参数决定了要划分的簇的数量,而random_state
参数保证了结果可以复现。训练完成后,可以通过labels_
属性获取到每个数据点的簇标签,cluster_centers_
属性则给出了每个簇的中心。
从零开始实现KMeans算法涉及到更多的步骤,首先是选择合适的初始化方式,经常使用的是随机初始化和KMeans++初始化方式。然后是通过迭代过程中逐步更新簇中心,直到满足收敛条件为止。下面是一个基本的从零开始的实现流程:
初始化簇中心对KMeans算法的最终结果有重要影响。常用的初始化方法包括随机选择和KMeans++。
计算每个数据点到不同簇中心的距离,通常使用欧氏距离作为度量标准。
根据计算出的距离,将每个数据点分配到最近的簇中心所在的簇。
更新每个簇的中心点,通常是取簇中所有点的均值作为新的簇中心。
检查簇中心的变化是否小于一个预定义的阈值,或者迭代次数是否达到限定值,以此判定算法是否收敛。
下面是从零开始实现KMeans算法的示例代码:
import numpy as np
计算两点之间的欧氏距离
def euclidean_distance(point1, point2):
return np.sqrt(np.sum((point1 - point2)2))
初始化簇中心点
def initialize_centroids(points, k):
centroids = points.copy()
np.random.shuffle(centroids)
return centroids[:k]
将点分配到最近的簇中心
def assign_points_to_centroids(points, centroids):
assignments = []
for point in points:
distances = [euclidean_distance(point, centroid) for centroid in centroids]
closest_centroid = np.argmin(distances)
assignments.append(closest_centroid)
return assignments
根据分配更新簇中心
def update_centroids(points, assignments, k):
centroids = np.zeros((k, points.shape[1]))
for i in range(k):
cluster_points = points[assignments == i]
centroids[i] = cluster_points.mean(axis=0)
return centroids
KMeans算法主函数
def kmeans(points, k, max_iters=100):
centroids = initialize_centroids(points, k)
for _ in range(max_iters):
old_centroids = centroids
assignments = assign_points_to_centroids(points, centroids)
centroids = update_centroids(points, np.array(assignments), k)
if np.all(centroids == old_centroids):
break
return assignments, centroids
创建数据并运行KMeans算法
data = np.random.randn(300, 2)
assignments, centroids = kmeans(data, k=3)
print(assignments)
print(centroids)
这段代码首先定义了计算欧氏距离的函数,用于测量点与簇中心之间的距离。接着,定义了初始化簇中心、分配点到簇中心、更新簇中心和KMeans算法的主函数。在模拟数据上运行该算法会输出每个点的簇分配和最终簇中心的位置。
将上述两种方法应用于实际问题时,通常始于使用scikit-learn库中的KMeans类进行原型设计,并在需要更深入了解算法内部机制或进行自定义调整时,从零开始编写KMeans算法。
1. Python中如何实现K-means算法?
K-means算法是一种常用的聚类算法,可以通过以下步骤在Python中实现:
(1)首先,导入必要的库,如numpy和sklearn的KMeans类。
(2)准备将要进行聚类的数据集,可以使用numpy数组保存数据。
(3)选择要分为几类,即K值。
(4)使用KMeans类创建一个K-means模型,设置K值,并进行训练。
(5)根据训练后的模型,预测每个数据点所属的类别。
(6)通过绘图将数据点和聚类中心可视化,以便更好地理解聚类结果。
2. 如何评估K-means算法的聚类效果?
评估K-means算法的聚类效果可以使用一些常见的指标,如轮廓系数和聚类完整性指标。
轮廓系数是一种度量聚类质量的指标,对于每个数据点,它考虑了它与其所属的簇内其他点的平均距离和该点与最近邻簇内其他点的平均距离之间的差异。轮廓系数的取值范围是[-1, 1],值越接近1表示聚类效果越好。
聚类完整性指标是另一种评估聚类效果的指标,它衡量了每个簇内真实类别的频率和该簇中的最频繁类别之间的差异。聚类完整性指标的取值范围是[0, 1],值越接近1表示聚类效果越好。
3. 有哪些方法可以优化K-means算法的性能?
K-means算法的性能可以通过以下方式进行优化:
(1)增加随机初始化的次数:由于K-means算法的结果受到初始聚类中心的影响,可以多次运行算法,选择聚类结果最好的那次。
(2)使用PCA降维:如果数据维度很高,可以使用主成分分析(PCA)技术将数据降维,减少计算量和内存消耗。
(3)使用Mini-batch K-means:Mini-batch K-means是对传统K-means算法的改进,它使用随机抽样的方式进行更新,从而加快了算法的收敛速度。
(4)使用其他聚类算法的预处理步骤:可以使用其他聚类算法的一些预处理步骤,如层次聚类和密度聚类,来帮助初始化K-means聚类中心。
最后建议,企业在引入信息化系统初期,切记要合理有效地运用好工具,这样一来不仅可以让公司业务高效地运行,还能最大程度保证团队目标的达成。同时还能大幅缩短系统开发和部署的时间成本。特别是有特定需求功能需要定制化的企业,可以采用我们公司自研的企业级低代码平台:织信Informat。 织信平台基于数据模型优先的设计理念,提供大量标准化的组件,内置AI助手、组件设计器、自动化(图形化编程)、脚本、工作流引擎(BPMN2.0)、自定义API、表单设计器、权限、仪表盘等功能,能帮助企业构建高度复杂核心的数字化系统。如ERP、MES、CRM、PLM、SCM、WMS、项目管理、流程管理等多个应用场景,全面助力企业落地国产化/信息化/数字化转型战略目标。 版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们微信:Informat_5 处理,核实后本网站将在24小时内删除。版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系邮箱:hopper@cornerstone365.cn 处理,核实后本网站将在24小时内删除。