日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java实现Fmeasure计算_聚类结果的评估指标及其JAVA实现

發(fā)布時間:2025/3/8 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java实现Fmeasure计算_聚类结果的评估指标及其JAVA实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. 前言

又GET了一項技能。在做聚類算法的時候,由于要評估所提出的聚類算法的好壞,于是需要與一些已知的算法對比,或者用一些人工標(biāo)注的標(biāo)簽來比較,于是用到了聚類結(jié)果的評估指標(biāo)。我了解了以下幾項。

TP:是指被聚在一類的兩個量被正確的分類了(即在標(biāo)準(zhǔn)標(biāo)注里屬于一類的兩個對象被聚在一類)

TN:是指不應(yīng)該被聚在一類的兩個對象被正確地分開了(即在標(biāo)準(zhǔn)標(biāo)注里不是一類的兩個對象在待測結(jié)果也沒聚在一類)

FP:指不應(yīng)該放在一類的對象被錯誤的放在了一類。(即在標(biāo)準(zhǔn)標(biāo)注里不是一類,但在待測結(jié)果里聚在一類)

FN:指不應(yīng)該分開的對象被錯誤的分開了。(即在標(biāo)準(zhǔn)標(biāo)注里是一類,但在待測結(jié)果里沒聚在一類)

P = TP + FP

N = TN + FN

1.準(zhǔn)確率、識別率:(rank Index) ?RI

accuracy = (TP + TN)/(P + N)

2.錯誤率、誤分類率

error rate = (FP + FN)/(P + N)

3.敏感度

sensitivity = TP / P

4.特效性

specificity = TN / N

5.精度

precision = TP ?/ ? (TP + FP)

6.召回率

recall ?= ?TP ?/ ? (TP ?+ FN)

7.RI ?其實就是 ?1 ?的 accuracy

8.F度量

P為precision

R為recall

9.NMI(normalized mutual information)

10 Jaccard

J = TP ?/ (TP + F)

二、JAVA實現(xiàn)(未優(yōu)化)

其中很多重復(fù)代碼,還沒有優(yōu)化。。。

package others;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

import javax.rmi.CORBA.Util;

import org.graphstream.algorithm.measure.NormalizedMutualInformation;

/*function:常用的聚類評價指標(biāo)有purity, precision, recall, RI 和 F-score,jaccard

* @param:

* @author:Wenbao Li

* @Data:2015-07-13

*/

public class ClusterEvaluation {

public static void main(String[] args){

int[] A = {1,3,3,3,3,3,3,2,1,0,2,0,2,0,2,1,1,0,1,1};

int[] B = {2,2,0,0,0,3,2,2,3,1,3,1,0,1,2,1,0,1,3,3};

double purity = Purity(A,B);

System.out.println("purity\t\t"+purity);

System.out.println("Pre\t\t"+Precision(A,B));

System.out.println("Recall\t\t"+Recall(A,B));

System.out.println("RI(Accuracy)\t\t"+RI(A,B));

System.out.println("Fvalue\t\t"+F_score(A,B));

System.out.println("NMI\t\t"+NMI(A,B));

}

/*

* 計算一個聚類結(jié)果的簇的個數(shù),以及每一簇中的對象個數(shù),

*/

public static Map> clusterDistri(int[] A){

Map> clusterD = new HashMap>();

int max = -1;

for(int i = 0;i< A.length;i++){

if(max < A[i]){

max = A[i];

}

}

for(int i = 0;i< A.length;i++){

int temp = A[i];

if(temp < max+1){

if(clusterD.containsKey(temp)){

Set set = clusterD.get(temp);

set.add(i+1);

clusterD.put(temp, set);

}else{

Set set = new HashSet();

set.add(i+1);

clusterD.put(temp, set);

}

}

}

return clusterD;

}

public static double ClusEvaluate(String method,int[] A,int[] B){

switch(method){

case "Purity":

return Purity(A,B);

case "Precision":

return Precision(A,B);

case "Recall":

return Recall(A,B);

case "RI":

return RI(A,B);

case "F_score":

return F_score(A,B);

case "NMI":

return NMI(A,B);

case "Jaccard":

return Jaccard(A,B);

default:

return -1.0;

}

}

public static int[] commNum(Map> A,Map> B){

int[] commonNo = new int[A.size()];

int com = 0;

Iterator>> itA = A.entrySet().iterator();

int i = 0;

while(itA.hasNext()){

Entry> entryA = itA.next();

Set setA = entryA.getValue();

Iterator>> itB = B.entrySet().iterator();

int maxComm = -1;

while(itB.hasNext()){

Entry> entryB = itB.next();

Set setB = entryB.getValue();

int lengthA = setA.size();

Set temp = new HashSet(setA);

temp.removeAll(setB);

int lengthCom = lengthA - temp.size();

if(maxComm < lengthCom){

maxComm = lengthCom;

}

}

commonNo[i] = maxComm;

com = com + maxComm;

i++;

}

return commonNo;

}

/*

* 所有簇分配正確的除以總的。其中B是對比的標(biāo)準(zhǔn)標(biāo)簽。

*/

public static double Purity(int[] A,int[] B){

double value;

Map> clusterA = clusterDistri(A);

Map> clusterB = clusterDistri(B);

int[] commonNo = commNum(clusterA,clusterB);

int com = 0;

for(int i = 0;i

com = com + commonNo[i];

}

value = com*1.0/A.length;

return value;

}

/*

* @param A,B

* @return 精度

*/

public static double Precision(int[] A,int[] B){

double value = 0.0;

Map> clusterA = clusterDistri(A);//得到聚類結(jié)果A的類分布

Map> clusterB = clusterDistri(B);//得到聚類B(標(biāo)準(zhǔn))的類分布

int[] commonNo = commNum(clusterA,clusterB);//得到A中每個簇中聚類正確的數(shù)目。

int allP = 0;

int TP = 0;

int FP = 0;

int TN = 0;

int FN = 0;

Iterator>> itA = clusterA.entrySet().iterator();

int i = 0;

while(itA.hasNext()){

Entry> entryA = itA.next();

allP = allP + combination(entryA.getValue().size(),2);

TP = TP + combination(commonNo[i],2);

i++;

}

FP = allP - TP;

itA = clusterA.entrySet().iterator();

while(itA.hasNext()){

Entry> entryA = itA.next();

Iterator>> itA2 = clusterA.entrySet().iterator();

while(itA2.hasNext()){

Entry> entryA2 = itA2.next();

if(entryA != entryA2){

Set s1 = entryA.getValue();

Set s2 = entryA2.getValue();

for(Integer i1 :s1){

for(Integer i2:s2){

if(B[i1-1] != B[i2-1]){

TN++;

}else{

FN++;

}

}

}

}

}

}

double P = TP*1.0/(TP + FP);

return P;

}

/*

* @param A,B

* @return recal召回率

*/

public static double Recall(int[] A,int[] B){

double value = 0.0;

Map> clusterA = clusterDistri(A);//得到聚類結(jié)果A的類分布

Map> clusterB = clusterDistri(B);//得到聚類B(標(biāo)準(zhǔn))的類分布

int[] commonNo = commNum(clusterA,clusterB);//得到A中每個簇中聚類正確的數(shù)目。

int allP = 0;

int TP = 0;

int FP = 0;

int TN = 0;

int FN = 0;

Iterator>> itA = clusterA.entrySet().iterator();

int i = 0;

while(itA.hasNext()){

Entry> entryA = itA.next();

allP = allP + combination(entryA.getValue().size(),2);

TP = TP + combination(commonNo[i],2);

i++;

}

FP = allP - TP;

itA = clusterA.entrySet().iterator();

while(itA.hasNext()){

Entry> entryA = itA.next();

Iterator>> itA2 = clusterA.entrySet().iterator();

while(itA2.hasNext()){

Entry> entryA2 = itA2.next();

if(entryA != entryA2){

Set s1 = entryA.getValue();

Set s2 = entryA2.getValue();

for(Integer i1 :s1){

for(Integer i2:s2){

if(B[i1-1] != B[i2-1]){

TN++;

}else{

FN++;

}

}

}

}

}

}

double R = TP * 1.0/(TP + FN);

return R;

}

/*

* @param A,B

* @return RankIndex

*/

public static double RI(int[] A,int[] B){

double value = 0.0;

Map> clusterA = clusterDistri(A);//得到聚類結(jié)果A的類分布

Map> clusterB = clusterDistri(B);//得到聚類B(標(biāo)準(zhǔn))的類分布

int[] commonNo = commNum(clusterA,clusterB);//得到A中每個簇中聚類正確的數(shù)目。

int P = 0;

int TP = 0;

int FP = 0;

int TN = 0;

int FN = 0;

Iterator>> itA = clusterA.entrySet().iterator();

int i = 0;

while(itA.hasNext()){

Entry> entryA = itA.next();

P = P + combination(entryA.getValue().size(),2);

TP = TP + combination(commonNo[i],2);

i++;

}

FP = P - TP;

itA = clusterA.entrySet().iterator();

while(itA.hasNext()){

Entry> entryA = itA.next();

Iterator>> itA2 = clusterA.entrySet().iterator();

while(itA2.hasNext()){

Entry> entryA2 = itA2.next();

if(entryA != entryA2){

Set s1 = entryA.getValue();

Set s2 = entryA2.getValue();

for(Integer i1 :s1){

for(Integer i2:s2){

if(B[i1-1] != B[i2-1]){

TN++;

}else{

FN++;

}

}

}

}

}

}

value = (TP + TN)*1.0/(TP + FP + FN + TN);

return value;

}

/*

* F值,是對精度和召回率的平衡,

* @param A:評估對象。B:評估標(biāo)準(zhǔn);beta:均衡參數(shù)

* @return F值

*/

public static double F_score(int[] A,int[] B){

double beta = 1.0;

double value = 0.0;

Map> clusterA = clusterDistri(A);//得到聚類結(jié)果A的類分布

Map> clusterB = clusterDistri(B);//得到聚類B(標(biāo)準(zhǔn))的類分布

int[] commonNo = commNum(clusterA,clusterB);//得到A中每個簇中聚類正確的數(shù)目。

int allP = 0;

int TP = 0;

int FP = 0;

int TN = 0;

int FN = 0;

Iterator>> itA = clusterA.entrySet().iterator();

int i = 0;

while(itA.hasNext()){

Entry> entryA = itA.next();

allP = allP + combination(entryA.getValue().size(),2);

TP = TP + combination(commonNo[i],2);

i++;

}

FP = allP - TP;

itA = clusterA.entrySet().iterator();

while(itA.hasNext()){

Entry> entryA = itA.next();

Iterator>> itA2 = clusterA.entrySet().iterator();

while(itA2.hasNext()){

Entry> entryA2 = itA2.next();

if(entryA != entryA2){

Set s1 = entryA.getValue();

Set s2 = entryA2.getValue();

for(Integer i1 :s1){

for(Integer i2:s2){

if(B[i1-1] != B[i2-1]){

TN++;

}else{

FN++;

}

}

}

}

}

}

double P = TP*1.0/(TP + FP);

double R = TP * 1.0/(TP + FN);

value = (beta*beta + 1)*P * R/(beta*beta*P + R);

return value;

}

public static double Jaccard(int[] A,int[] B){

double value = 0.0;

Map> clusterA = clusterDistri(A);//得到聚類結(jié)果A的類分布

Map> clusterB = clusterDistri(B);//得到聚類B(標(biāo)準(zhǔn))的類分布

int[] commonNo = commNum(clusterA,clusterB);//得到A中每個簇中聚類正確的數(shù)目。

int allP = 0;

int TP = 0;

int FP = 0;

int TN = 0;

int FN = 0;

Iterator>> itA = clusterA.entrySet().iterator();

int i = 0;

while(itA.hasNext()){

Entry> entryA = itA.next();

allP = allP + combination(entryA.getValue().size(),2);

TP = TP + combination(commonNo[i],2);

i++;

}

FP = allP - TP;

itA = clusterA.entrySet().iterator();

while(itA.hasNext()){

Entry> entryA = itA.next();

Iterator>> itA2 = clusterA.entrySet().iterator();

while(itA2.hasNext()){

Entry> entryA2 = itA2.next();

if(entryA != entryA2){

Set s1 = entryA.getValue();

Set s2 = entryA2.getValue();

for(Integer i1 :s1){

for(Integer i2:s2){

if(B[i1-1] != B[i2-1]){

TN++;

}else{

FN++;

}

}

}

}

}

}

value = TP * 1.0 / (TP + FP + FN);

return value;

}

public static double NMI(int[] A,int[] B){

Map> clusterA = clusterDistri(A);//得到聚類結(jié)果A的類分布

Map> clusterB = clusterDistri(B);//得到聚類B(標(biāo)準(zhǔn))的類分布

Iterator>> itA = clusterA.entrySet().iterator();

Iterator>> itB = clusterB.entrySet().iterator();

Set> partitionF = new HashSet>();

Set> partitionR = new HashSet>();

int nodeCount = B.length;

while(itA.hasNext()){

Entry> entryA = itA.next();

Set setA = entryA.getValue();

partitionF.add(setA);

setA = null;

entryA = null;

}

while(itB.hasNext()){

Entry> entryB = itB.next();

Set setB = entryB.getValue();

partitionR.add(setB);

setB = null;

entryB = null;

}

return computeNMI(partitionF,partitionR,nodeCount);

}

public static double computeNMI(Set> partitionF,

Set> partitionR,int nodeCount) {

int[][] XY = new int[partitionR.size()][partitionF.size()];

int[] X = new int[partitionR.size()];

int[] Y = new int[partitionF.size()];

int i = 0;

int j = 0;

for (Set com1 : partitionR) {

j = 0;

for (Set com2 : partitionF) {

XY[i][j] = intersect(com1, com2);//待測結(jié)果第i個簇和標(biāo)準(zhǔn)結(jié)果第j個簇的共有元素個數(shù)

X[i] += XY[i][j];//待測結(jié)果第i個簇與所有標(biāo)準(zhǔn)結(jié)果簇的公共元素個數(shù)(感覺就是第i個簇的元素個數(shù))

Y[j] += XY[i][j];//標(biāo)準(zhǔn)結(jié)果簇第j個簇的元素個數(shù)()

j++;

}

i++;

}

int N = nodeCount;

double Ixy = 0;

double Ixy2 = 0;

for (i = 0; i < partitionR.size(); i++) {

for (j = 0; j < partitionF.size(); j++) {

if (XY[i][j] > 0) {

Ixy += ((double) XY[i][j] / N)

* (Math.log((double) XY[i][j] * N / (X[i] * Y[j])) / Math

.log(2.0));

//Ixy2 = (float) (Ixy2 + -2.0D * XY[i][j]

//* Math.log(XY[i][j] * N / X[i] * Y[j]));

}

}

}

//System.out.println(Ixy2);

//double denom = 0.0F;

//for (int ii = 0; ii < X.length; ++ii)

//denom = (double) (denom + X[ii] * Math.log(X[ii] / N));

//for (int jj = 0; jj < Y.length; ++jj) {

//denom = (double) (denom + Y[jj] * Math.log(Y[jj] / N));

//}

//

//System.out.println(denom);

//double M = (Ixy / denom);

//

//return M;

double Hx = 0;

double Hy = 0;

for (i = 0; i < partitionR.size(); i++) {

if (X[i] > 0)

Hx += h((double) X[i] / N);

}

for (j = 0; j < partitionF.size(); j++) {

if (Y[j] > 0)

Hy += h((double) Y[j] / N);

}

double InormXY = Ixy / Math.sqrt(Hx * Hy);

return InormXY;

}

private static double h(double p) {

return -p * (Math.log(p) / Math.log(2.0));

}

/*

* 兩個集合的公共元素個數(shù)

*/

private static int intersect(Set com1, Set com2) {

int num = 0;

for (Integer v1 : com1) {

if (com2.contains(v1))

num++;

}

return num;

}

/*

* C(m,n)=m取n

*/

public static int combination(int m,int n){

int result = 1;

if(m < n){

return -1;

}

result = factorial(m)/(factorial(n)*factorial(m-n));

return result;

}

public static int factorial(int m){

if((m == 1) || (m == 0)){

return 1;

}else if(m < 0){

return -1;

}else{

return m*factorial(m-1);

}

}

}

總結(jié)

以上是生活随笔為你收集整理的java实现Fmeasure计算_聚类结果的评估指标及其JAVA实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产午夜精品无码一区二区 | 国产毛片18 | 国产大片b站 | 一本av在线| 日韩av在线播放不卡 | 亚洲а∨天堂久久精品2021 | 日韩精品一区二区视频 | 免费欧美一级视频 | 亚洲国产午夜 | 无码日韩人妻精品久久蜜桃 | 一级大片在线观看 | 久天堂| 激情六月婷婷 | 中文字幕亚洲欧美日韩在线不卡 | 国产熟妇乱xxxxx大屁股网 | 高清av在线 | 麻豆免费在线播放 | 国产成人自拍在线 | 小镇姑娘高清播放视频 | 亚洲精品女 | 奶水旺盛的少妇在线播放 | 日韩Av无码精品 | 免费在线观看黄网 | 亚洲av成人一区二区国产精品 | 日日夜夜添 | 美女131爽爽爽做爰视频 | 国产精华一区二区三区 | 99热这里只有精品首页 | 又黄又色又爽 | 精品人伦一区二区三 | 大地资源影视在线播放观看高清视频 | 欧美怡红院视频 | 婷婷综合亚洲 | 日韩欧美视频网站 | 亚洲国产精品成人综合 | 久久成人综合网 | 精品国产乱码久久 | 男男野外做爰全过程69 | 日韩aaaaa | 97人妻精品一区二区三区免费 | 国产一区二区三区视频免费观看 | 秋霞av网| 捆绑中国女人hd视频 | 天天射,天天干 | 国产精品黄在线观看 | 三级视频网 | 91亚洲视频在线 | 超碰碰97| 边打电话边做 | 久久资源365 | 国产99视频在线观看 | 国产suv精品一区二区 | 亚洲女优在线播放 | 国产精品一线 | 李丽珍裸体午夜理伦片 | av大全在线观看 | 伊人夜色 | 性欧美ⅴideo另类hd | 久久久精品视频在线观看 | 不卡av电影在线观看 | 亚洲精品在线观看免费 | 天堂综合网 | 好大好舒服视频 | 欧美一区二区在线观看视频 | 久草网在线观看 | 五月中文字幕 | 最新黄色av网站 | 草草影院在线播放 | 色屁屁 | 在线观看aa | 中文字幕日本人妻久久久免费 | www精品国产 | 91精品免费视频 | 亚洲成人av免费观看 | 爱情岛论坛自拍亚洲品质极速最新章 | 深夜视频免费在线观看 | 男插女视频免费 | 最新av免费在线观看 | 夜夜嗨av一区二区三区网页 | 国产精品一区二区不卡 | 黑人黄色片 | 国产女人视频 | 久久婷婷视频 | 国产午夜免费视频 | 男人和女人日b视频 | 中文在线√天堂 | 草草地址线路①屁屁影院成人 | 韩国av三级 | 日韩一本在线 | 欧美乱论 | 波多野结衣精品视频 | 久久国内免费视频 | 日韩一级片网址 | 一级黄色大片视频 | 精品国产乱码久久久久久1区二区 | 波多野结衣免费视频观看 | 久久精品国产欧美亚洲人人爽 | 国产成人久久久 | 韩国主播青草55部完整 |