Purity、NMI、RI、Precision、Recall、F值,聚类指标的计算JAVA实现。

这篇博客介绍了如何使用Java实现聚类效果的评估指标,包括Purity、Normalized Mutual Information (NMI)、Rand Index (RI)、Precision、Recall和F值。文中提供了相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于聚类的这六个evaluation metrics,参考evaluation of clustering,讲得很好了,我就不赘述了,直接上代码:

第一个:计算NMI的:

package clusters;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * DATE: 16-6-18 TIME: 上午10:00
 */

/**
 * 参考文献:http://www-nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html
 */
public class NormalizedMutualInformation {
    public static String path = "/home/fhqplzj/IdeaProjects/Vein/src/main/resources/nmi_data";

    public static void loadData(List<List<Integer>> lists) {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                String[] data = line.split("\\s+");
                ArrayList<Integer> 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<List<Integer>> 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
### ACC、NMI、PUR 聚类评估指标的定义与实现 #### ACC(聚类准确率) ACC 是一种用于衡量聚类结果与真实标签之间一致性的指标。其定义如下: \[ \text{ACC} = \frac{\sum_{i=1}^n \delta(l_i, \text{map}(r_i))}{n} \] 其中 \( l_i \) 表示样本的真实标签,\( r_i \) 表示聚类算法分配给该样本的簇标签,\(\text{map}\) 表示将聚类标签映射到真实标签的最佳排列方式,\(\delta(x, y)\) 是指示函数,当 \(x = y\) 时返回 1,否则返回 0[^1]。 计算 ACC 的代码实现如下: ```python from sklearn.metrics import accuracy_score import numpy as np from scipy.optimize import linear_sum_assignment def calculate_acc(true_labels, cluster_labels): # 构造混淆矩阵 cost_matrix = np.zeros((len(set(cluster_labels)), len(set(true_labels)))) for i in set(cluster_labels): for j in set(true_labels): cost_matrix[i, j] = -np.sum(np.logical_and(cluster_labels == i, true_labels == j)) # 使用匈牙利算法求解最佳匹配 row_ind, col_ind = linear_sum_assignment(cost_matrix) return -cost_matrix[row_ind, col_ind].sum() / len(true_labels) # 示例数据 true_labels = [0, 1, 2, 1, 0, 2] cluster_labels = [1, 2, 0, 2, 1, 0] acc = calculate_acc(true_labels, cluster_labels) print(f"ACC: {acc}") ``` --- #### NMI(归一化互信息) NMI 是一种衡量两个聚类结果之间相似性的指标,基于信息论中的互信息概念。其公式为: \[ \text{NMI}(U, V) = \frac{I(U;V)}{\max(H(U), H(V))} \] 其中 \( I(U;V) \) 是互信息,\( H(U) \) 和 \( H(V) \) 分别是真实标签和聚类结果的熵[^3]。 计算 NMI代码实现如下: ```python from sklearn.metrics import normalized_mutual_info_score def calculate_nmi(true_labels, cluster_labels): return normalized_mutual_info_score(true_labels, cluster_labels) # 示例数据 true_labels = [0, 1, 2, 1, 0, 2] cluster_labels = [1, 2, 0, 2, 1, 0] nmi = calculate_nmi(true_labels, cluster_labels) print(f"NMI: {nmi}") ``` --- #### PUR(纯度,Purity) PUR 是一种简单且直观的聚类性能评估指标,表示每个簇中占多数类别的比例之和。其定义为: \[ \text{PUR} = \frac{1}{n} \sum_{k=1}^K \max_j |C_k \cap T_j| \] 其中 \( C_k \) 表示第 \( k \) 个簇,\( T_j \) 表示第 \( j \) 类真实标签,\( n \) 是样本总数[^3]。 计算 PUR 的代码实现如下: ```python def calculate_purity(true_labels, cluster_labels): # 计算混淆矩阵 confusion_matrix = np.zeros((len(set(cluster_labels)), len(set(true_labels)))) for i in range(len(true_labels)): confusion_matrix[cluster_labels[i], true_labels[i]] += 1 # 计算每个簇的最大并求和 return np.sum(np.amax(confusion_matrix, axis=1)) / len(true_labels) # 示例数据 true_labels = [0, 1, 2, 1, 0, 2] cluster_labels = [1, 2, 0, 2, 1, 0] purity = calculate_purity(true_labels, cluster_labels) print(f"PUR: {purity}") ``` --- ### 注意事项 - ACC 需要通过匈牙利算法找到最佳映射关系。 - NMI计算依赖于互信息和熵的概念,通常使用现成库函数实现。 - PUR 的计算较为直接,适合初学者理解聚类质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值