# [R] silhouette fuzzy

pete pieroleone at hotmail.it
Mon Jan 31 22:46:04 CET 2011

After ordering the table of membership degrees , i must get the difference
between the first and second coloumns , between the first and second largest
membership degree of object i. This for K=2,K=3,....to K.max=6.
This difference is multiplyed by the Crisp silhouette index vector (si). Too
it dependending on K=2,...,K.max=6; the result divided by the sum of these
differences
I need a final vector composed of the indexes for each clustering
(K=2,...,K.max=6).
There is a method, i think that is classe.memb, but i can't to solve problem
because trasformation of the membership degrees matrix( (ris\$membership) and
of  list object (ris\$silinfo), does not permit    me to use classe.memb
propertyes.
.

Σí(uί1-uí2)sí/Σí(uí1-uí2)

> head(t(A.sort))     membership degrees table ordering by max to min value
[,1] [,2] [,3] [,4]
1 0.66 0.30 0.04 0.01
2 0.89 0.09 0.02 0.00
3 0.92 0.06 0.01 0.01
4 0.71 0.21 0.07 0.01
5 0.85 0.10 0.04 0.01
6 0.91 0.04 0.02 0.02
[,1] [,2] [,3] [,4]
1 0.66 0.30 0.04 0.01
2 0.89 0.09 0.02 0.00
3 0.92 0.06 0.01 0.01
4 0.71 0.21 0.07 0.01
5 0.85 0.10 0.04 0.01
6 0.91 0.04 0.02 0.02
> H.Asort[,1]-H.Asort[,2]
1    2    3    4    5    6
0.36 0.80 0.86 0.50 0.75 0.87

> H.Asort=t(H.Asort[,1]-H.Asort[,2])
This is the differences vector by multiplying trasformed table ris\$silinfo.
> ris\$silinfo
\$widths
cluster neighbor   sil_width
72       1        3  0.43820207
54       1        3  0.43427773
29       1        6  0.41729079
62       1        6  0.40550562
64       1        6  0.32686757
32       1        3  0.30544722
45       1        3  0.30428723
79       1        3  0.30192624
12       1        3  0.30034472
60       1        6  0.29642495
41       1        3  0.29282778
1        1        3  0.28000788
85       1        3  0.24709237
74       1        3  0.239

> P=ris\$silinfo
> P=P[1]
>  P=as.data.frame(P)
>  V4=rownames(P)
>  mode(V4)="numeric"
>  P[,4]=V4
>  P[order(P\$V4),]

widths.cluster widths.neighbor widths.sil_width V4
1               1               3       0.28000788  1
2               2               4       0.07614849  2
3               2               3      -0.11676440  3
4               2               4       0.15436648  4
5               2               3       0.14693927  5
6               3               1       0.57083836  6
7               4               5       0.36391826  7
8               5               4       0.63491118  8
9               4               2       0.54458733  9
10              5               4       0.51059626 10
11              2               5       0.03908952 11
12              1               3       0.30034472 12
13              1               3      -0.04928562 13
14              4               3       0.20337180 14
15              3               4       0.46164324 15
18              5               4       0.52066782 18
20              4               3       0.45517287 20
21              3               4       0.39405507 21
22              4               5       0.05574547 22
23              6               1      -0.06750403 23
> P= P[order(P\$V4),]

P=P[,3]
This is trasformed vector ris\$silinfo =P.
I can't to use this vector object in the classe.memb.
K=2
K.max=6
while (K<=K.max)
{

ris=fanny(frj,K,memb.exp=m,metric="SqEuclidean",stand=TRUE,maxit=1000,tol=1e-6)
ris\$centroid=matrix(0,nrow=K,ncol=J)
for (k in 1:K)
{

ris\$centroid[k,]=(t(ris\$membership[,k]^m)%*%as.matrix(frj))/sum(ris\$membership[,k]^m)
}
rownames(ris\$centroid)=1:K
colnames(ris\$centroid)=colnames(frj)
print(K)
print(round(ris\$centroid,2))
print(classe.memb(ris\$membership)\$table.U)
print(ris\$silinfo\$avg.width)
K=K+1
}
this should be scheme clearly are determined centroid based on classe.memb.

classe.memb=function(U)
{
info.U=cbind(max.col(U),apply(U,1,max))
i=1
while (i <= nrow(U))
{
if (apply(U,1,max)[i]<0.5) info.U[i,1]=0
i=i+1
}
K=ncol(U)
table.U=matrix(0,nrow=K,ncol=4)
cl=1
while (cl <= K)
{
table.U[cl,1] = length(which(info.U[info.U[,1]==cl,2]>=.90))
table.U[cl,2] = length(which(info.U[info.U[,1]==cl,2]>=.70)) -
table.U[cl,1]
table.U[cl,3] = length(which(info.U[info.U[,1]==cl,2]>=.50)) -
table.U[cl,1] - table.U[cl,2]
table.U[cl,4] = sum(table.U[cl,])
cl = cl+1
}
rownames(table.U) = c(1:K)
colnames(table.U) = c("Alto", "Medio", "Basso", "Totale")
out=list()
out\$info.U=round(info.U,2)
out\$table.U=table.U
return(out)
}
--
View this message in context: http://r.789695.n4.nabble.com/silhouette-fuzzy-tp3249893p3249893.html
Sent from the R help mailing list archive at Nabble.com.