互信息 c语言,NMI(标准化互信息)

package clusters;

import *;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class NormalizedMutualInformation {

static String path = "/home/fhqplzj/IdeaProjects/Vein/src/main/resources/nmi_data";

static void loadData(List> lists) {

try {

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(path)));

String line;

while ((line = bufferedReader.readLine()) != null) {

String[] data = line.split("\\s+");

ArrayList integers = new ArrayList<>();

for (String s : data) {

integers.add(Integer.parseInt(s));

}

lists.add(integers);

}

bufferedReader.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

List> lists = new ArrayList<>();

loadData(lists);

int K = lists.size();

int N = 0;

int[] clusters = new int[K];

for (int i = 0; i < K; i++) {

clusters[i] = lists.get(i).size();

N += clusters[i];

}

Map map = new HashMap<>();

for (List list : lists) {

for (Integer integer : list) {

map.put(integer, map.getOrDefault(integer, 0) + 1);

}

}

double clusterEntropy = 0;

for (int cluster : clusters) {

double tmp = 1.0 * cluster / N;

clusterEntropy -= (tmp * (Math.log(tmp) / Math.log(2)));

}

System.out.println("clusterEntropy = " + clusterEntropy);

double classEntropy = 0;

for (Integer integer : map.values()) {

double tmp = 1.0 * integer / N;

classEntropy -= (tmp * (Math.log(tmp) / Math.log(2)));

}

System.out.println("classEntropy = " + classEntropy);

double totalEntropy = 0;

Map tmpMap = new HashMap<>();

for (int i = 0; i < K; i++) {

int wk = clusters[i];

tmpMap.clear();

for (Integer integer : lists.get(i)) {

tmpMap.put(integer, tmpMap.getOrDefault(integer, 0) + 1);

}

for (Map.Entry entry : tmpMap.entrySet()) {

int cj = map.get(entry.getKey());

int value = entry.getValue();

totalEntropy += (1.0 * value / N * (Math.log(1.0 * N * value / (wk * cj)) / Math.log(2)));

}

}

System.out.println("totalEntropy = " + totalEntropy);

double nmi = 2 * totalEntropy / (clusterEntropy + classEntropy);

System.out.println("nmi = " + nmi);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值