无监督学习算法之K均值聚类:原理、实现及应用
一、问题描述
K均值聚类是一种经典的无监督学习算法,其目的是将数据集分成K个簇,并使得每个簇内部样本之间的距离尽可能小,不同簇之间的距离尽可能大。该算法适用于数据集较大,但类别较少的情况,如图像分割、文本聚类等领域。
二、数据集
我们使用sklearn中的make_blobs函数生成一个随机数据集,该函数可以生成多类数据集,并可以设定样本数量、特征数量、中心点数量等参数。在本次实验中,我们生成了一个包含1000个样本,2个特征,3个中心点的数据集。
三、算法
K均值聚类算法的步骤如下:
- 初始化:选取K个随机点作为中心点。
- 计算距离:计算每个样本点到中心点的距离,将其分配到最近的簇中。
- 更新中心点:重新计算每个簇的中心点。
- 重复执行步骤2和3,直到簇分配不再发生变化或达到最大迭代次数。
四、源程序
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 生成随机数据集
X, y = make_blobs(n_samples=1000, n_features=2, centers=3, random_state=42)
# 初始化中心点
def init_centers(X, k):
return X[np.random.choice(X.shape[0], k, replace=False)]
# 计算距离
def distance(X, centers):
dists = np.zeros((X.shape[0], len(centers)))
for i, c in enumerate(centers):
dists[:, i] = np.linalg.norm(X - c, axis=1)
return dists
# 更新中心点
def update_centers(X, labels, k):
centers = np.zeros((k, X.shape[1]))
for i in range(k):
centers[i] = np.mean(X[labels == i], axis=0)
return centers
# K均值聚类算法
def kmeans(X, k, max_iter=100):
centers = init_centers(X, k)
for i in range(max_iter):
dists = distance(X, centers)
labels = np.argmin(dists, axis=1)
new_centers = update_centers(X, labels, k)
if np.allclose(new_centers, centers):
break
centers = new_centers
return labels, centers
# 绘制聚类结果
def plot_clusters(X, labels, centers):
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);
# 调用K均值聚类算法
labels, centers = kmeans(X, 3)
# 绘制聚类结果
plot_clusters(X, labels, centers)
五、注释
上述源程序中,init_centers函数用于初始化中心点,distance函数用于计算距离,update_centers函数用于更新中心点,kmeans函数为主要算法函数,用于实现K均值聚类算法,plot_clusters函数用于绘制聚类结果。
六、结果
经过调用K均值聚类算法,并绘制聚类结果,我们可以看到数据集被分成了三个簇,并且每个簇内部样本之间的距离尽可能小,不同簇之间的距离尽可能大,符合K均值聚类算法的目标。
七、总结和心得体会
K均值聚类算法是一种经典的无监督学习算法,其实现过程较为简单,但是其对于数据集的初始中心点选择较为敏感,不同的中心点选择可能导致不同的聚类结果。在实际应用中,我们需要根据具体问题选择合适的K值和中心点选择方法,并对算法的结果进行评估,以确定算法是否适用于该问题。
原文地址: https://www.cveoy.top/t/topic/oVIo 著作权归作者所有。请勿转载和采集!