Comment écrire un algorithme de clustering K-means en Python ?
K-均值聚类算法是一种常用的数据挖掘和机器学习算法,能够将一组数据按照其属性进行分类和聚类。本文将介绍如何用Python编写K-均值聚类算法,并提供具体的代码示例。
在开始编写代码之前,我们需要了解K-均值聚类算法的基本原理。
K-均值聚类算法的基本步骤如下:
- 初始化k个质心。质心是指聚类的中心点,每个数据点都会被归到与其最近的质心所代表的类别。
- 根据每个数据点与质心的距离,将其分配到最近的质心所代表的类别。
- 更新质心的位置,将其设置为该类别中所有数据点的平均值。
- 重复步骤2和步骤3,直到质心的位置不再变化为止。
现在我们可以开始编写代码了。
导入必要的库
首先,我们需要导入必要的库,如numpy和matplotlib。
1 2 | import numpy as np
import matplotlib.pyplot as plt
|
Copier après la connexion
数据准备
我们需要准备一组用于聚类的数据。这里我们使用numpy随机生成一组二维数据。
1 | data = np.random.randn( 100 , 2 )
|
Copier après la connexion
初始化质心
我们需要为聚类算法初始化k个质心。这里我们使用numpy随机选择k个数据点作为初始质心。
1 2 | k = 3
centroids = data[np.random.choice( range ( len (data)), k, replace = False )]
|
Copier après la connexion
计算距离
我们需要定义一个函数来计算数据点与质心的距离。这里我们使用欧几里得距离。
1 2 | def compute_distances(data, centroids):
return np.linalg.norm(data[:, np.newaxis] - centroids, axis = 2 )
|
Copier après la connexion
分配数据点到最近的质心
我们需要定义一个函数来将每个数据点分配到最近的质心所代表的类别。
1 2 3 | def assign_clusters(data, centroids):
distances = compute_distances(data, centroids)
return np.argmin(distances, axis = 1 )
|
Copier après la connexion
更新质心的位置
我们需要定义一个函数来更新质心的位置,即将其设置为该类别中所有数据点的平均值。
1 2 3 4 5 | def update_centroids(data, clusters, k):
centroids = []
for i in range (k):
centroids.append(np.mean(data[clusters = = i], axis = 0 ))
return np.array(centroids)
|
Copier après la connexion
迭代聚类过程
最后,我们需要迭代聚类过程,直到质心的位置不再变化为止。
1 2 3 4 5 6 7 8 9 | def kmeans(data, k, max_iter = 100 ):
centroids = data[np.random.choice( range ( len (data)), k, replace = False )]
for _ in range (max_iter):
clusters = assign_clusters(data, centroids)
new_centroids = update_centroids(data, clusters, k)
if np. all (centroids = = new_centroids):
break
centroids = new_centroids
return clusters, centroids
|
Copier après la connexion
运行聚类算法
现在我们可以运行聚类算法,得到每个数据点所属的类别和最终的质心。
1 | clusters, centroids = kmeans(data, k)
|
Copier après la connexion
可视化结果
最后,我们可以使用matplotlib将结果可视化。将每个数据点按照其所属的类别进行颜色标记,并将质心的位置用红色圆圈表示。
1 2 3 | plt.scatter(data[:, 0 ], data[:, 1 ], c = clusters)
plt.scatter(centroids[:, 0 ], centroids[:, 1 ], s = 100 , c = 'red' , marker = 'o' )
plt.show()
|
Copier après la connexion
通过以上的代码示例,我们可以用Python实现K-均值聚类算法。你可以根据自己的需求调整聚类的个数k,以及其他参数。希望本文对你理解和实现K-均值聚类算法有所帮助!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!