下面是详细讲解“Python中实现k-means聚类算法详解”的完整攻略,包括算法原理、Python实现和两个示例说明。
算法原理
k-means聚类算法是一种基于距离的聚类算法,其基本思想是将数据集划分为k个簇,使得同一簇内的数据点之间的距离尽可能小,不同簇之间的距离尽可能大。具体来说,k-means聚类算法的步骤如下:
- 随机选择k个数据点作为初始聚类中心。
- 对于每个数据点,计算其与每个聚类中心的距离,将其归为距离最近的聚类中心所在的簇。
- 对于每个簇,重新计算其聚类中心。
- 重复步骤2和步骤3,直到聚类中心不再发生变化或达到最大迭次数。
Python实现代码
以下是Python实现k-means聚类算法的示例代码:
import numpy as np
class KMeans:
def __init__(self, n_clusters=8, max_iter=300):
self.n_clusters = n_clusters
self.max_iter = max_iter
def fit(self, X):
n_samples, n_features = X.shape
centroids = X[np.random.choice(n_samples, self.n_clusters, replace=False)]
for i in range(self.max_iter):
clusters = [[] for _ in range(self.n_clusters)]
for j in range(n_samples):
distances = np.linalg.norm(X[j] - centroids, axis=1)
cluster_idx = np.argmin(distances)
clusters[cluster_idx].append(j)
new_centroids = np.zeros((self.n_clusters, n_features))
for j in range(self.n_clusters):
if len(clusters[j]) > 0:
new_centroids[j] = np.mean(X[clusters[j]], axis=0)
else:
new_centroids[j] = centroids[j]
if np.allclose(new_centroids, centroids):
break
centroids = new_centroids
self.centroids = centroids
def predict(self, X):
distances = np.linalg.norm(X - self.centroids[:, np.newaxis], axis=2)
return np.argmin(distances, axis=0)
上述代码中,定义了一个KMeans类表示k-means聚类器,包括簇的数量和最大迭代次数等参数。fit方法接受一个数据矩阵X作为参数,随机选择k个数据点作为初始聚类中心,然后对于每个数据点,计算其与每个聚类中心的距离,将其归为距离最近的聚类中心所在的簇,并重新计算每个簇的聚类中心,重复以上步骤直到聚类中心不再发生变化或达到最大迭代次数。predict方法接受一个数据矩阵X作为参数,计算每个数据点与聚类中心的距离,将其归为距离最近的簇。
示例说明
以下是两个示例,说明如何使用KMeans类进行聚类。
示例1
使用KMeans类对Iris数据集进行聚类。
from sklearn.datasets import load_iris
from sklearn.metrics import silhouette_score
iris = load_iris()
X = iris.data
y = iris.target
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_pred = kmeans.predict(X)
score = silhouette_score(X, y_pred)
print(f"Silhouette score: {score}")
输出结果:
Silhouette score: 0.5528190123564091
示例2
使用KMeans类对手写数字数据集进行聚类。
from sklearn.datasets import load_digits
from sklearn.metrics import silhouette_score
digits = load_digits()
X = digits.data
y = digits.target
kmeans = KMeans(n_clusters=10)
kmeans.fit(X)
y_pred = kmeans.predict(X)
score = silhouette_score(X, y_pred)
print(f"Silhouette score: {score}")
输出结果:
Silhouette score: 0.1827298559477645
总结
本文介绍了Python中实现k-means聚类算法详解,包括算法原理、Python实现代码和两个示例说明。k-means聚类算法是一种简单而有效的聚类算法,适用于大规模数据集。在实际应用中,需要注意选择合适的簇的数量和距离度量方法,以获得更好的性能。