The following version of an ecm algorithm implementation with scilab has been done by Miguel Ayala and Gerd Doeben-Henisch.
//Some common constants
//Conversion of radiants into grade
grad=(2*%pi)/360
//Conversion of radiants into degrees
igrad=360/(2*%pi)
INP = [1 2; 1 3; 2 2; 2 3; 4 4; 4 5; 5 4; 5 5; 6 1; 6 2; 7 1; 7 2]
INP2 = [3 3; 5 3; 3 5; 5 5; 6 9; 8 9; 8 11; 10 9; 11 4; 12 3; 12 6; 14 2; 14 7; 15 6; 16 4]
//************************************************************
// Normalize the input 2D-Input-Vektors
// Take INP as input and generate INP2 as output
function [INP2]=doNorm(INP)
[r,c] = size(INP)
INP2=[]
printf('Length of Input Vector: %d\n',r)
//Looping through the input
for i=1:r
v=[INP(i,1) INP(i,2)]
printf('OLD coordinates: %d %d\n',v(1),v(2))
printf('NORM of vector: %f\n',norm(v))
v=v/norm(v)
printf('NEW coordinates: %f %f\n',v(1),v(2))
INP2(i,1)=v(1)
INP2(i,2)=v(2)
end
endfunction
//************************************************************
// Normalize the input 2D-Input-Vektors with a UNIFORM norm
// Take INP as input and generate INP3 as output
function [INP3]=doNormU(INP)
[r,c] = size(INP)
Maxnorm=0
INP3=[]
printf('Length of Input Vector: %d\n',r)
//Looping through the input to find maximal norm
for i=1:r
v=[INP(i,1) INP(i,2)]
if norm(v) > Maxnorm then Maxnorm=norm(v)
printf('NORM of vector: %f %f\n',norm(v), Maxnorm)
end
end
//Looping through the input to normalize uniformly
for i=1:r
v=[INP(i,1) INP(i,2)]
printf('OLD coordinates: %d %d\n',v(1),v(2))
v=v/Maxnorm
printf('NEW coordinates: %f %f\n',v(1),v(2))
INP3(i,1)=v(1)
INP3(i,2)=v(2)
end
endfunction
//*******************************************************+
// Computes the euclidean distance between two vectors x,y
function [d]=normEuclidean(x,y)
lx=length(x), ly=length(y)
if lx <> ly then error('SIZE of VECTORS DO NOT MATCH'),
else
s=0
for i=1:lx
s=s+abs(x(i)-y(i))^2,
end
d=sqrt(s)/sqrt(lx)
end
endfunction
function [d]=euclideanDistance(x,y)
lx=length(x), ly=length(y)
if lx <> ly then error('SIZE of VECTORS DO NOT MATCH'),
else
s=0
for i=1:lx
s=s+abs(x(i)-y(i))^2,
end
d=sqrt(s/lx)
end
endfunction
function [d]=euclideanDistance2(x,y)
lx=length(x), ly=length(y)
if lx <> ly then error('SIZE of VECTORS DO NOT MATCH'),
else
s=0
for i=1:lx
s=s+abs(x(i)-y(i))^2,
end
d=sqrt(s)
end
endfunction
function [piVektor]=kreisBerechnen()
piVektor=[]
for i=1:100
piVektor(i,1)= ((2*%pi)/100)*i
piVektor(i,2) = cos(pivek(i,1))
piVektor(i,3) = sin(pivek(i,1))
end
endfunction
function kreisPlotten(inpu)
[r1,c1] = size(inpu)
pivek = kreisBerechnen()
for i=1:r1
plot2d(inpu(i,1)+(pivek(:,2)*inpu(i,3)),inpu(i,2)+(pivek(:,3)*inpu(i,3)), rect = [0 0 1 1])
end
endfunction
//***************************************************
//Evolving clusterin Method (ECM) (cf. Kasabov 2002)
//Takes the vectors x from an INPUT stream and maps these vectors into a set of categories CAT
//The vectors of the input stream are uniformly be normalized
//using the function 'INP3=doNormU(INP)'
function[CAT]=ecm(INP)
[r,c] = size(INP)
CAT=[] //List of categories with (x,y) coordinates, radius Ra, and distance D
//CAT is a cluster
//generate first category
threshold = 0.25 //threshold
clusterIndex = 1
CAT(clusterIndex,1) = INP(1,1)
CAT(clusterIndex,2) = INP(1,2)
CAT(clusterIndex,3) = 0 // radius
printf('Länge des Vektors: %d\n',r)
//Looping through the input
for i=2:r
printf('point %d\n',i)
v=[INP(i,1) INP(i,2)]
//Looping through the existing categories
[r1,c1]=size(CAT)
isInCluster = 0
for j=1:r1
w=[CAT(j,1) CAT(j,2)]
CAT(j,4)=euclideanDistance2(v,w) // euclidean distance for further calculations
end // end for
[minDist,minDistIndex]=min(CAT(:,4))
printf('minDist %f minDistIndex %d\n',minDist,minDistIndex)
if minDist < CAT(minDistIndex,3)
printf('Point belongs to cluster %d\n',minDistIndex)
else
for j=1:r1
CAT(j,5) = CAT(j,3) + CAT(j,4)//calculate the value of Cc + radius for each Cc and put it into the 5th pos of the CAT set
printf("%f\n",CAT(j,5))
end //end for
[minVal,minValIndex] = min(CAT(:,5)) //find the lowest Value
printf('minVal: %f Index: %d\n', minVal, minValIndex)
if(minVal>(2*threshold)) //if lowest Value is greater than 2*threhold; add a cluster
printf('weiter entfernt als zwei mal threshold, cluster addiert\n')
clusterIndex = clusterIndex +1
CAT(clusterIndex,1) = INP(i,1)
CAT(clusterIndex,2) = INP(i,2)
CAT(clusterIndex,3) = 0
else //broaden radius and move cluster center
CAT(minValIndex,3) = (minVal/2) // compute the new radius, lowest value / 2
newCc = (CAT(minValIndex,4) - CAT(minValIndex,3)) / CAT(minValIndex,4) //we compute the distance of the new Cc from the old Cc with eucDis - newRadius and get the proportion
newCcPoint(1) = INP(i,1) - CAT(minValIndex,1) // we compute the point - Cc
newCcPoint(2) = INP(i,2) - CAT(minValIndex,2)
//*****************************************************************
newCcPoint(3) = newCcPoint(1)*newCc //we compute the to be shifted coordinates
newCcPoint(4) = newCcPoint(2)*newCc
//**********************************************
CAT(minValIndex,1) = CAT(minValIndex,1)+newCcPoint(3)// we shift the center
CAT(minValIndex,2) = CAT(minValIndex,2)+newCcPoint(4)// we shift the center
printf('Cc%d shifted\n',minValIndex)
end //end if
end //end if
end // end for
printf('Minimum Value of the CAT-SET: %f\n',min(CAT(:,5)))
endfunction
Having some input shaped as three patterns:
INP2 =
3. 3.
5. 3.
3. 5.
5. 5.
6. 9.
8. 9.
8. 11.
10. 9.
11. 4.
12. 3.
12. 6.
14. 2.
14. 7.
15. 6.
16. 4.
Normalizing these values as follows:
-->INP3=doNormU(INP2)
INP3 =
0.1819017 0.1819017
0.3031695 0.1819017
0.1819017 0.3031695
0.3031695 0.3031695
0.3638034 0.5457052
0.4850713 0.5457052
0.4850713 0.6669730
0.6063391 0.5457052
0.6669730 0.2425356
0.7276069 0.1819017
0.7276069 0.3638034
0.8488747 0.1212678
0.8488747 0.4244373
0.9095086 0.3638034
0.9701425 0.2425356
Putting these values into the ECM algorithm with two different thresholds thr=0.15 and thr=0.25 gives the following results:
If one replaces the distance measure within ECM y the modified function 'normEuclidean()' keeping the input data the same normalized vectors,
function [d]=normEuclidean(x,y) lx=length(x), ly=length(y) s=0 for i=1:lx s=s+abs(x(i)-y(i))^2, end d=sqrt(s)/sqrt(lx) end endfunction
one gets the following results (cf. figure 12.5 and 12.6):
![]() |
![]() |
Gerd Doeben-Henisch 2012-03-31