24小时热门版块排行榜    

CyRhmU.jpeg
查看: 637  |  回复: 2

dee爱学习

新虫 (初入文坛)

[交流] k-means聚类已有1人参与

一个对64*5的矩阵,怎么运用matlab进行聚类,聚类只抽取原矩阵的其中三列数据,另外两列数据随聚类结果一起输出。原程序如下:
CODE:
clear
clc
load('data.mat');
m=input('请输入样本矩阵行数: ');
n=input('请输入样本矩阵列数: ');
%disp描述数据  %data数据
disp(load('data.mat'));     
%描述数据
data1=data(:,1);
data2=data(:,2);
data3=data(:,3);
%画出data数组中坐标点的情况
scatter3(data1,data2,data3);   
counter=0;
%确定聚类数目的输入约束
n=input('请输入聚类数目:');
%确定聚类数目的合理性
while n>m
disp('您输入的聚类数目过大,请输入正确的k值:');
n=input('请输入聚类数目');
end
if n==1
disp('聚类数目不能为1,请输入正确的k值:');
%确定正确的聚类数目
n=input('请输入聚类数目');
end
[m,n]=size(data);
%pattern扩大了原矩阵的维度
pattern=zeros(m,n+1);   
%初始化聚类中心  
center=zeros(n,n);
%pattern里所有行,第1列至第n列=data所有数据,第4列为0
pattern(:,1:n)=data(:,:);

%开始循环

for x=1:n
    center(x,:)=data(randi(m,1),:);%第一次随机产生聚类中心
end
while 1
distance=zeros(1,n);
num=zeros(1,n);
new_center=zeros(n,n);
for x=1:m
    for y=1:n
    distance(y)=norm(data(x,:)-center(y,:));%计算到每个类的距离
    end
    [~, temp]=min(distance);%求最小的距离
    pattern(x,n+1)=temp;         
end
k=0;
for y=1:n
    for x=1:m
        if pattern(x,n+1)==y
           new_center(y,:)=new_center(y,:)+pattern(x,1:n);
           num(y)=num(y)+1;
        end
    end
    new_center(y,:)=new_center(y,:)/num(y);
    if norm(new_center(y,:)-center(y,:))<0.1
        k=k+1;
    end
end
if k==n
     break;
else
     center=new_center;
end
end
[m, n]=size(pattern);


%最后显示聚类后的数据
figure ;hold on
view(3)
for i=1:m
    if pattern(i,n)==1
         plot(pattern(i,1),pattern(i,2),'r*');
         plot(center(1,1),center(1,2),'ko');
    elseif pattern(i,n)==2
         plot(pattern(i,1),pattern(i,2),'g*');
         plot(center(2,1),center(2,2),'ko');
    else
         plot(pattern(i,1),pattern(i,2),'m*');
         plot(center(3,1),center(3,2),'ko');
    end
end

grid on;
c1=zeros(m,n-1);
c2=zeros(m,n-1);
c3=zeros(m,n-1);
for i=1:m
    if pattern(i,n)==1
    c1(i,:)=pattern(i,1:3);
    elseif pattern(i,n)==2
    c2(i,:)=pattern(i,1:3);
    else
    c3(i,:)=pattern(i,1:3);
    end
end
%删除零行
c1(all(c1==0,2),:)=[];
c2(all(c2==0,2),:)=[];
c3(all(c3==0,2),:)=[];

[ Last edited by jjdg on 2018-12-11 at 17:35 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dee爱学习

新虫 (初入文坛)

1        644        255        28        0.516000000000000
2        57        339        28        0.398000000000000
3        7        275        28        0.0460000000000000
4        60        339        29        0.192000000000000
5        45        339        28        0.292000000000000
6        578        765        27        0.681000000000000
7        1032        425        28        0.926000000000000
8        1409        185        27        0.894000000000000
9        55        185        27        0.412000000000000
10        80        169        27        0.408000000000000
11        1134        210        27        0.799000000000000
12        299        211        27        0.483000000000000
13        651        375        27        0.500000000000000
14        461        165        26        0.488000000000000
15        374        425        27        0.493000000000000
16        395        495        27        0.495000000000000
17        292        995        27        0.493000000000000
18        15        595        27        0.0940000000000000
19        3        595        26        0.0390000000000000
20        2        795        26        0.0380000000000000
21        1442        795        26        0.990000000000000
22        1387        425        26        0.981000000000000
23        969        495        26        0.842000000000000
24        871        495        26        0.901000000000000
25        769        495        25        0.823000000000000
26        687        595        25        0.810000000000000
27        248        375        25        0.487000000000000
28        107        375        25        0.467000000000000
29        55        375        24        0.198000000000000
30        120        85        24        0.400000000000000
31        60        65        24        0.0730000000000000
32        24        85        24        0.0610000000000000
33        121        125        24        0.264000000000000
34        116        295        24        0.435000000000000
35        61        295        24        0.154000000000000
36        61        195        24        0.100000000000000
37        83        195        23        0.392000000000000
38        2        195        24        0.0240000000000000
39        1        85        23        0.0160000000000000
40        247        165        23        0.481000000000000
41        61        295        24        0.351000000000000
42        1        375        24        0.0210000000000000
43        2        42        25        0.0130000000000000
44        4        42        25        0.0190000000000000
45        1        65        25        0.0100000000000000
46        47        18        25        0.0920000000000000
47        47        255        25        0.199000000000000
48        35        185        25        0.377000000000000
49        52        185        25        0.126000000000000
50        55        255        24        0.411000000000000
51        47        339        24        0.406000000000000
52        123        275        24        0.435000000000000
53        632        495        24        0.663000000000000
54        43        106        23        0.0980000000000000
55        2        106        23        0.0210000000000000
56        1        106        23        0.0170000000000000
57        11        106        23        0.0330000000000000
58        31        495        22        0.116000000000000
59        9        695        23        0.0900000000000000
60        7        21        23        0.0180000000000000
61        7        255        23        0.0410000000000000
62        3        339        23        0.0320000000000000
63        13        339        23        0.0840000000000000
2楼2018-12-10 21:53:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yinhefeng

木虫 (正式写手)

努力拼搏
3楼2018-12-17 23:21:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 dee爱学习 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见