Python实现聚类K-means算法详解
本攻略将介绍如何使用Python实现聚类K-means算法。K-means算法是一种常用的聚类算法,其基本思想是将数据集分成K个簇,每个簇包含最接近其质心的数据点。在本攻略中,我们将介绍K-means算法的原理和实现方法,并提供两个示例来演示如何使用Python实现K-means算法。
K-means算法原理
K-means算法是一种迭代算法,其基本思想是将数据集分成K个簇,每个簇包含最接近其质心的数据点。K-means算法的具体步骤如下:
- 随机选择K个数据点作为初始质心。
- 将每个数据点分配到最近的质心所在的簇中。
- 计算每个簇的新质心。
- 重复步骤2和3,直到质心不再发生变化或达到最大迭代次数。
K-means算法的优点是简单易用,但其结果可能受到初始质心的影响,且对于非凸数据集的聚类效果不佳。
Python实现K-means算法
以下是使用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):
# 分配数据点到最近的质心
distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
labels = np.argmin(distances, axis=0)
# 计算新的质心
new_centroids = np.array([X[labels == j].mean(axis=0) for j in range(self.n_clusters)])
# 如果质心不再发生变化,则停止迭代
if np.allclose(centroids, new_centroids):
break
centroids = new_centroids
self.labels_ = labels
self.cluster_centers_ = centroids
在这个示例中,我们定义了一个KMeans类,其中包含两个方法:init()和fit()。init()方法用于初始化KMeans类的参数,包括簇的数量和最大迭代次数。fit()方法用于拟合数据并执行K-means算法。
示例说明
以下是使用Python实现K-means算法的示例:
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 生成机数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 使用K-means算法进行聚类
kmeans = KMeans(n_clusters=4)
means.fit(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
在这个示例中,我们使用make_blobs()函数生成一个随机数据集。然后我们使用K-means算法对数据进行聚类,并使用matplotlib库绘制聚类结果。
以下是另一个示例,演示如何使用K-means算法对图像进行压缩:
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle
# 加载样本图像
china = load_sample_image('china.jpg')
china = np.array(china, dtype=np.float64) / 255
# 将图像转换为二维数组
w, h, d =(china.shape)
image_array = np.reshape(china, (w * h, d))
# 对图像进行K-means聚类
kmeans = KMeans(n_clusters=64)
image_array_sample shuffle(image_array, random_state=0, n_samples=1000)
kmeans.fit(image_array_sample)
# 使用聚类结果对图像进行压缩
compressed_image = kmeans.cluster_centers_[kmeans.predict(image_array)]
compressed_image = np.reshape(compressed_image, (w, h, d))
# 绘制原始图像和压缩后的图像
fig, ax = plt.subplots(1, 2, figsize=(16, 6))
ax[0].imshow(china)
ax[0].axis('off')
ax[0].set_title('Original Image')
ax[1].imshow(compressed_image)
ax[1].axis('off')
ax[1].set_title('Compressed Image ({0} colors)'.format(kmeans.n_clusters))
plt.show()
在这个示例中,我们加载了一个样本图像,并将其转换为二维数组。然后我们使用K-means算法对图像进行聚类,并使用聚类结果对图像进行压缩最后,我们绘制了原始图像和压缩后的图像。
总结
以上是Python实现K-means算法详解。K-means算法是一种常用的聚类算法,其基本思想是将数据集分成K个簇,每个簇包含最接近其质心的数据点。本攻略中,我们介绍了K-means算法的原理和实现,并提供了两个示例来演示如何使用Python实现K-means算法。这些示例代码可以帮助读者更地理K-means算法的方法和应用场景。