当然,我非常乐意给大家分享一篇关于Python实现K-Means聚类算法的完整攻略。让我们开始吧!
什么是K-Means聚类算法?
K-Means聚类算法是一种无监督学习算法,它根据不同数据点之间的相似性将其归为不同的簇。聚类的目的是将数据点分为具有相似特征的组,从而打破数据的孤岛。
K-Means算法是一个迭代过程,通过在数据集中找到重心,将数据点分配到最近的重心中,并基于分配更新重心,直到簇不再变化为止。根据初始聚类质心的位置,结果可能不同。
实现K-Means聚类算法
下面我们将分步骤讲解如何用Python实现K-Means聚类算法。
步骤1. 导入必要的库
首先,我们需要先导入需要使用的库:numpy、pandas和matplotlib。需要用到numpy中的数组和算法、pandas中的数据提取以及matplotlib提供了绘图工具。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
步骤2. 加载和处理数据
在本示例中,我们将使用一个包含1000个随机分布的二维点的数据集。
X = np.random.rand(1000, 2)
步骤3. 设置聚类数量k
在k-means聚类算法中,聚类板块的数量是必须设置的。在本示例中,我们将选择聚类数量为3。
k = 3
步骤4. 随机生成k个质心
在算法的开始,需要随机生成与聚类数量相等的质心点。这些质心点将用于计算每个数据点与其最近的质心点之间的距离。随机生成较好的质心坐标限制为数据的最小值和最大值之间。
centers = np.random.uniform(low=X.min(), high=X.max(), size=(k, X.shape[1]))
步骤5. 计算每个数据点与质心之间的距离
在k-means算法中,需要计算每个数据点与质心之间的距离。这个距离将用于将数据点分配到其最近的质心。
使用欧氏距离公式计算每个数据点和每个质心之间的距离。
# 计算每个数据点和每个质心之间的距离
distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
步骤6. 分配每个数据点到距离最近的质心
在k-means算法中,需要分配每个数据点到其最近的质心。我们可以使用np.argmin函数找到每行中的最小值以及该最小值的索引,从而分配每个数据点到最近的质心。
# 分配每个数据点到距离最近的质心
labels = np.argmin(distances, axis=0)
步骤7. 更新质心的位置
在k-means算法中,需要更新质心的位置。新的质心位置是每个簇内所有数据点的均值。
# 计算每个簇的均值并更新质点
for i in range(k):
centers[i, :] = np.mean(X[labels == i, :], axis=0)
步骤8. 重复以上步骤,直到簇不再变化为止
k-means算法是一个迭代过程,需要重复以上步骤直到簇不再变化为止。
while True:
# 计算每个数据点和每个质心之间的距离
distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
# 分配每个数据点到距离最近的质心
new_labels = np.argmin(distances, axis=0)
# 如果新标签等于旧标签,则停止
if np.all(new_labels == labels):
break
# 更新标签
labels = new_labels
# 计算每个簇的均值并更新质点
for i in range(k):
centers[i, :] = np.mean(X[labels == i, :], axis=0)
步骤9. 数据可视化
最后,我们用数据可视化的方式检查聚类结果。
# 绘制数据集
plt.scatter(X[:, 0], X[:, 1], s=10)
# 绘制聚类的簇心
for i in range(k):
plt.scatter(centers[i, 0], centers[i, 1], marker='x', s=100, linewidths=2)
plt.show()
至此,我们已经成功地用Python实现了K-Means聚类算法!
示例1
我们使用Iris数据集演示了如何在Python中使用K-Means算法进行聚类。
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
iris = load_iris()
k = 3
kmeans = KMeans(n_clusters=k)
kmeans.fit(iris.data)
# 绘制数据集
plt.scatter(iris.data[:, 0], iris.data[:, 1], c=kmeans.labels_)
# 绘制聚类的簇心
centers = kmeans.cluster_centers_
for i in range(k):
plt.scatter(centers[i, 0], centers[i, 1], marker='x', s=100, linewidths=2)
plt.show()
示例2
下面的示例展示如何使用K-Means算法在黑白图片上提取主要颜色。
import urllib.request
import cv2
url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Emperor_Penguin_Manchot_empereur.jpg/220px-Emperor_Penguin_Manchot_empereur.jpg'
urllib.request.urlretrieve(url, 'penguin.jpg')
img = cv2.imread('penguin.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (500, 500))
# Reshape the image to 2D array of pixels
X = img.reshape((-1, 3))
k = 5
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)
# Plot the compressed image
compressed_img = kmeans.cluster_centers_[kmeans.labels_]
compressed_img = compressed_img.reshape(img.shape)
plt.imshow(compressed_img)
plt.show()
在这个示例中,我们加载了一张黑白企鹅图片,调整图片的大小并将其转换为2D的像素数组。然后,我们使用K-Means算法从图像中提取出主要颜色。最后,我们将压缩后的图像可视化,以便查看提取出的主要颜色。
以上就是“Python实现K-Means聚类算法”的完整攻略,希望对大家有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现k-means聚类算法 - Python技术站