K-means聚类算法是一种常用的无监督学习算法,可以将数据样本分成K个类别。其基本思想是将数据样本分成K个簇,使得簇内的数据点相似度高,簇间的相似度低。K-means算法在数据挖掘、图像处理、自然语言处理等领域都有广泛应用。本文将从算法原理、Python实现及应用等多个角度对K-means聚类算法进行分析。一、算法原理
K-means聚类算法基于距离度量来确定数据样本之间的相似度,常用的距离度量包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。算法流程如下:

1. 首先选择样本集中的K个点作为初始的聚类中心
2. 对于每个样本,计算其到K个聚类中心的距离,将其分配到距离最近的聚类中心所在的簇中
3. 对每个簇计算其中所有样本的均值,将其作为新的聚类中心
4. 重复步骤2、3,直到聚类中心不再发生变化,或者达到预设的最大迭代次数
二、Python实现
Python是一种广泛使用的编程语言,其强大的数据处理能力使其成为K-means聚类算法的常用工具。下面介绍一种使用Python实现K-means聚类算法的方法。
1. 导入必要的库
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
```
2. 生成数据集
使用make_blobs函数生成一个包含1000个样本,3个簇的数据集。
```python
X, y = make_blobs(n_samples=1000, centers=3, random_state=42)
```
3. 初始化聚类中心
随机选择3个数据点作为初始的聚类中心。
```python
k = 3
centers = X[np.random.choice(X.shape[0], k, replace=False)]
```
4. 迭代计算聚类中心
重复执行步骤2和3,直到聚类中心不再发生变化。
```python
for i in range(10):
# 计算每个样本到聚类中心的距离
distances = np.linalg.norm(X[:, np.newaxis, :] - centers, axis=-1)
# 将每个样本分配到距离最近的聚类中心所在的簇中
cluster_labels = np.argmin(distances, axis=-1)
# 计算每个簇中的样本均值,更新聚类中心
for j in range(k):
centers[j] = np.mean(X[cluster_labels == j], axis=0)
```
5. 可视化聚类结果
使用matplotlib库将聚类结果可视化。
```python
plt.scatter(X[:, 0], X[:, 1], c=cluster_labels)
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=100, marker='x')
plt.show()
```
三、应用实例
K-means聚类算法在数据挖掘、图像处理、自然语言处理等领域都有广泛应用。下面介绍一个使用K-means算法对图像进行颜色压缩的实例。
1. 导入必要的库
```python
import numpy as np
import matplotlib.pyplot as plt
from skimage import io
from sklearn.cluster import KMeans
```
2. 加载图片
使用skimage库中的io.imread函数加载一张图片。
```python
image = io.imread('test.jpg')
```
3. 转换图片格式
将图片从三维矩阵转换为二维矩阵。
```python
h, w, d = image.shape
image_array = np.reshape(image, (h * w, d))
```
4. 使用K-means算法进行聚类
使用sklearn库中的KMeans函数对图片像素进行聚类。
```python
k = 16
kmeans = KMeans(n_clusters=k).fit(image_array)
```
5. 生成新图片
将每个像素点分配到最近的聚类中心所在的簇中,生成新的图片。
```python
compressed_image = np.zeros_like(image_array)
for i in range(k):
compressed_image[kmeans.labels_ == i] = kmeans.cluster_centers_[i]
compressed_image = np.reshape(compressed_image, (h, w, d))
```
6. 可视化图片
使用matplotlib库将原始图片和新图片进行对比可视化。
```python
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.axis('off')
plt.title('Original Image')
plt.subplot(1, 2, 2)
plt.imshow(compressed_image)
plt.axis('off')
plt.title('Compressed Image')
plt.show()
```
四、