| 查看: 1703 | 回复: 3 | ||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | ||
[求助]
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 |
» 猜你喜欢
职称评审没过,求安慰
已经有41人回复
回收溶剂求助
已经有7人回复
硝基苯如何除去
已经有3人回复
A期刊撤稿
已经有4人回复
垃圾破二本职称评审标准
已经有17人回复
投稿Elsevier的Neoplasia杂志,到最后选publishing options时页面空白,不能完成投稿
已经有22人回复
EST投稿状态问题
已经有7人回复
毕业后当辅导员了,天天各种学生超烦
已经有4人回复
求助文献
已经有3人回复
三无产品还有机会吗
已经有6人回复
3楼2017-01-13 09:36:37
|
在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
4楼2017-05-10 13:34:25













-u(i,
回复此楼
送红花一朵

, trace=FALSE) 