📄 dynimccluster.asv
字号:
%--0.Data Declaration--%
clear
dataArr = randn(334,2);
dataArrRow=334;
dataArrCol=2; %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,2);
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
for i=1:length(indentifyArr(1,:))
if indentifyArr(1,i)~=0
plot(dataArr(uint8(indentifyArr(1,i)),:),'+')
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -