駆け足で読むRで学ぶクラスタ解析 第2章 クラスタリング入門

> 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;
	}
  • F-尺度はだふん、こう
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;
		
	}