K-means聚类原理及代码实现

1.K-均值聚类法的概述
K-均值聚类就是在给定了一组样本(x1, x2, …xn) (xi, i = 1, 2, … n均是向量) 之后,假设要将其聚为 m(<n) 类,可以按照如下的步骤实现:
Step 1: 从 (x1, x2, …xn) 中随机选择 m 个向量(y1,y2,…ym) 作为初始的聚类中心(可以随意指定,不在n个向量中选择也可以);
Step 2: 计算 (x1, x2, …xn) 到这 m 个聚类中心的距离(严格来说为 2阶范数);
Step 3: 对于每一个 xi(i = 1,2,…n)比较其到 (y1,y2,…ym) 距离,找出其中的最小值,若到 yj 的距离最小,则将 xi 归为第j类;
Step 4: m 类分好之后, 计算每一类的均值向量作为每一类新的聚类中心;
Step 5: 比较新的聚类中心与老的聚类中心之间的距离,若大于设定的阈值,则跳到 Step2; 否则输出分类结果和聚类中心,算法结束。

% 利用K-均值聚类的原理,实现对一组数据的分类。这里以一组二维的点为例。
N = 40; % 点的个数
X = 10*rand(1,N);
Y = 10*rand(1,N); % 随机生成一组横纵坐标取值均在(0,10)之间的点,X Y 分别代表	横纵坐标
plot(X, Y, 'r*'); % 绘出原始的数据点
xlabel('X');
ylabel('Y');
title('聚类之前的数据点');
n = 2; %将所有的数据点分为两类
m = 1; %迭代次数
eps = 1e-7; % 迭代结束的阈值
u1 = [X(1),Y(1)]; %初始化第一个聚类中心
u2 = [X(2),Y(2)]; %初始化第二个聚类中心
U1 = zeros(2,100);
U2 = zeros(2,100); %U1,U2 用于存放各次迭代两个聚类中心的横纵坐标
U1(:,2) = u1;
U2(:,2) = u2;
D = zeros(2,N); %初始化数据点与聚类中心的距离
while(abs(U1(1,m) - U1(1,m+1)) > eps || abs(U1(2,m) - U1(2,m+1) > eps || abs(U2(1,m) - U2(1,m+1)) > eps || abs(U2(2,m) - U2(2,m+1)) > eps))
m = m +1;
% 计算所有点到两个聚类中心的距离
for i = 1 : N
    D(1,i) = sqrt((X(i) - U1(1,m))^2 + (Y(i) - U1(2,m))^2);
end
for i = 1 : N
    D(2,i) = sqrt((X(i) - U2(1,m))^2 + (Y(i) - U2(2,m))^2);
end
A = zeros(2,N); % A用于存放第一类的数据点
B = zeros(2,N); % B用于存放第二类的数据点
for k = 1: N
    [MIN,index] = min(D(:,k)); 
    if index == 1  % 点属于第一个聚类中心
        A(1,k) = X(k);
        A(2,k) = Y(k);
    else           % 点属于第二个聚类中心
        B(1,k) = X(k);
        B(2,k) = Y(k);
    end
end
indexA = find(A(1,:) ~= 0); % 找出第一类中的点
indexB = find(B(1,:) ~= 0); % 找出第二类中的点
U1(1,m+1) = mean(A(1,indexA));
U1(2,m+1) = mean(A(2,indexA));
U2(1,m+1) = mean(B(1,indexB));
U2(2,m+1) = mean(B(2,indexB)); % 更新两个聚类中心
end
figure;
plot(A(1,indexA) , A(2,indexA), '*b'); % 作出第一类点的图形
hold on
plot(B(1,indexB) , B(2,indexB), 'oy'); %作出第二类点的图形
hold on
centerx = [U1(1,m) U2(1,m)];
centery = [U1(2,m) U2(2,m)];
plot(centerx , centery, '+g'); % 画出两个聚类中心点
xlabel('X');
ylabel('Y');
title('聚类之后的数据点');
disp(['迭代的次数为:',num2str(m)]);

聚类的结果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

利用Python的sklearn里的tsne进行降维:
只截取了前100个数据进行分析
给出了每个类别的数目,以及降维后的数据可视化。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对fer2013+数据集共25060个特征进行聚类并tsne降维可视化后:
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dataloading...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值