K-Means聚类算法的原理与Python实现
K-Means聚类算法的实现
1、简介
K-Means是一种广泛使用的聚类算法,属于无监督学习方法,主要用于将数据集划分为多个组(簇)。它的基本思想是通过迭代的方式最小化簇内的误差平方和(即簇内所有点到该簇中心的距离平方和)。
2、算法原理
初始化:
- 随机选择K个数据点作为初始的簇中心(质心)。
- 或者使用某些启发式方法(如K-Means++)来选择初始质心,以提高算法的性能和稳定性。
分配点到最近的簇:
- 对于数据集中的每一个点,计算它与每个质心之间的距离,并将其分配给距离最近的质心所在的簇。
- 常用的距离度量方法是欧氏距离,但也可以使用其他距离度量。
更新质心:
- 对于每个簇,重新计算其质心,新的质心是该簇中所有点的平均值。
重复步骤2和3:
- 重复执行“分配点”和“更新质心”这两个步骤,直到质心不再发生变化或变化非常小,或者达到预设的最大迭代次数。
3、算法实现
import numpy as np
class KMeans:
def __init__(self, k=3, max_iters=100):
self.k = k
self.max_iters = max_iters
self.centroids = None
def fit(self, X):
self.centroids = X[np.random.choice(X.shape[0], self.k, replace=False)]
for _ in range(self.max_iters):
clusters = [[] for _ in range(self.k)]
for x in X:
distances = [np.linalg.norm(x - c) for c in self.centroids]
cluster_idx = np.argmin(distances)
clusters[cluster_idx].append(x)
new_centroids = np.array([np.mean(cluster, axis=0) for cluster in clusters])
if np.all(self.centroids == new_centroids):
break
self.centroids = new_centroids
def predict(self, X):
distances = [np.linalg.norm(X - c, axis=1) for c in self.centroids]
return np.argmin(distances, axis=0)
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
kmeans = KMeans(k=2)
kmeans.fit(X)
predictions = kmeans.predict(X)
print("中心点:", kmeans.centroids)
print("预测点:", predictions)
5、运行效果
> 中心点: [[1.16666667 1.46666667]
[7.33333333 9. ]]
> 预测点: [0 0 1 1 0 1]
K-Means聚类算法的原理与Python实现
https://www.dearcloud.cn/2024/11/14/20241114-k-means-impls/K-Means聚类算法的原理与Python实现/