凝聚点动态聚类算法实现
EmilMatthew (EmilMatthew@126.com)
[ 类别 ]统计分析 , 算法实现
[推荐指数]★★★
[ 摘要 ]本文主要介绍了凝聚点动态聚类算法的实现过程,并分析了其较模糊聚类分析在处理大数据量分类时的一些优点。
[ 关键词 ]凝聚点, 聚类
[Classify] Statistics Analysis , Algorithm Implementation
[ Level ] ★★★
[Abstract] This article mainly introduces the dynamic clustering algorithm based on the condensation points , and also compares its effects with the fuzzy clustering method when encountered with large data sets problem.
[Key Words] Condensation Points , Clustering Method
[0引言]
对于多指标的数据分类问题,有许多种行之有效的分类方法,其中,以基于统计分析的分类方法和基于模糊集理论的模糊聚类分析[1]最为著名。经过实践表明,模糊聚类分析在应对大数据量(需分类个体>100)分类情况时,若分类指标过小,则会呈现出大类包含元素过多,而小类包含过少元素的不利局面,这样的分类情况,对于想从大数据量中挑出迥异数据(有可能是无效的测量数据)的情况是有利的,但是不利于需要切实有效分成若干类的正常分类要求。而统计分类方法中有一种凝聚点分类方法,不仅简单易行,而且分类效果好,可以根据指定的类别个数将数据进行合理的分类,如文本的动态分类等(参[3])。
[1凝聚点聚类算法的描述]
凝聚点聚类算法,仍是一个基于“距离”,并在相应的维度空间上对数据进行分类的算法,此处的“动态”特性指:在聚类的过程中,某已知类别的聚类中心在聚类过程中不断进行重新计算,逐步扩大聚类半径,直至聚类完毕。
算法:凝聚点分类算法
[2凝聚点聚类算法的实现(Matlab版)]
关于本算法的实现过程中,有以下几点值得注意:
2.1对于初始凝聚点的选择,这里采用的是找到n维空间中距离空间距原点最近点和最远点作为两个类的凝聚点,然后在这两点之间作线性插值得到其余类的临时的中间点,再找出实际各点中离临时中间点最近的点作为其余类的起始凝聚点。显然,你完全可以根据自己所面对的实际问题中数据的特性以及分类的要求,制定合理的分类策略。这里的处理方法只是为了使程序更具有通用性。
2.2 程序中重要的数据:
2.2.1 )pationGroupLen记录了各分组内的元素的个数。
2.2.2 )indentifyArr则记录各组中所含元素到应的下标。
分类号由小到大,表示与距所在空间原点的距离由近到远。
2.3 这里的距离计算,采用了Eluid距离,当然,还有其它的距离计算方式可以选择,参[1].
2. 4 显然,在一次聚类过程中,各类聚集新元素的次序是对聚类结果有影响的。实际问题中可以采取相应的策略,如对于生病者本着从重而不从轻的原则,从较坏的情况开始聚类。这里为了适应程序通用性,采用的策略是从序号较小类到序号较大类聚类顺序。
2.5算法源程序:
%--0.Data Declaration--%
dataArrRow=6;
dataArrCol=4; %attribute num
attributeNum=dataArrCol;
dataNum=dataArrRow;
pationGroupNum=3;
maxLen=1000;
indentifyArr=zeros(pationGroupNum,maxLen);
pationGroupLen=zeros(pationGroupNum);
clusterCenter=zeros(pationGroupNum,attributeNum);
minPoint=zeros(1,attributeNum);
maxPoint=zeros(1,attributeNum);
tmpPoint=zeros(1,attributeNum);
minDis=0;maxDis=0;
minIndex=0;maxIndex=0;
labelArr=zeros(dataNum);
currentClusterRadius=0;
clusterStep=0.05;
clusteredEle=0;
%--1.Normalize the read in data--%
for j=1:dataArrCol
sum = 0;
minVal = dataArr(1, j);
maxVal = dataArr(1, j);
for i = 1 :dataArrRow
sum = sum + dataArr(i, j);
if minVal > dataArr(i, j)
minVal = dataArr(i, j);
elseif maxVal < dataArr(i, j)
maxVal = dataArr(i, j);
end
end
avg = sum / dataArrRow;
s = 0;
for i = 1 : dataArrRow
s = s + (dataArr(i, j) - avg) ^ 2;
end
s = sqrt(s / dataArrRow);
for i = 1 :dataArrRow
dataArr(i, j) = (dataArr(i, j) - avg) / s;
end
minVal = dataArr(1, j);
maxVal = dataArr(1, j);
for i = 1 : dataArrRow
if minVal > dataArr(i, j)
minVal = dataArr(i, j);
elseif maxVal < dataArr(i, j)
maxVal = dataArr(i, j);
end
end
for i = 1 :dataArrRow
dataArr(i, j) = (dataArr(i, j) - minVal) / (maxVal - minVal);
end
end
%--2.Init: Cal For Clustering Center--%
%--2.1 find min and max point out
minPoint=dataArr(1,:);
maxPoint=dataArr(1,:);
minDis=0;
for j=1:attributeNum
minDis=minDis+minPoint(j)^2; %Using Eluid Distance
end
minDis=sqrt(minDis);
maxDis=minDis;
minIndex=1;maxIndex=1;
for i=2:dataNum
tmpDis=0;
for j=1:attributeNum
tmpDis=tmpDis+dataArr(i,j)^2; %Using Eluid Distance
end
tmpDis=sqrt(tmpDis);
if(tmpDis<minDis)
minPoint=dataArr(i,:);
minDis=tmpDis;
minIndex=i;
end
if(tmpDis>maxDis)
maxPoint=dataArr(i,:);
maxDis=tmpDis;
maxIndex=i;
end
end
indentifyArr(1,1)=minIndex;
indentifyArr(pationGroupNum,1)=maxIndex;
labelArr(minIndex)=1;labelArr(maxIndex)=1;
pationGroupLen(1)=1 ;pationGroupLen(pationGroupNum)=1;
%- -2.2In this part ,you have many kinds of choice to determine the init cluster center,
% Here ,I use a very normal solution:linear interplotation.
clusterCenter(1,:)=minPoint;
clusterCenter(pationGroupNum,:)=maxPoint;
%Linear Interplotation
for i=2:pationGroupNum-1
clusterCenter(i,:)=minPoint+(maxPoint-minPoint)*((i-1)/(pationGroupNum-1));
end
%find the mid points.
clusteredEle=2;
for k=2:pationGroupNum-1
minDis=10000;
minIndex=-1;
for i=1:dataNum
if(labelArr(i)==0)
tmpDis=0;
for j=1:attributeNum
tmpDis=tmpDis+(dataArr(i,j)-clusterCenter(k,j))^2; %Using Eluid Distance
end
tmpDis=sqrt(tmpDis);
if(tmpDis<minDis)
minIndex=i;
minDis=tmpDis;
end
end
end
if(minIndex~=-1)
indentifyArr(k,1)=minIndex;
labelArr(minIndex)=1;
pationGroupLen(k)=1;
clusteredEle=clusteredEle+1;
clusterCenter(k,:)=dataArr(minIndex,:);
end
end
%--3.Core:Main Part for Clustering--%
currentClusterRadius=0.01;
clusterStep=0.005;
while(clusteredEle<dataNum)%assert here
for k=1:pationGroupNum
for i=1:dataNum
if(labelArr(i)==0)
tmpDis=0;
for j=1:attributeNum
tmpDis=tmpDis+(dataArr(i,j)-clusterCenter(k,j))^2; %Using Eluid Distance
end
tmpDis=sqrt(tmpDis);
if(tmpDis<=currentClusterRadius)
labelArr(i)=1;
pationGroupLen(k)=pationGroupLen(k)+1;
indentifyArr(k,pationGroupLen(k))=i;
clusteredEle=clusteredEle+1;
end
end
end
end
%Recal Cluster Center
for k=1:pationGroupNum
if(pationGroupLen(k)~=0)
tmpPoint=zeros(1,attributeNum);
for j=1:pationGroupLen(k)
tmpPoint=tmpPoint+dataArr(indentifyArr(k,j),:);
end
tmpPoint=tmpPoint/pationGroupLen(k);
clusterCenter(k,:)=tmpPoint;
end
end
currentClusterRadius=currentClusterRadius+clusterStep;
end
2.5算法测试:
采用了三组数据对算法效果进行测试,显示出本算法较好的分类能力。
下面给出第二组测试数据(334*2)分类后的聚类效果图:
聚类效果图(+表示第一类,*表示第二类,o表示第三类)
[3后继工作]
各类之间的相交区域,较难以区分,仍有较大的改进空间。如何通过算法,选择合理的起始聚类中心,以达到分类效果真实的反映了实际情况,亦有不少的挑战。(人工神经网络……)
[参考文献与网站]
[1] 模糊聚类分析的实现, http://blog.csdn.net/emilmatthew/archive/2006/06/05/774458.aspx
[2] 王式安,数理统计,北京理工大学出版社,1999.
[3] 郑小慎等,基于凝聚点的文本动态聚类分析,微型机与应用,2004,vol 8.
[4] 肖位枢,模糊数学基础及其应用,航空工业出版社,1992
程序完成日: 06/09/18
文章完成日: 06/09/27
[源码下载]
http://emilmatthew.51.net/EmilPapers/0630CondensationCluster/code.rar
若直接点击无法下载(或浏览),请将下载(或浏览)的超链接粘接至浏览器地( 推荐MYIE或GREENBORWSER)址栏后按回车.若不出意外,此时应能下载.
若下载中出现了问题,请参考:
http://blog.csdn.net/emilmatthew/archive/2006/04/08/655612.aspx
附录1
本文算法中进行数据归一化的方法: