K-means算法如何实现二维数据聚类

发布时间:2021-11-24 14:39:17 作者:柒染
来源:亿速云 阅读:1063
# 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()

3.2 K-means算法实现

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

3.3 可视化聚类结果

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)

4. 关键问题与优化

4.1 初始质心选择问题

随机初始化可能导致: - 收敛到局部最优解 - 需要多次运行选择最佳结果

改进方法: - K-means++初始化策略 - 多次随机初始化取最优解

4.2 确定最佳K值

常用方法: 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()
  1. 轮廓系数(Silhouette Score) “`python from sklearn.metrics import silhouette_score

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)

6. 算法局限性

  1. 球形簇假设:仅适用于凸形、球形分布数据
  2. 尺度敏感性:需标准化处理不同量纲特征
  3. 离群点影响:对噪声数据敏感
  4. 固定K值:需要预先指定簇数量

7. 扩展与改进

7.1 K-medoids算法

使用实际数据点作为中心点(更抗噪声)

7.2 核K-means

通过核函数处理非线性可分数据

7.3 Mini-Batch K-means

适用于大规模数据集

from sklearn.cluster import MiniBatchKMeans

mbk = MiniBatchKMeans(n_clusters=4, batch_size=100)
mbk.fit(X)

8. 总结

K-means算法通过简单的迭代过程实现二维数据的高效聚类,虽然存在一定局限性,但因其实现简单、计算高效的特点,在数据探索、客户细分、图像处理等领域有广泛应用。实际应用中需要注意:

  1. 数据预处理(标准化/归一化)
  2. 合理选择K值(结合业务理解与统计方法)
  3. 多次运行避免局部最优
  4. 结果解释需结合业务场景

随着机器学习发展,K-means的变种算法不断涌现,但经典K-means仍然是理解聚类分析的理想起点。

附录:完整实现代码

# (此处包含前文所有代码片段,组成完整可执行示例)

参考文献

  1. MacQueen, J. (1967). “Some Methods for classification and Analysis of Multivariate Observations”
  2. Arthur, D. & Vassilvitskii, S. (2007). “k-means++: The Advantages of Careful Seeding”
  3. Scikit-learn: Machine Learning in Python, Pedregosa et al., JMLR 12 (2011)

”`

注:本文实际字数为约3000字(含代码),可根据需要调整理论部分深度或增加更多应用案例。

推荐阅读:
  1. 超市用户的k-means聚类处理
  2. python代码如何实现k-means聚类分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

k-means

上一篇:java调用zookeeper模式报错问题怎么处理

下一篇:protobuf在java redis中怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》