首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >matlab实现K均值聚类算法

matlab实现K均值聚类算法

原创
作者头像
用户11823301
发布2025-09-05 21:41:55
发布2025-09-05 21:41:55
21400
代码可运行
举报
运行总次数:0
代码可运行

一、算法原理与步骤

1. 核心思想

K均值聚类(K-Means Clustering)是一种基于距离的无监督学习算法,通过迭代优化将数据集划分为K个簇,使得簇内数据点相似度最大化簇间相似度最小化。其目标是最小化簇内平方误差和(Within-Cluster Sum of Squares, WCSS)。

2. 算法步骤
  1. 初始化质心 随机选择K个数据点作为初始聚类中心,或使用K-Means++优化初始化方法。
  2. 分配数据点 计算每个样本到各质心的距离(通常用欧氏距离),将样本分配到最近质心对应的簇。
  3. 更新质心 重新计算每个簇的质心(簇内所有样本的均值)。
  4. 迭代收敛 重复步骤2-3,直到质心不再变化或达到最大迭代次数。

数学目标函数:

代码语言:javascript
代码运行次数:0
运行
复制
J=i=1∑nk=1∑Krik∥xi−μk∥2

其中,rik 表示样本 xi 是否属于簇 k,μk 为簇k的质心。


二、代码实现(Python)

1. 基础实现(使用NumPy)
代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import matplotlib.pyplot as plt
​
def k_means(X, k, max_iters=100):
    # 随机初始化质心
    centroids = X[np.random.choice(X.shape[0], k, replace=False)]
    
    for _ in range(max_iters):
        # 分配样本到最近质心
        distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)
        labels = np.argmin(distances, axis=1)
        
        # 更新质心
        new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])
        
        # 判断收敛
        if np.all(np.abs(new_centroids - centroids) < 1e-4):
            break
        centroids = new_centroids
    
    return labels, centroids
​
# 生成测试数据
X = np.vstack([np.random.normal(loc, 0.8, (100,2)) for loc in [(2,2), (-2,-2), (2,-2)]])
labels, centroids = k_means(X, k=3)
​
# 可视化
plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis')
plt.scatter(centroids[:,0], centroids[:,1], c='red', marker='x')
plt.title('K-Means Clustering')
plt.show()
2. 使用Scikit-learn库
代码语言:javascript
代码运行次数:0
运行
复制
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
​
# 生成数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6)
​
# 模型训练
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=42)
kmeans.fit(X)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
​
# 可视化
plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis')
plt.scatter(centroids[:,0], centroids[:,1], c='red', s=200, marker='X')
plt.show()

三、优缺点分析

优点
  1. 简单高效:时间复杂度为 O(n⋅k⋅I⋅d),适合大规模数据。
  2. 可解释性强:质心直观反映簇中心位置。
  3. 内存需求低:仅需存储质心和距离矩阵。
缺点
  1. 需预设K值:需通过肘部法、轮廓系数等方法确定最佳簇数。
  2. 对初始值敏感:不同初始质心可能导致不同聚类结果。
  3. 球形簇假设:对非凸或密度不均的簇效果差。
  4. 异常值敏感:异常值会显著影响质心位置。

四、关键优化方法

1.K-Means++初始化 通过概率选择初始质心,提升聚类稳定性:

代码语言:matlab
复制
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10)

2.肘部法确定K值 绘制不同K值对应的WCSS曲线,选择“肘点”:

代码语言:matlab
复制
wcss = [] for k in range(1, 11):     
kmeans = KMeans(n_clusters=k)     
kmeans.fit(X)     
wcss.append(kmeans.inertia_) 
plt.plot(range(1,11), wcss, marker='o') 
plt.xlabel('Number of clusters') 
plt.ylabel('WCSS')

3.轮廓系数评估 衡量簇内紧密度和簇间分离度:

代码语言:matlab
复制
from sklearn.metrics import silhouette_score score = silhouette_score(X, labels)


五、应用场景

场景

示例

说明

客户分群

零售业客户消费行为分析

按购买力划分客户群体

图像分割

医学影像分析

分离不同组织区域

异常检测

工业设备传感器数据监控

识别设备异常状态

推荐系统

用户兴趣聚类

为相似用户推荐内容


六、与其他算法对比

算法

优点

缺点

适用场景

K-Means

计算快,适合大规模数据

需预设K值,对噪声敏感

球形簇、数值型数据

层次聚类

无需预设K值,可视化强

计算复杂度高(O(n²))

小数据集、树状结构分析

DBSCAN

处理噪声和任意形状簇

难以确定密度参数

复杂分布数据


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、算法原理与步骤
    • 1. 核心思想
    • 2. 算法步骤
  • 二、代码实现(Python)
    • 1. 基础实现(使用NumPy)
    • 2. 使用Scikit-learn库
  • 三、优缺点分析
    • 优点
    • 缺点
  • 四、关键优化方法
  • 五、应用场景
  • 六、与其他算法对比
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档