Python kmeans算法
1. 简介
Kmeans算法是一种常用的聚类算法,它将n个样本分为k个聚类,使得每个样本点都属于离它最近的聚类中心。Kmeans的基本思想是通过迭代的方式,不断更新聚类中心,直至达到最优解。
Kmeans算法的步骤:
1. 随机选择k个中心点,作为初始聚类中心;
2. 将样本点分配到离它最近的聚类中心;
3. 更新聚类中心,将每个聚类中的样本点的均值作为新的聚类中心;
4. 重复步骤2和3,直至聚类中心不再改变或达到指定的迭代次数。
2. 实现
2.1 导入所需库
我们首先导入需要用到的库:numpy和matplotlib。
import numpy as np
import matplotlib.pyplot as plt
2.2 生成样本数据
为了演示kmeans算法,我们需要生成一些随机的样本数据。我们使用numpy的random模块生成两个独立的高斯分布,并将它们合并。
mean1 = [2, 2]
cov1 = [[0.5, 0], [0, 0.5]]
x1, y1 = np.random.multivariate_normal(mean1, cov1, 200).T
mean2 = [-2, -2]
cov2 = [[0.5, 0], [0, 0.5]]
x2, y2 = np.random.multivariate_normal(mean2, cov2, 200).T
X = np.concatenate((np.array([x1, y1]).T, np.array([x2, y2]).T))
2.3 初始化聚类中心
在Kmeans算法中,聚类中心是随机选择的。这里我们选择两个样本作为初始聚类中心。
k = 2
np.random.shuffle(X)
initial_centers = X[:k]
2.4 计算样本点到聚类中心的距离
为了将样本点分配到离它最近的聚类中心,我们需要计算样本点到聚类中心的距离。这里我们使用欧氏距离。
def calculate_distance(X, centers):
distances = []
for x in X:
distances.append(np.linalg.norm(x - centers, axis=1))
return np.array(distances)
distances = calculate_distance(X, initial_centers)
2.5 分配样本点到聚类中心
根据计算得到的距离,我们将每个样本点分配到离它最近的聚类中心。
def assign_points(X, centers):
distances = calculate_distance(X, centers)
return np.argmin(distances, axis=1)
labels = assign_points(X, initial_centers)
2.6 更新聚类中心
在Kmeans算法中,每个聚类中的样本点的均值将作为新的聚类中心。
def update_centers(X, labels, k):
centers = []
for i in range(k):
indices = np.where(labels == i)
centers.append(np.mean(X[indices], axis=0))
return np.array(centers)
new_centers = update_centers(X, labels, k)
2.7 迭代更新
我们将以上步骤2和步骤3进行迭代更新,直至聚类中心不再改变或达到指定的迭代次数。
def kmeans(X, k, max_iter=100):
np.random.shuffle(X)
centers = X[:k]
for _ in range(max_iter):
labels = assign_points(X, centers)
new_centers = update_centers(X, labels, k)
if np.all(centers == new_centers):
break
centers = new_centers
return labels, centers
labels, centers = kmeans(X, k)
3. 结果展示
最后,我们将生成的样本数据和聚类结果可视化。
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x')
plt.show()
4. 总结
本文详细介绍了Python中的Kmeans算法,包括算法步骤和实现过程。通过生成随机样本数据并使用Kmeans算法进行聚类,我们得到了聚类结果的可视化。
Kmeans算法是一种常用的聚类算法,适用于处理具有明显分组特征的数据。对于大规模数据集,Kmeans算法可以通过优化算法实现高效计算。在实际应用中,Kmeans算法被广泛应用于图像分割、文本聚类、推荐系统等领域。