24小时热门版块排行榜    

查看: 1700  |  回复: 3

beizainan

新虫 (正式写手)

[求助] kmeans 聚类编程

我的样本是160*10矩阵,想通过kmeans方法进行聚类,因为没有接触过编程,一直运行不出来。我的编程如下,结果得到的图只有八个点,不知道该如何修改,望高手指点。
[Idx,C,sumD,D]=kmeans(data,8);
[COEFF, SCORE] = pca(C);
data_pca=SCORE(:,1:3);
[u re]=kmeans(data_pca,8);
[m n]=size(re);

%最后显示聚类后的数据
figure;
hold on;
for i=1:m
    if re(i,3)==1   
         plot3(re(i,1),re(i,2),re(i,3),'ro');
    elseif re(i,3)==2
         plot3(re(i,1),re(i,2),re(i,3),'go');
    else
         plot3(re(i,1),re(i,2),re(i,3),'bo');
    end
end
plot3(u(:,1),u(:,2),u(:,3),'kx','MarkerSize',14,'LineWidth',4);
grid on;

figure;
hold on;
for i=1:m
    if re(i,3)==1   
         plot3(re(i,1),re(i,2),re(i,3),'ro');
    elseif re(i,3)==2
         plot3(re(i,1),re(i,2),re(i,3)'go');
    else
         plot3(re(i,1),re(i,2),re(i,3),'bo');
    end
end
plot3(u(:,1),u(:,2),u(:,3),'kx','MarkerSize',14,'LineWidth',4);
grid on;

%N是数据一共分多少类
%data是输入的不带分类标号的数据
%u是每一类的中心
%re是返回的带分类标号的数据
function [u re]=kmeans(data,8)   
    [m n]=size(data);   %m是数据个数,n是数据维数
    ma=zeros(n);        %每一维最大的数
    mi=zeros(n);        %每一维最小的数
    u=zeros(N,n);       %随机初始化,最终迭代到每一类的中心位置
    for i=1:n
       ma(i)=max(data(:,i));    %每一维最大的数
       mi(i)=min(data(:,i));    %每一维最小的数
       for j=1:N
            u(j,i)=ma(i)+(mi(i)-ma(i))*rand();  %随机初始化,不过还是在每一维[min max]中初始化好些
       end      
    end
   
    while 1
        pre_u=u;            %上一次求得的中心位置
        for i=1:N
            tmp{i}=[];      % 公式一中的x(i)-uj,为公式一实现做准备
            for j=1:m
                tmp{i}=[tmp{i};data(j,-u(i,];
            end
        end
        
        quan=zeros(m,N);
        for i=1:m        %公式一的实现
            c=[];
            for j=1:N
                c=[c norm(tmp{j}(i,)];
            end
            [junk index]=min(c);
            quan(i,index)=1;           
        end
        
        for i=1:N            %公式二的实现
           for j=1:n
                u(i,j)=sum(quan(:,i).*data(:,j))/sum(quan(:,i));
           end           
        end
        
        if norm(pre_u-u)<0.1  %不断迭代直到位置不再变化
            break;
        end
    end
   
    re=[];
    for i=1:m
        tmp=[];
        for j=1:N
            tmp=[tmp norm(data(i,-u(j,)];
        end
        [junk index]=min(tmp);
        re=[re;data(i, index];
    end
   
end
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cxning1990

专家顾问 (正式写手)

在R中均值聚类实现包比较多,这么多代码也没注释。。。无从下手,本人做的关于聚类算法和函数笔记拿来,仅供参考。
-------------------------------------------------------------------------------------------------------------------------------------------------
实验数据地址:http://www.uni-koeln.de/themen/statistik/data/cluster/birth.data
一、介绍
这里介绍的聚类方法有:
K-均值聚类;K-中心点聚类;密度聚类;系谱聚类;期望最大值聚类;层次聚类/系统聚类。
        1. K-均值聚类
以随机选取的k(预设类别数)个样本作为起始中心,将其余样本归入相似度最高中心点所在簇,再确立当前簇中样本坐标的均值为新的中心点,依次循环迭代下去,直到所有样本所属类别不再变动。
        2. K-中心点聚类
在原理上与均值相近,差异在于选择各类别中心点时不取样本均值点,而在类别内选取到其余样本距离之和最小的样本为中心。
R中有pam()和pamk()函数供使用,前者是PAM算法,后者是PAM改进,在处理较大的数据集时,性能优于前者。
        3. 系谱聚类
特点在于不先设定类别数K,其迭代过程仅将距离最近的两个样本/簇聚为一类。
个人观点:系谱聚类的迭代次数较多,聚类的分组越复杂,具体的聚类取决于个人的选取。
        4. 密度聚类
基于密度来聚类,可以在具有噪声的空间数据库中发现任意形状的簇。
需要的参数:半径E与密度阈值MinPts。参数的选取有用户定义,而取值较为敏感,且参数的选取无规律可循。
主要对象:核心对象、密度可达。
思想:将簇看做是数据空间中被低密度区域分割开的“稠密区域”,即密度相连样本点的最大集合。
        5. 期望最大化聚类(EM)
思想:
将数据集看做一个含有隐性变量的概率模型,以实现模型的最优化为目的。即获取与数据本身性质最为契合的聚类方式,通过“反复估计”模型参数找出最优解,同时给出相应的最优类别数k。
cluster---聚类/簇;centers----中心点坐标;totss---总平方和;tot.withinss---组内平方和;betweenss---组间平方和;
6.系统聚类/层次聚类
有关系统聚类:http://www.tuicool.com/articles/eMRvE3
有关热图绘制: http://www.360doc.com/content/14/1103/10/17553313_422108323.shtml
-------------------------------------——----------------------------------------——----------------------------------------------——----------------
二、实践操作
1、k-means聚类
函数k-means(),预设分类类别数,评估分类最佳标准是聚类组内差距占总平方和的百分比。
语法:
kmeans(x, centers, iter.max = 10, nstart = 1,algorithm = c("Hartigan-Wong", "Lloyd", "Forgy","MacQueen", trace=FALSE)

可获得参数项:
[1] "cluster/聚类结果"      "centers/聚类中心点"      "totss/总平方和"        "withinss/各组内差距平方和"   
[5] "tot.withinss组内差距平方和" "betweenss/组内差距平方和"    "size/聚类分组的各组统计"         "iter"        
[9] "ifault"

2、k-中心点聚类
函数pam(),预设分类类别数,其他参数可默认。
语法:
pam(x, k, diss = inherits(x, "dist", metric = "euclidean",medoids = NULL, stand = FALSE, cluster.only = FALSE,do.swap = TRUE,keep.diss = !diss && !cluster.only && n < 100,keep.data = !diss && !cluster.only,pamonce = FALSE, trace.lev = 0)

可获得参数项:
[1] "medoids/聚类中心点值"    "id.med/聚类分组的各组统计"     "clustering/聚类结果" "objective/聚类中心点的初始值和优化值"  "isolation"
[6] "clusinfo/统计指标:size\max_diss最大距离\av_diss平均距离\diameter直径\separation"   "silinfo/分组类别及指标"    "diss/距离矩阵"       "call/回看函数设置"       "data/回看数据"  

3、系谱聚类
函数hclust(),
语法:
hclust(d, method = "complete", members = NULL)
#method: ward.D, ward.D2,single,complete,average(UPGMA),mcquitty(WPGMA),median(WPGMC),centroid(UPGMC)
plot(x, labels = NULL, hang = 0.1, check = TRUE,axes = TRUE, frame.plot = FALSE, ann = TRUE,main = "Cluster Dendrogram",
sub = NULL, xlab = NULL, ylab = "Height", ...)
函数cutree(),对系谱树进行裁剪,k为类别,h为树高;
cutree(tree, k = NULL, h = NULL)
函数rect.hclust(),在系谱图中将制定的类别分支用方框表示。
rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL,border = 2, cluster = NULL)

» 本帖已获得的红花(最新10朵)

生活,读书,新知
2楼2017-01-12 08:55:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

beizainan

新虫 (正式写手)

送红花一朵
引用回帖:
2楼: Originally posted by cxning1990 at 2017-01-12 08:55:52
在R中均值聚类实现包比较多,这么多代码也没注释。。。无从下手,本人做的关于聚类算法和函数笔记拿来,仅供参考。
------------------------------------------------------------------------------------------ ...

感谢,我好好学习学习
3楼2017-01-13 09:36:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

杨小二要冬眠

新虫 (初入文坛)

请问,做聚类测试时,wine数据总是聚不出三类怎么办

发自小木虫Android客户端
4楼2017-05-10 13:34:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 beizainan 的主题更新
信息提示
请填处理意见