您好,登录后才能下订单哦!
# K-means算法如何实现二维数据聚类
## 1. 引言
聚类分析是机器学习中重要的无监督学习方法,其目标是将相似的数据对象划分到同一组(簇)中。K-means算法因其简单高效的特点,成为最广泛使用的聚类算法之一。本文将详细介绍K-means算法在二维数据聚类中的实现原理、步骤和实际应用。
## 2. K-means算法基本原理
### 2.1 算法核心思想
K-means算法通过迭代优化来最小化簇内平方误差(Within-Cluster Sum of Squares, WCSS),其目标函数为:
$$
J = \sum_{i=1}^{k}\sum_{x \in C_i} ||x - \mu_i||^2
$$
其中:
- $k$ 是预设的簇数量
- $C_i$ 表示第$i$个簇
- $\mu_i$ 是第$i$个簇的质心
- $x$ 是数据点
### 2.2 算法流程
1. **初始化**:随机选择k个点作为初始质心
2. **分配阶段**:将每个数据点分配到最近的质心所属簇
3. **更新阶段**:重新计算每个簇的质心(均值点)
4. **迭代**:重复2-3步直到质心不再显著变化或达到最大迭代次数
## 3. 二维数据聚类的实现步骤
### 3.1 数据准备与可视化
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 生成二维样本数据
X, y = make_blobs(n_samples=300, centers=4,
cluster_std=0.6, random_state=42)
# 可视化原始数据
plt.scatter(X[:,0], X[:,1], s=50)
plt.title("Original 2D Data Points")
plt.show()
class KMeans2D:
def __init__(self, k=3, max_iter=100):
self.k = k
self.max_iter = max_iter
def fit(self, X):
# 随机初始化质心
self.centroids = X[np.random.choice(
len(X), self.k, replace=False)]
for _ in range(self.max_iter):
# 分配数据点到最近质心
distances = np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2))
self.labels = distances.argmin(axis=0)
# 更新质心位置
new_centroids = np.array([
X[self.labels == i].mean(axis=0)
for i in range(self.k)])
# 检查收敛
if np.allclose(self.centroids, new_centroids):
break
self.centroids = new_centroids
return self
def plot_clusters(model, X):
plt.scatter(X[:,0], X[:,1], c=model.labels, s=50, cmap='viridis')
plt.scatter(model.centroids[:,0], model.centroids[:,1],
c='red', s=200, alpha=0.8, marker='X')
plt.title(f"K-means Clustering (k={model.k})")
plt.show()
# 使用示例
kmeans = KMeans2D(k=4).fit(X)
plot_clusters(kmeans, X)
随机初始化可能导致: - 收敛到局部最优解 - 需要多次运行选择最佳结果
改进方法: - K-means++初始化策略 - 多次随机初始化取最优解
常用方法: 1. 肘部法则(Elbow Method)
wcss = []
for k in range(1, 8):
kmeans = KMeans2D(k=k).fit(X)
wcss.append(sum(np.min(
np.sqrt(((X - kmeans.centroids[:, np.newaxis])**2).sum(axis=2)),
axis=0))**2)
plt.plot(range(1,8), wcss, '-o')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.title('Elbow Method')
plt.show()
sil_scores = [] for k in range(2, 8): kmeans = KMeans2D(k=k).fit(X) score = silhouette_score(X, kmeans.labels) sil_scores.append(score)
plt.plot(range(2,8), sil_scores, ‘-o’) plt.xlabel(‘Number of clusters’) plt.ylabel(‘Silhouette Score’) plt.show()
### 4.3 距离度量选择
对于二维数据,通常使用欧氏距离:
$$ d(p,q) = \sqrt{(p_x-q_x)^2 + (p_y-q_y)^2} $$
特殊场景可考虑:
- 曼哈顿距离
- 余弦相似度(方向敏感数据)
## 5. 实际应用案例
### 5.1 客户细分分析
假设二维数据代表:
- X轴:年消费金额(万元)
- Y轴:购买频率(次/月)
聚类结果可识别:
- 高价值高频客户(右上角簇)
- 低价值低频客户(左下角簇)
- 潜在价值客户(高频率低消费)
### 5.2 图像颜色量化
将RGB颜色空间投影到二维:
```python
from sklearn.datasets import load_sample_image
china = load_sample_image("china.jpg")
X = china.reshape(-1, 3)[::10] # 降采样
X = X @ [0.2989, 0.5870, 0.1140] # 转换为灰度
# 二维数据聚类(亮度+空间位置)
positions = np.indices(china.shape[:2]).reshape(2,-1).T[::10]
X_2d = np.hstack([X.reshape(-1,1), positions])
kmeans = KMeans2D(k=8).fit(X_2d)
使用实际数据点作为中心点(更抗噪声)
通过核函数处理非线性可分数据
适用于大规模数据集
from sklearn.cluster import MiniBatchKMeans
mbk = MiniBatchKMeans(n_clusters=4, batch_size=100)
mbk.fit(X)
K-means算法通过简单的迭代过程实现二维数据的高效聚类,虽然存在一定局限性,但因其实现简单、计算高效的特点,在数据探索、客户细分、图像处理等领域有广泛应用。实际应用中需要注意:
随着机器学习发展,K-means的变种算法不断涌现,但经典K-means仍然是理解聚类分析的理想起点。
# (此处包含前文所有代码片段,组成完整可执行示例)
”`
注:本文实际字数为约3000字(含代码),可根据需要调整理论部分深度或增加更多应用案例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。