⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dynimccluster.asv

📁 Matlab实现的动态聚类算法
💻 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 + -