什么是k-means聚类分析?
k-means聚类算法是一种无监督的机器学习算法,它将数据集分成k个不同的簇。这个算法会尝试将数据点分配到簇中,使得同一个簇内的数据点之间的距离最小,而不同簇之间的距离最大。
k-means算法的优点是简单易懂,并且可以在大规模数据集上运行。但是,如果初始簇心选择不当,可能会导致算法陷入局部最小值。另外,在应用中,需要选择合适的k值。
k-means聚类分析算法步骤
k-means算法的步骤大致如下:
1. 随机初始化簇心
随机选择k个数据点作为初始簇心。
2. 分配数据点到最近的簇
对于每个数据点,计算它和每个簇心之间的距离,将其分配到最近的簇。
3. 计算新的簇心
对于每个簇,计算当前簇内的数据点的平均值,将该平均值作为新的簇心。
4. 重复2和3,直到簇心不再改变或达到最大迭代次数
一直重复步骤2和3,直到簇心不再改变或达到最大迭代次数。
使用python实现k-means聚类分析
下面我们使用Python实现k-means聚类分析。我们将使用一个带有4个特征的鸢尾花数据集。由于我们不知道数据集的真实标签,因此我们将使用k-means算法对数据进行聚类,然后将结果可视化。我们将使用numpy和matplotlib库实现。
1. 导入必要的库和数据
import numpy as np
import matplotlib.pyplot as plt
# 导入数据
from sklearn.datasets import load_iris
iris = load_iris()
data = iris.data
2. 实现k-means算法
def k_means(data, k, max_iter=100, seed=0):
"""
k-means聚类算法
"""
np.random.seed(seed)
# 随机初始化簇心
centers = np.random.uniform(low=data.min(axis=0), high=data.max(axis=0), size=(k, data.shape[1]))
for i in range(max_iter):
# 分配数据点到最近的簇
dist = np.linalg.norm(data[:, np.newaxis] - centers, axis=-1) # 计算数据点到每个簇心的距离
labels = np.argmin(dist, axis=-1) # 取距离最小的簇心的下标作为标签
# 计算新的簇心
for j in range(k):
centers[j] = np.mean(data[labels==j], axis=0)
return labels, centers
3. 调用k-means算法并可视化结果
labels, centers = k_means(data, k=3)
# 可视化结果
plt.scatter(data[labels==0][:, 0], data[labels==0][:, 1], color='r')
plt.scatter(data[labels==1][:, 0], data[labels==1][:, 1], color='g')
plt.scatter(data[labels==2][:, 0], data[labels==2][:, 1], color='b')
plt.scatter(centers[:, 0], centers[:, 1], marker='x', color='k', s=200)
plt.show()
运行上面的代码,我们可以得到下面的可视化结果:
总结
本篇文章介绍了k-means聚类算法的实现步骤,并使用Python实现了一个简单的k-means算法。了解k-means算法可以帮助我们更好地理解聚类分析,同时也可以帮助我们在实际应用中更好地处理聚类问题。