聚类的外部指标(Purity, ARI, NMI, ACC) 和内部指标(NCC,Entropy,Compactness,Silhouette Index),附代码 (Python 和 Matlab)

6 篇文章 1 订阅
订阅专栏
本文介绍了聚类性能评估的外部和内部指标,包括Purity、ARI、NMI、Accuracy等,并提供了Python和Matlab的实现代码。这些指标用于衡量聚类结果的质量,外部指标如ARI更注重与已知标签的匹配,内部指标则关注数据的内在结构。
摘要由CSDN通过智能技术生成

聚类性能评估的外部指标和内部指标,附代码 (Python 和 Matlab)

文章目录

  • 聚类性能评估的外部指标和内部指标,附代码 (Python 和 Matlab)
    • 1 外部指标
      • 1.1 Purity
        • 原理解释
        • Python代码
        • Matlab代码
      • 1.2 ARI
        • 原理解释
        • Python 代码
        • Matlab 代码
      • 1.3 NMI
        • 原理解释
        • Python 代码
        • Matlab代码
      • 1.4 ACC
        • Python 代码
        • Matlab 代码
    • 2 内部指标
      • 2.1 Internal and external validation measures (NCC)
        • 原理解释
        • Python 代码
        • Matlab 代码
      • 2.2 Entropy
        • 原理解释
        • Python 代码
        • matlab代码
      • 2.3 Compactness
        • 原理解释
        • Python 代码
        • Matlab 代码
      • 2.4 Silhouette Index
        • 原理解释
        • Python 代码
        • Matlab 代码
    • 总结

众所周知,聚类有效性指标,包括外部指标和内部指标,对于评价聚类结果的质量非常有用。

1 外部指标

1.1 Purity

原理解释

先给出Purity的计算公式:
在这里插入图片描述

首先解释一下,为什么需要引入纯度计算,因为聚类中总是会出现此类与标签对应的类不一致,虽然他们表示的数字都是1,但是实质内容可能不一致。

用一个例子说明,例子借用了博客 评价聚类的指标:纯度、兰德系数以及调整兰德系数 - 简书

在这里插入图片描述
在这里插入图片描述

详细请见上述我附上的链接地址~

Python代码
def purity(labels_true, labels_pred):
    clusters = np.unique(labels_pred)
    labels_true = np.reshape(labels_true, (-1, 1))
    labels_pred = np.reshape(labels_pred, (-1, 1))
    count = []
    for c in clusters:
        idx = np.where(labels_pred == c)[0]
        labels_tmp = labels_true[idx, :].reshape(-1)
        count.append(np.bincount(labels_tmp).max())
    return np.sum(count) / labels_true.shape[0]

Matlab代码
function [purity] = Purity(labels_true, labels_pred)
clusters = unique(labels_pred);
labels_true = labels_true';
labels_pred = labels_pred';
labels_true = labels_true(:);
labels_pred = labels_pred(:);
count = [];

for c = 1:length(clusters)
	idx = find(labels_pred == c);
	temp = labels_true(idx);
	labels_tmp = reshape(temp,1,length(temp(:)));
	T=tabulate(labels_tmp);
	count = [count, max(T(:,2))];
end
purity = sum(count)/size(labels_true,1);
end

感谢Redmor提供的matlab代码~

1.2 ARI

原理解释

参考博客 调整兰德系数(Adjusted Rand index,ARI)的计算_的图表~
在这里插入图片描述

但是由于RI无法保证随机划分的聚类结果的RI值接近于0,所以现在主流科研工作者,使用的外部指标偏向于ARI,更加客观。

ARI的改进如下:
在这里插入图片描述

取值为[-1,1],绝对值越大效果越好~注意是绝对值噢。

Python 代码
def ARI(labels_true, labels_pred, beta=1.):
    from sklearn.metrics import adjusted_rand_score
    ari = adjusted_rand_score(labels_true, labels_pred)

    return ari
Matlab 代码
function ri = Eva_ARI(p1, p2, varargin)
%RAND_INDEX Computes the rand index between two partitions.
%   RAND_INDEX(p1, p2) computes the rand index between partitions p1 and
%   p2.
%
%   RAND_INDEX(p1, p2, 'adjusted'); computes the adjusted rand index
%   between partitions p1 and p2. The adjustment accounts for chance
%   correlation.

% Parse the input and throw errors
    adj = 0;
    if nargin == 0
    end
    if nargin > 3
        error('Too many input arguments');
    end
    if nargin == 3
        if strcmp(varargin{1}, 'adjusted')
            adj = 1;
        else
            error('%s is an unrecognized argument.', varargin{1});
        end
    end
    if length(p1)~=length(p2)
        error('Both partitions must contain the same number of points.');
    end
    
	% Preliminary computations and cleansing of the partitions
    N = length(p1);
    [~, ~, p1] = unique(p1);
    N1 = max(p1);
    [~, ~, p2] = unique(p2);
    N2 = max(p2);
    
    % Create the matching matrix
    for i=1:1:N1
        for j=1:1:N2
            G1 = find(p1==i);
            G2 = find(p2==j);
            n(i,j) = length(intersect(G1,G2));
        end
    end
    
    % If required, calculate the basic rand index
    if adj==0
        ss = sum(sum(n.^2));
        ss1 = sum(sum(n,1).^2);
        ss2 =sum(sum(n,2).^2);
        ri = (nchoosek2(N,2) + ss - 0.5*ss1 - 0.5*ss2)/nchoosek2(N,2);
    end
    
    
    % Otherwise, calculate the adjusted rand index
    if adj==1
        ssm = 0;
        sm1 = 0;
        sm2 = 0;
        for i=1:1:N1
            for j=1:1:N2
                ssm = ssm + nchoosek2(n(i,j),2);
            end
        end
        temp = sum(n,2);
        for i=1:1:N1
            sm1 = sm1 + nchoosek2(temp(i),2);
        end
        temp = sum(n,1);
        for i=1:1:N2
            sm2 = sm2 + nchoosek2(temp(i),2);
        end
        NN = ssm - sm1*sm2/nchoosek2(N,2);
        DD = (sm1 + sm2)/2 - sm1*sm2/nchoosek2(N,2);
        ri = NN/DD;
    end 
    

    % Special definition of n choose k
    function c = nchoosek2(a,b)
        if a>1
            c = nchoosek(a,b);
        else
            c = 0;
        end
    end
end

hungarian函数可以直接去matlab中文社区获取噢或者后台私信我~

1.3 NMI

原理解释

MI, NMI, AMI(互信息,标准化互信息,调整互信息

大家可以参考这一篇博客,讲的很详细~

我就简单附上代码啦

Python 代码
def NMI_sklearn(predict, label):
    # return metrics.adjusted_mutual_info_score(predict, label)
    return metrics.normalized_mutual_info_score(predict, label)
Matlab代码
function z = Eva_NMI(x, y)
assert(numel(x) == numel(y));
n = numel(x);
x = reshape(x,1,n);
y = reshape(y,1,n);
l = min(min(x),min(y));
x = x-l+1;
y = y-l+1;
k = max(max(x),max(y));
idx = 1:n;
Mx = sparse(idx,x,1,n,k,n);
My = sparse(idx,y,1,n,k,n);
Pxy = nonzeros(Mx'*My/n);
Hxy = -dot(Pxy,log2(Pxy));
Px = nonzeros(mean(Mx,1));
Py = nonzeros(mean(My,1));
Hx = -dot(Px,log2(Px));
Hy = -dot(Py,log2(Py));
MI = Hx + Hy - Hxy;
z = sqrt((MI/Hx)*(MI/Hy));
z = max(0,z);

感谢开源社区~

1.4 ACC

精确度计算,有一点值得提醒,Python是直接与标签对比,没有进行Mapping步骤,适用于分类结果评估;matlab进行了Mapping步骤适用于聚类结果评估。

Python 代码
def AC(labels_true, labels_pre):
    acc = accuracy_score(labels_true, labels_pre)
    # acc = np.sum(labels_true==labels_pre) / np.size(labels_true)
    return acc
Matlab 代码
function [accuracy, ConMtx] = Eva_CA(dataCluster,dataLabel)

nData = length( dataLabel );
nC = max(dataLabel);
E = zeros( nC, nC );
for m = 1 : nData
    i1 = dataCluster( m );
    i2 = dataLabel( m );
    E( i1, i2 ) = E( i1, i2 ) + 1;
end
ConMtx=E';
E=-E;
[C,~]=hungarian(E);
nMatch=0;
for i=1:nC
    nMatch=nMatch-E(C(i),i);
end

accuracy = nMatch/nData;

以上外部指标均是目前科研工作者常用指标。

2 内部指标

与外部有效性指数相比,内部有效性指数评价的是数据分区的聚类结构,目的是衡量一个集群内聚类对象的比例,评估聚类对象的分布,而没有外部信息的支持。这里外部信息指原始数据的标签。

2.1 Internal and external validation measures (NCC)

原理解释

NCC 测量的是簇内距离和簇间距离的组合。簇内距离是指一个簇内物体之间的距离。作者将两个对象的 “群内协议”(Sintra)定义为两个对象之间的属性数量和群内距离之差。

距离的测量方法如下:

如果比较的所有属性值之间存在匹配,则drs=0,否则rs= N ⁄ 1,其中N是这两个对象之间在比较过程中发现的不匹配(mismatches)数量。

在这里插入图片描述
簇间距离 (Dinter),是不属于同一簇的两个对象(rands)之间的距离,也就是说,这个距离可以测量两个簇之间的距离。
在这里插入图片描述
NCC 的表达式是针对任何聚类过程的结果而定义的,其中 T 对应于聚类中心的数量。
在这里插入图片描述
当然,NCC 度量也可以用二进制矩阵 Y 来表示,如果对象(rands)属于同一个聚类,则 yrs=1,否则 yrs=0。NCC(Y) 公式用二进制矩阵表示:
在这里插入图片描述
通过NCC的度量,可以观察到集群内(Sintra)和集群间(Dinter)距离之间的关系。根据作者的说法,当群内距离值较小时,群内距离就会增加。另外,当簇间距离增加时,聚类过程中的群组彼此之间变得更加异质化,即集群之间更加不相似。如果这种相似度(Sintra)和距离(Diner)增加,NCC的值就会趋于增加,否则NCC值就会减少。

Python 代码
def NCC(label, x):
    m = x.shape[0]
    n = x.shape[1]
    Y = np.zeros((m, m))
    for r in range(m):
        for s in range(m):
            if label[r] == label[s]:
                Y[r, s] = 1

    drs = np.zeros((m, m))
    for r in range(m):
        for s in range(m):
            for att in range(n):
                if x[r, att] != x[s, att]:
                    drs[r, s] += 1

    ncc = 0.0
    for r in range(m):
        for s in range(m):
            if r != s:
                ncc += (n - 2 * drs[r, s]) * Y[r, s] + drs[r, s]

    return ncc
Matlab 代码
function ncc = NCC_Y(Cluster_lable,x,n)

%%%Eq.(33)
% n is the number of attributes (categorical).
[m,~] = size(x);
Y = zeros(m,m);
for r = 1:m
    for s = 1:m
        if Cluster_lable(r) == Cluster_lable(s)
            Y(r,s) = 1;
        end
    end
end

drs = zeros(m,m);
for r = 1:m
    for s = 1:m
        for att = 1:n
            if x(r,att) ~= x(s,att)
                drs(r,s) = drs(r,s) + 1;
            end
        end
    end
end

ncc = 0;
for r = 1:m
    for s = 1:m
        if r~= s
            ncc = ncc + (n - 2*drs(r,s))*Y(r,s) + drs(r,s);
        end
    end
end

注释表示论文中的公式,参考文献附文末。

2.2 Entropy

原理解释

在这里插入图片描述

香农熵是在2001年提出的,用于计算数据集无序性的方法。应用于聚类的方法,如果一个簇数据尽可能地有序是否可以说明,更适合聚为一类呢?基于此,有学者Rˇezanková (2009)提出使用熵来计算一个集群中属性的无序性。

p(u)lt :u表示属性l中某一个可能的值,t表示一个簇,p(u)lt表示,在簇t中在l属性上拥有u值的频率。

Entropy值越小,代表聚类效果越好~

Python 代码
def Entropy(label, x):
    m = x.shape[0]
    n = x.shape[1]
    k = len(np.unique(label))
    # 每一个属性可能出现的值
    no_values = []
    for i in range(n):
        no_values.append(len(np.unique(x[:, i])))

    # cluster 成员数
    num_in_cluster = np.ones(k)
    for i in range(m):
        num_in_cluster[label[i]] += 1

    # p_u_lt
    P = []
    for t in range(k):
        # mt
        tp = np.where(label == t)[0]
        p_u_l = []
        for l in range(n):
            p_u_lt = []
            for u in range(no_values[l]):
                belong_lt = np.where(x[tp][:, l] == u)[0]
                p_u_lt.append(len(belong_lt) / len(tp))
            p_u_l.append(p_u_lt)
        P.append(p_u_l)

    # H
    H = np.zeros(k)
    for t in range(k):
        H_lt = np.zeros(n)
        for l in range(n):
            H_lt_u = np.zeros(no_values[l])
            for u in range(no_values[l]):
                if P[t][l][u] != 0:
                    H_lt_u[u] = - P[t][l][u] * np.log(P[t][l][u])
            H_lt[l] = np.sum(H_lt_u)
        H[t] = np.sum(H_lt) / n

    # H_R
    entropy_R = np.sum(H) / k

    return entropy_R
matlab代码
function entropy_R = Eva_Entropy(Cluster_lable,x,n)
% n is the number of attributes (categorical).

[m,~] = size(x);
t = length( unique( Cluster_lable ) );
R = cell(1,t);
value_lable = unique( Cluster_lable );
number_in_cluster = zeros(1,t);

for i = 1:m
    for j = 1:t
        if Cluster_lable(i) == value_lable(j)
            number_in_cluster(1,j) = number_in_cluster(1,j) + 1;
        end
    end
end

for i = 1:t
    R{i} = zeros(number_in_cluster(1,i),n);
end

%record cluster R
for i = 1:t
    count_x_in_rt = 1;
    for j = 1:m
        if Cluster_lable(j) == value_lable(i)
            for v = 1:n
                R{i}(count_x_in_rt,v) = x(j,v);     
            end
            count_x_in_rt = count_x_in_rt + 1;
        end
    end
end

%number of attr
num_att = zeros(1,n);
for i = 1:n
    num_att(1,i) = length(unique(x(:,i)));
end

%value of attr
value_att = cell(1,n);
for i = 1:n
    value_att{i} = unique(x(:,i));
end

%probabilities,Eq.34
p_ult = cell(1,n);
for i = 1:n
    p_ult{i} = zeros(t,num_att(1,i));
end


for i = 1:n
    for j = 1:num_att(1,i)
        for k = 1:t
            nlt = 0;
            for mmt = 1:number_in_cluster(1,k)
                if value_att{i}(j) == R{k}(mmt,i)
                    nlt = nlt + 1;
                end
            end
            nlt = nlt / number_in_cluster(1,k);
            p_ult{i}(k,j) = nlt / number_in_cluster(1,k);
        end
    end
end


%Hlt,Eq.35
Hlt = zeros(t,n);
for i = 1:t
    for j = 1:n
        for v = 1:num_att(1,j)
            if p_ult{j}(i,v) ~= 0
                Hlt(i,j) = Hlt(i,j) - p_ult{j}(i,v)*log(p_ult{j}(i,v));
            end
        end
    end
end

%Eq.36
Ht = zeros(1,t);
for i = 1:t
    for j = 1:n
        Ht(1,i) = Ht(1,i) + Hlt(i,j);
    end
    Ht(1,i) = Ht(1,i)/n;
end

%Eq.37
entropy_R = 0;
for i = 1:t
    entropy_R = entropy_R + Ht(1,i);
end
entropy_R = entropy_R / t;

2.3 Compactness

原理解释

一个聚类’‘i’'的Compactness度量被定义为其元素之间的平均距离。这个平均值被称为簇的直径或Compactness。
在这里插入图片描述
xjl 表示 对象 j 的第 l 个属性,同理xkl;

i表示第i个簇;

m表示数据集所有对象的和;

mi表示聚类i中对象和。

计算上述公式,得到直径,接下来就可以计算Compactness:
在这里插入图片描述
C表示簇的总和。

Python 代码
def compactness(label, x):
    m = x.shape[0]
    n = x.shape[1]
    k = len(np.unique(label))
    value_label = np.unique(label)

    number_in_cluster = np.zeros(k, int)
    for i in range(m):
        for j in range(k):
            if label[i] == value_label[j]:
                number_in_cluster[j] += 1

    R = np.zeros(k)
    for i in range(k):
        R[i] = np.zeros((number_in_cluster[i], n))

    for i in range(k):
        count_x_in_rt = 0
        for j in range(m):
            if label[j] == value_label[i]:
                for v in range(n):
                    R[i][count_x_in_rt, v] = x[j, v]
                count_x_in_rt += 1

    dm = np.zeros(k)
    for i in range(k):
        for j in range(number_in_cluster[i]):
            for h in range(j + 1, number_in_cluster[i]):
                for l in range(n):
                    # Eq.38
                    dt = 0
                    if R[i][j, l] != R[i][h, l]:
                        dt = 1
                    dm[i] += dt ** 2

        dm[i] = dm[i] / (number_in_cluster[i] * (number_in_cluster[i] - 1))

    Compactness = np.zeros(k)
    for i in range(k):
        Compactness[i] = dm[i] * (number_in_cluster[i] / m)
    Compactness = np.sum(Compactness)

    return Compactness
Matlab 代码
function  Compactness = CpS(Cluster_lable,x,n)
% n is the number of attributes (categorical).

[m,~] = size(x);
t = length( unique( Cluster_lable ) );
R = cell(1,t);
value_lable = unique( Cluster_lable );
number_in_cluster = zeros(1,t);

for i = 1:m
    for j = 1:t
        if Cluster_lable(i) == value_lable(j)
            number_in_cluster(1,j) = number_in_cluster(1,j) + 1;
        end
    end
end

for i = 1:t
    R{i} = zeros(number_in_cluster(1,i),n);
end

%record cluster R
for i = 1:t
    count_x_in_rt = 1;
    for j = 1:m
        if Cluster_lable(j) == value_lable(i)
            for v = 1:n
                R{i}(count_x_in_rt,v) = x(j,v);     
            end
            count_x_in_rt = count_x_in_rt + 1;
        end
    end
end



%Eq.39
dm = zeros(1,t);
for i=1:t
    for j = 1:number_in_cluster(1,i)
        for k = j+1:number_in_cluster(1,i)
            for l = 1:n
                %Eq.38
                dt = 0;
                if R{i}(j,l) ~= R{i}(k,l)
                    dt = 1;
                end
                dm(1,i) = dm(1,i) + dt^2;
            end
        end
    end
    dm(1,i) = dm(1,i) / (number_in_cluster(1,i) * (number_in_cluster(1,i)-1));
end

Compactness = 0;
for i = 1:t
    Compactness = Compactness + dm(1,i)*(number_in_cluster(1,i)/m);
end

2.4 Silhouette Index

原理解释

在这里插入图片描述
轮廓系数我将引用论文中的一个图来解释

符号解释:

j j j 是被随机选择的一个object;

W W W 是j所属的簇;

w(j) 表示与对象j相同的,均来自同一聚类的所有对象,通俗化来说,即来自W的所有聚类对象之间相似度的平均值;

y ( j , c ) y(j, c) y(j,c) 表示对象 j j j c c c 之间的相似度;

C C C Z Z Z是另外两个聚类。

使得 z ( j ) z(j) z(j) 拥有最高的相似度,具体公式可以表示为:
在这里插入图片描述

  • 第一种情况,当SHI(j) 接近1,表明该对象已经被 "紧紧地归类 "了。这种情况发生在集群W中的对象之间的平均相似度 w(j) 大于它们与集群 C 中的对象之间的相似度。换句话说,这意味着对象 j 不需要更换聚类方案了。
  • 第二种情况,当SHI(j)值等于零,表明是两者均可的情况。这种情况发生在相似度 w(j )和 z(j) 所包含的数值几乎相等的情况下,因此,对象j在W和C中都会被紧密地聚在一起。
  • 第三种情况,当SHI(j)值接近于-1的时候,表明对象 j 被 “糟糕地聚为一类”。当聚类中的对象之间的平均相似度w(j)小于该聚类和聚类C中的对象之间的相似度时,就会发生这种情况。一般来说,这意味着对象j在C群中的聚类效果比在W群中的效果更好。
Python 代码
from sklearn import metrics
# x means dataset; 
metrics.silhouette_score(x,label)

有库就不用造轮子啦~

Matlab 代码

附图:
在这里插入图片描述
以上 Python 代码是根据公式码的,有任何问题欢迎批评指正~ ,Matlab 代码是我同事写的,已经咨询本人意见啦~

总结

聚类指标千千万,还得看你方法硬不硬,希望科研小白能继续坚持

整理不易,欢迎点赞关注支持~

聚类有效性评价指标(4个内部4个外部)
10-28
常用内部(Sil,CH,DBI,KL)、外部评价指标(Rand等4个),用自带样本集“leuk72_3k.txt”测试可用!
聚类外部评价指标NMI, AC, ARI
12-04
代码包含三个聚类分析常用的外部评价指标:调整兰德指数(ARI),标准化互信息(NMI),准确度(AC)。
聚类指标】如何评估聚类算法:外部指标内部指标指标详解
Danger的博客
02-24 1万+
聚类指标】如何评估聚类算法:外部指标内部指标指标详解
聚类外部指标 Mirkin指数(Rand指数变换)
qq_42364307的博客
12-18 1164
聚类常用的外部指标有很多如Jaccard系数,FM指数,Rand指数,DB指数,Dunn指数。 因为在阅读文献中发现了Mirkin指数,看了一下网上没有写很详细,故这里介绍Mirkin指数。 预 对于数据集D=x1,x2,...,xmD={x_{1},x_{2},...,x_{m}}D=x1​,x2​,...,xm​,假定通过聚类给出的簇划分为C=C1,C2,...,CkC={C_{1},C_{2},...,C_{k}}C=C1​,C2​,...,Ck​,参考模型(如果用于一致性聚类,这里是另一个聚类即可)
聚类算法评价指标Precision,F-meare,F1,ACC
03-11
聚类算法评价指标
机器学习的模型随机打印标签,ACCNMI计算方法?
hhbbxx66的博客
11-27 1952
机器学习的模型随机打印标签,ACCNMI计算方法? 机器学习中实现了一个简单的神经网络,但发现在验证的时候,模型对数据打的标签很随意,比如一个四分类问题,groundtruth(简称gt)是gt = [0,0,0,1,2,3,3],而模型在验证集上打的标签是lb = [3,3,3,0,1,2,2],但acc(准确度)是100%,明明标签的数字都对不上,我很好奇它使怎么识别的? 具体代码: defclustering_acc(y_true, y_pred): y_true = y_true.asty.
聚类外部指标(Purity, ARI, NMI, ACC) 和内部指标(NCC,Entropy,Compactness,Silhouette Index)
最新发布
zgw555555的专栏
05-31 1167
请注意,对于 Python 代码,我假设您已经导入了必要的库(如 numpy 和 sklearn)并且您有一个名为 X 的数据矩阵和一个名为 y 的真实标签向量。在 Matlab 中,您需要自己编写或找到计算这些指标的函数,因为 Matlab 的 Statistics and Machine Learning Toolbox 中可能没有直接提供所有这些指标。Purity (纯度): 计算聚类结果中每个簇中最多数目的样本所属的类别,并计算所有簇的该类别样本数之和占所有样本数的比例。
ACC+NMI+MD.rar_NMI ACC_nmi指标_nmi聚类_聚类NMI_聚类精度
07-15
用于评价聚类算法的三种常用指标,包括ACCNMI和MD。主用用于采用获得的标签与已知标准匹配,从而得到分类精度。
ClusteringMeasure.zip_PUR_acc nmi_nmi_聚类acc_聚类指标
07-14
用于聚类结果的分析,包括三种评测指标ACC,PUR,NMI
聚类指标ACC和Purity
zl_Dream的博客
07-13 3665
聚类的评价指标ACC与purity有相似的地方,在一些情况下二者的数值会相等,而它们又不是一个东西聚类准确率,假设有NNN个样本,第iii个样本聚类产生的标签是pip_ipi​,真实标签是yiy_iyi​,那么 ACC=1N∑iNyi=map(pi) ACC = \frac{1}{N}\sum^N_i{y_i = map(p_i)} ACC=N1​i∑N​yi​=map(pi​) 其中map(⋅)map(\cdot)map(⋅)表示聚类标签的再分配,一般采用匈牙利算法实现,直观的一个例子如下: y=[1,1
聚类评价指标
05-02
很好的资源,研究聚类的个数是很有用的东西啊 呵呵
机器学习算法基础--聚类问题的评价指标
m0_71819746的博客
10-01 2674
机器学习算法基础--聚类问题的评价指标
无监督聚类评价指标,RI、ARI、MI、NMI
热门推荐
qq_43532776的博客
11-25 1万+
无监督聚类评价指标,RI、ARI、MI、NMI等 最近在看无监督学习聚类的评价指标,主要看了RI、ARI、MI、NMI,在此写下我自己对于这些指标的理解。 1. **RI(Rand Index)**是比较两个聚类结果的参数,也可以比较一个聚类算法的结果和真实分类情况。他是将所有情况进行枚举,来看看有所有pair在聚类算法1和聚类算法2中的情况一致。 Examples:比如有5个数据点,x是聚类1返回的结果,y是聚类2返回的结果。 x:[1, 1, 2, 3, 3]
10种Python聚类算法完整操作示例(建议收藏
机器学习算法那些事
03-08 4576
来源:海豚数据科学实验室著作权归作者所有,本文仅作学术分享,若侵权,请联系后台删文处理!!文末每日小知识点哦!!聚类聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的...
聚类分析 | 聚类有效性评价指标外部AR,RI,MI,HI(MATLAB
天天酷科研的博客
04-08 715
聚类分析 | 聚类有效性评价指标外部AR,RI,MI,HI(MATLAB
【复杂网络】社团划分结果评估指标:Q、ARINMI
小白兔的窝
11-29 5984
社团划分结果评估指标:Q、ARINMI 一、模块度Q(Modularity) 模块度也称模块化度量值,是目前常用的一种衡量网络社区结构强度的方法,最早由Mark NewMan提出了。模块度的定义为: 模块度值的大小主要取决于网络中结点的社区分配C,即网络的社区划分情况,可以用来定量的衡量网络社区划分质量,其值越接近1,表示网络划分出的社区结构的强度越强,也就是划分质量越好。因此可以通过最大化模块度Q来获得最优的网络社区划分。 Python:可以直接使用Community.modularity(
python 编写聚类指标purity纯度和jaccard函数
weixin_45529837的博客
05-24 2169
自编purity纯度和jaccard函数,最后运算速度都挺快的,另外,似乎用scipy中的混淆矩阵也可以编写scipy,而且要比我写的jaccard简便一些,可能是把我写的一些封装了吧。 from sklearn import datasets from sklearn.utils.linear_assignment_ import linear_assignment import seaborn as sns import matplotlib.pyplot as plt import copy from
聚类精确度(Cluster Accuracy)
Micheal 超 的博客
04-24 1万+
概念:
社区发现评价指标Q和NMI讲解、代码实现
像写诗一样优雅地写代码~
05-27 1万+
社区发现评价指标Q和NMI讲解、代码实现 文章目录社区发现评价指标Q和NMI讲解、代码实现模块度Q标准化互信息NMI代码实现参考文献 模块度Q 2004年Newman等人提出了模块度Q,之后广泛应用于衡量社区的划分质量,下面公式适用于无向无权的同质网络。若社区内节点的边数越多,Q值越大,相反,Q值越小。 Q=12m∑i,j[Aij−didj2m]δ(Ci,Cj) Q=\frac{1}{2m}\sum_{i,j}\Big[A_{ij}-\frac{d_id_j}{2m}\Big]\delta(C_i,C_j)
聚类外部评价指标nmi,ac,ari
07-03
### 回答1: 聚类外部评价指标NMI(Normalized Mutual Information)、AC(Accuracy)和ARI(Adjusted Rand Index)是用于评估聚类算法的指标。 首先,NMI是一种用于测量两个聚类结果之间的相似性的指标,它通过计算聚类结果和真实标签之间的互信息来量化它们的一致性。NMI的取值范围为0到1,值越高表示聚类结果与真实标签越相似。 其次,AC是一种评估聚类算法准确性的指标,它通过计算聚类结果中正确分类的样本数量与总样本数量的比例来衡量。AC的取值范围为0到1,值越高表示聚类结果越准确。 最后,ARI是一种通过比较聚类结果和真实标签之间的一致性来评估聚类算法的指标ARI的取值范围为-1到1,值越接近1表示聚类结果与真实标签越一致,值越接近-1表示聚类结果与真实标签越不一致。 这三个指标聚类算法评估中起着重要的作用。NMI可以揭示聚类结果的一致性程度,AC可以评估聚类结果的准确性,而ARI可以综合考虑聚类结果的一致性和准确性。通过使用这些指标,可以对不同的聚类算法进行客观的比较和评估,选择最合适的算法进行分析任务。 ### 回答2: 聚类外部评价指标是用来评估聚类算法结果与已知标签或人工分类之间的一致性程度。其中常用的三个评价指标NMI(Normalized Mutual Information)、AC(Accuracy)和ARI(Adjusted Rand Index)。 NMI是通过计算聚类结果与已知类别之间的互信息来度量聚类的一致性。它将聚类结果与已知类别之间的相似性量化为一个范围在0到1之间的数值,数值越高表示聚类结果与已知类别的一致性越高。 AC是通过计算聚类结果中正确分类的样本数量除以总样本数来度量聚类的准确性。AC的取值范围为0到1之间,取值越高表示聚类结果的准确性越高。 ARI是通过计算聚类结果与已知类别之间的兰德系数来度量聚类的一致性。ARI的取值范围在-1到1之间,取值越高表示聚类结果与已知类别的一致性越好。当ARI为0时,表示聚类结果与已知类别的一致性与随机分配结果相同。 这三个评价指标可以帮助我们评估聚类算法的效果,选择合适的聚类算法或调整算法参数。在实际应用中,我们可以根据具体情况选择适合的评价指标来进行聚类结果的评估和比较,以提高聚类结果的准确性和一致性。 ### 回答3: 聚类外部评价指标NMI(Normalized Mutual Information,标准化互信息)、AC(Accuracy,准确率)和ARI(Adjusted Rand Index,调整兰德指数)是常用的评价聚类效果的指标NMI是通过计算聚类结果与真实类别之间的互信息来衡量聚类的准确性。互信息度量了聚类结果与真实类别之间的相似程度,值越大表示聚类结果越接近真实类别。NMI的取值范围在0到1之间,值越接近1表示聚类效果越好。 AC是一种简单直观的评价指标,计算分类正确的样本占总样本数的比例。准确率越高表示聚类结果与真实类别的一致性越高,当准确率为1时代表聚类结果完全与真实类别一致。 ARI是通过计算聚类结果与真实类别之间的兰德指数,对随机聚类取值进行了修正。兰德指数度量了聚类结果中相似样本对在真实类别中也属于同一类别的程度。ARI的取值范围在-1到1之间,值越大表示聚类效果越好,如果结果为0则表示聚类结果与随机聚类结果没有差异。 综合来看,NMI、AC和ARI都是常用的聚类外部评价指标,用于衡量聚类结果与真实类别的一致性和准确性。在进行聚类结果评估时,可以根据具体的需求选择合适的评价指标进行评估。
写文章

热门文章

  • 聚类的外部指标(Purity, ARI, NMI, ACC) 和内部指标(NCC,Entropy,Compactness,Silhouette Index),附代码 (Python 和 Matlab) 10175
  • 如何写一封向论文作者申请源代码的邮件 6924
  • 匈牙利算法原理与Python实现 1672
  • 计算机网络知多少-第1篇 1128
  • Mit6.s081 前置开发环境: 虚拟机ubuntu + ssh + vscode 1074

分类专栏

  • 操作系统 1篇
  • C++算法 17篇
  • 面试专栏-计算机网络 1篇
  • 科研工作tips 4篇
  • 聚类 6篇
  • 雅思 1篇
  • MindSpore 1篇

最新评论

  • 聚类的外部指标(Purity, ARI, NMI, ACC) 和内部指标(NCC,Entropy,Compactness,Silhouette Index),附代码 (Python 和 Matlab)

    szuers: 请教一下博主,上述4个内部指标计算中x指代的是什么参数呢?谢谢

  • Python 实现分类数据的 Accuracy 【ACC】外部评估指标

    白巧克力~: 请问为什么会出现这种0.0的情况呢?

  • Python 实现分类数据的 Accuracy 【ACC】外部评估指标

    阿卡西番茄酱: 当聚类预测种类数大于标签种类数的时候,pre和true顺序相反会导致误差矩阵E的行和列索引对应的关系发生变化,导致最优指派方案不同,也就是E此时的nC是不正确的,你看一下代码逻辑。

  • Python 实现分类数据的 Accuracy 【ACC】外部评估指标

    weixin_51507359: 这个情况是当聚类预测种类数大于标签种类数时

  • Python 实现分类数据的 Accuracy 【ACC】外部评估指标

    weixin_51507359: nMacth也可以这么求sum(E[matchs])吧,博主您好我现在遇到一个问题,把pre和true顺序相反输入后,求出来的结果是不一样的,这让我很不理解,请问您试过吗

最新文章

  • 极客时间-操作系统实战第一讲 HelloOS【踩了一天的坑,终于补完了】
  • SSH连接不上虚拟机,可以这么做
  • 常用的设计模式(单例模式和工厂模式)
2024年24篇
2023年15篇
2021年1篇

目录

目录

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

天下网标王新蔡县网站优化排名遂宁网站seo优化公司英山网站推广优化哪家好惠普网站的结构与优化建议网站优化之注重用户建议网站内外部优化要学什么解放号网站优化推荐网站设计优化价格优惠浦口区优化网站排名音乐网站优化seo网站如何做seo优化成都优化网站哪家好招聘网站简历的优化网站优化的优势特点瑞安网站seo优化优化网站自然排名宁波象山县受欢迎百度网站优化莱芜网站优化效果乌鲁木齐做网站优化有做网站优化高手吗雄安网站建设优化公司绵竹做网站优化淮安网站优化电话优化网站排名品项云速捷热门网站优化有哪些方式莱芜网站优化单价企业网站优化需要注意哪些南昌网站SEO优化google网站优化自己的网站怎么优化排名香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化