优草派  >   Python

k-means 聚类算法与Python实现代码

马婷            来源:优草派

K-means聚类算法是一种常用的无监督学习算法,可以将数据样本分成K个类别。其基本思想是将数据样本分成K个簇,使得簇内的数据点相似度高,簇间的相似度低。K-means算法在数据挖掘、图像处理、自然语言处理等领域都有广泛应用。本文将从算法原理、Python实现及应用等多个角度对K-means聚类算法进行分析。一、算法原理

K-means聚类算法基于距离度量来确定数据样本之间的相似度,常用的距离度量包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。算法流程如下:

k-means 聚类算法与Python实现代码

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()

```

四、

【原创声明】凡注明“来源:优草派”的文章,系本站原创,任何单位或个人未经本站书面授权不得转载、链接、转贴或以其他方式复制发表。否则,本站将依法追究其法律责任。
TOP 10
  • 周排行
  • 月排行