什么是k-means分析?【头条@William数据分析,看原版】
想象一下,你有一堆五颜六色的糖果,你想把它们按照颜色分成几堆。k-means分析就是这么一个自动分类的过程。它会根据糖果的颜色特征,把它们分成若干个组,每个组里的糖果颜色都比较相似。
更专业一点说,k-means分析是一种常用的聚类算法,它会将数据集中的数据点分成k个不同的簇。每个簇都有一个中心点,这个中心点就是簇中所有数据点的平均值。算法的目标是使得每个数据点都属于离它最近的中心点对应的簇,从而使得簇内的点尽可能相似,簇间的点尽可能不同。
k-means分析的应用场景
k-means分析在很多领域都有广泛的应用,比如:
- 市场细分: 将客户按照消费习惯、兴趣爱好等特征分成不同的群体,以便针对性地进行营销。
- 图像分割: 将图像分成不同的区域,以便进行目标识别或图像压缩。
- 文本聚类: 将文本文档分成不同的主题,以便进行信息检索或文本分类。
- 异常检测: 通过发现与其他数据点距离较远的点来识别异常数据。
k-means分析的步骤
k-means算法的步骤如下:
- 选择k值: 首先确定要将数据分成多少个簇。这个值的选择会影响最终的聚类结果。
- 随机初始化中心点: 在数据集中随机选择k个点作为初始的簇中心。
- 分配数据点: 计算每个数据点到各个簇中心的距离,将每个数据点分配到距离它最近的簇中。
- 更新中心点: 计算每个簇中所有数据点的平均值,将平均值作为新的簇中心。
- 重复步骤3和4: 重复步骤3和4,直到簇中心不再发生明显变化或达到最大迭代次数。
代码实现:
# k-means聚类分析可视化展示
# author :头条@William数据分析
# date : 2024/9/29
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 生成示例数据
np.random.seed(0)
X = np.random.rand(200, 2)*10
# 进行K-means聚类
k = 5
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
centers = kmeans.cluster_centers_
# 绘制聚类结果
plt.figure(figsize=(12, 6))
# 使用viridis颜色映射
colors = plt.cm.viridis(np.linspace(0, 1, k))
# 绘制原始数据点
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c='gray', s=50)
plt.title('Original Data Points')
# 绘制聚类结果和连线
plt.subplot(1, 2, 2)
for i in range(k):
# 绘制簇的数据点
plt.scatter(X[y_kmeans == i, 0], X[y_kmeans == i, 1], c=colors[i], s=50, label=f'Cluster {i}')
# 绘制簇中心
plt.scatter(centers[i, 0], centers[i, 1], c=colors[i], s=200, alpha=0.75, marker='X', label=f'Center {i}')
# 绘制数据点与簇中心的连线
for point in X[y_kmeans == i]:
plt.plot([point[0], centers[i, 0]], [point[1], centers[i, 1]], color=colors[i], linestyle='-', linewidth=0.5)
plt.title(f'K-means Clustering(k={k})')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.savefig(f'聚类对比(k={k}).jpg')
plt.show()