基于K-Means的数据聚类matlab
时间: 2025-01-05 08:10:50 浏览: 4
### K-Means 数据聚类 MATLAB 实现
#### 算法概述
K-means 聚类算法旨在将数据集划分成若干个簇,使得同一簇中的对象彼此之间的相似度尽可能高,而不同簇间的对象差异较大。该算法通过迭代过程不断更新各簇中心的位置,直到满足特定条件为止[^1]。
#### 函数定义
MATLAB 提供了一个内置函数 `kmeans` 来执行 k-means 聚类分析。此函数接受输入矩阵 X 和期望的簇数作为参数,并返回每个观测值对应的簇索引以及各个簇的心位置向量 C:
```matlab
[idx, C] = kmeans(X,k);
```
其中:
- idx 表示样本所属类别标签;
- C 则代表最终收敛后的各类别质心坐标;
对于自定义实现版本,则可以按照如下方式编写核心逻辑代码片段:
```matlab
function [centroids, labels] = my_kmeans(data, num_clusters)
% 初始化质心
centroids = data(randperm(size(data, 1), num_clusters), :);
while true
old_centroids = centroids;
% 计算距离并分配最近质心给每一个点
dists = pdist2(centroids, data); %[nClusters,nSamples]
[~,labels]=min(dists,[],1); %[1,nSamples]
% 更新质心
for i=1:num_clusters
mask=(labels==i);
if any(mask)
centroids(i,:)=mean(data(mask,:),1);
end
end
% 如果质心不再变化则停止循环
if isequal(old_centroids, centroids)
break ;
end
end
end
```
上述代码实现了基本的 k-means 迭代流程,在每次迭代过程中重新计算所有样本到当前质心的距离,并据此调整它们所归属的分类;随后依据新的分组情况再次求取平均值得到下一时刻的新质心位置直至前后两次所得结果一致表明已经完成收敛即可结束整个运算过程[^3]。
#### 可视化展示
为了更好地理解聚类的效果,可以通过绘制散点图的方式直观呈现出来。下面给出一段简单的绘图脚本用于显示二维空间内经过 k-means 处理前后的分布状况对比:
```matlab
% 假设有两维特征的数据集 stored in variable 'data'
figure();
subplot(1,2,1);
gscatter(data(:,1), data(:,2)); title('Before Clustering');
% Perform clustering using built-in function or custom implementation here...
[num_samples,dimensions]=size(data);
num_clusters=floor(sqrt(num_samples/2));
[~,idx]=my_kmeans(data,num_clusters);
subplot(1,2,2);
gscatter(data(:,1), data(:,2), idx);title(['After Clustering into ',int2str(num_clusters),' clusters']);
```
这段程序先创建一个新的图形窗口分成两个子区域分别用来放置原始状态下的点阵图像及其经由聚类处理之后形成的图案以便于观察两者间存在的区别之处。
阅读全文