k均值聚类

Posted WHLOOK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k均值聚类相关的知识,希望对你有一定的参考价值。

1.k均值聚类是聚类算法,不是分类算法

k均值聚类就是利用欧氏距离的度量将距离相近的样本分为k类

2.算法思想

a. 假设有m个样本,{[x1,y1],[x2,y2],,,,[xm,ym]},首先随机选择k个样本作为聚类的质心(要分成k类)

b. 然后对于每个样本,计算它到每个质心的距离,将它归类于距离最小的那个质心

c. 接着对初步分类的k个类别重新计算该类的质心,也就是对每个类别的样本坐标求平均

d. 重复 b 步和 c 步直到质心的坐标不再改变或者变化小于设定值

3.Matlab程序示例

%生成原始数据
clear;
x=zeros(100,2);
x(1:30,1:2)=randn(30,2);
x(31:70,1:2)=5+randn(40,2);
x(71:100,1:2)=10+randn(30,2);

plot(x(:,1),x(:,2),\'g*\') % 显示原始样本数据图
hold on;

k = 3; %聚类数
[m,n] = size(x); %获得样本数和维度
pre_centroids = x(randi(100,k,1),:); %初始的随机质心

plot(pre_centroids(:,1),pre_centroids(:,2),\'bo\'); %画出初始质心

figure
hold on;
plot(x(:,1),x(:,2),\'g*\')

sum_ = zeros(k,n); % 用来储存每个类别样本的坐标累加和
num_ = zeros(k,1); % 用来记录每个类别中的样本个数

while 1
    for i=1:m
        dis = [];
        %对于每个样本,计算它到每个质心的距离
        for j = 1:k
            dis(j) = sum((x(i,:)-pre_centroids(j,:)).^2);
        end

        [min_dis,min_idx] = min(dis); % 找到距离最小的那个质心的索引
        sum_(min_idx,:) = sum_(min_idx,:)+ x(i,:);%累加每个类的样本的坐标
        num_(min_idx,:) = num_(min_idx,:)+1;%类别中的样本数累加
    end

    for i=1:k
        centroids(i,:) = sum_(i,:)./num_(i,:); %重新计算质心
    end

    if norm(centroids-pre_centroids)<0.001 %退出迭代的条件
        break;
    end

    pre_centroids = centroids; %更新质心
end

plot(pre_centroids(:,1),pre_centroids(:,2),\'b+\'); %输出聚类后的图

4.实验结果

初始的随机质心:

聚类后的质心:

以上是关于k均值聚类的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战--k-均值聚类

K-均值聚类

使用 sklearn.cluster 进行 K 均值聚类

使用 sklearn.cluster 进行 K 均值聚类

我应该将行业分类代码视为 K 均值聚类中的双重数据类型吗?

数字数据集上的K-均值聚类