> a<-c(1,2,3,1,2,3,1,2,3)
> b<-c(1,1,2,2,1,1,3,3,2)
> t<-table(a,b)
> t
b
a 1 2 3
1 1 1 1
2 2 0 1
3 1 2 0
>
public static double entropy(double[][] ct){
double ret = 0;
double[] sumcl=new double[ct.length];
double[] entcl=new double[ct.length];
double totalsum=0;
for(int i=0;i<ct.length;i++){
for(int j=0;j<ct[i].length;j++){
sumcl[i]+=ct[i][j];
totalsum+=ct[i][j];
}
}
for(int i=0;i<entcl.length;i++){
for(int j=0;j<ct[i].length;j++){
double pr=ct[i][j]/sumcl[i];
if(pr!=0){
entcl[i]-=pr*Math.log(pr)/Math.log(entcl.length);
}
}
}
for(int i=0;i<entcl.length;i++){
ret+=sumcl[i]/totalsum*entcl[i];
}
return ret;
}
public static double purity(double[][] ct){
double ret =0;
double[] maxcl=new double[ct.length];
double totalsum=0;
for(int i=0;i<ct.length;i++){
for(int j=0;j<ct[i].length;j++){
totalsum+=ct[i][j];
if(maxcl[i]<ct[i][j]){
maxcl[i]=ct[i][j];
}
}
}
for(int i=0;i<ct.length;i++){
ret +=maxcl[i];
}
ret /=totalsum;
return ret;
}
public static double fmeasure(double[][] ct){
double ret = 0;
double[][] r = new double[ct.length][ct[0].length];
double[][] p = new double[ct.length][ct[0].length];
double[][] f = new double[ct.length][ct[0].length];
double[] sumcl=new double[ct.length];
double[] sumrow=new double[ct[0].length];
double totalsum=0;
for(int i=0;i<ct.length;i++){
for(int j=0;j<ct[i].length;j++){
sumcl[i]+=ct[i][j];
sumrow[j]+=ct[i][j];
totalsum+=ct[i][j];
}
}
for(int i=0;i<ct.length;i++){
for(int j=0;j<ct[i].length;j++){
r[i][j]=ct[i][j]/sumrow[j];
p[i][j]=ct[i][j]/sumcl[i];
f[i][j]=2*r[i][j]*p[i][j]/(r[i][j]+p[i][j]);
}
}
double[] maxf=new double[ct.length];
for(int i=0;i<f.length;i++){
for(int j=0;j<f[i].length;j++){
if(maxf[i]<f[i][j]){
maxf[i]=f[i][j];
}
}
}
for(int i=0;i<ct.length;i++){
ret += sumrow[i]/totalsum*maxf[i];
}
return ret;
}
public static double accuracy(double[][] ct,int[] label){
double ret = 0;
double[] ac = new double[ct.length];
double totalsum=0;
double[] sumcl = new double[ct.length];
double[] sumlabel = new double[ct[0].length];
for(int i=0;i<ct.length;i++){
for(int j=0;j<ct[i].length;j++){
totalsum+=ct[i][j];
sumcl[i]+=ct[i][j];
sumlabel[label[i]]+=ct[i][j];
}
}
for(int i=0;i<ac.length;i++){
ac[i] = ct[i][label[i]]/sumlabel[label[i]];
ret += sumcl[i]*ac[i]/totalsum;
}
return ret;
}