聚类算法性能度量

  • 前言
  • 一、实验目的
  • 二、实验内容
    • 1、变量a,b,c,d
    • 2、Jaccard系数
    • 3、闵可夫斯基距离
    • 4、avg,diam,dmin,dcen,DB指数
      • 4.1 avg(C)
      • 4.2 diam(C)
      • 4.3 dmin(C1,C2)
      • 4.4 dcen(C1,C2)
      • 4.5 DB指数
    • 5-1、VDM,无序属性处理
    • 5-2、MinkovDM,混合属性处理
    • 6、归一化
  • 三、实验结果
    • 1、abcd和Jaccard系数
    • 2、avg,diam,dmin,dcen,DB指数
      • 2.1 avg(C)
      • 2.2 diam(C)
      • 2.3 dmin(C1,C2)
      • 2.4 dcen(C1,C2)
      • 2.5 DB指数
    • 3、VDM和MinkovDM
      • 3.1 VDM
      • 3.2 MinkovDM
    • 4、 归一化
  • 四、结语

前言

本次实验是针对聚类算法的性能度量,换言之是计算评价一个聚类结果好坏的值。聚类算法本身在sklearn或是matlab的工具箱中都有实现,因此我们并不着眼于此。

一、实验目的

  1. 编程实现a,b,c,d

  2. 编程实现Jaccard系数

  3. 编程实现DB指数

  4. 编程实现距离公式,p=1,p=2

  5. 编程实现MinkovDMp

  6. 编程实现归一化

二、实验内容

1、变量a,b,c,d

我们首先给出a,b,c,d的定义:

a=∣SS∣,SS={(xi,xj)∣λi=λj,λi′=λj′,i<j}a=|SS|,SS=\left\{(x_i,x_j)|\lambda_i=\lambda_j,\lambda_i^{'}=\lambda_j^{'},i<j\right\}a=∣SS∣,SS={(xi​,xj​)∣λi​=λj​,λi′​=λj′​,i<j}

b=∣SD∣,SD={(xi,xj)∣λi=λj,λi′≠λj′,i<j}b=|SD|,SD=\left\{(x_i,x_j)|\lambda_i=\lambda_j,\lambda_i^{'}\neq\lambda_j^{'},i<j\right\}b=∣SD∣,SD={(xi​,xj​)∣λi​=λj​,λi′​​=λj′​,i<j}

c=∣DS∣,DS={(xi,xj)∣λi≠λj,λi′=λj′,i<j}c=|DS|,DS=\left\{(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda_i^{'}=\lambda_j^{'},i<j\right\}c=∣DS∣,DS={(xi​,xj​)∣λi​​=λj​,λi′​=λj′​,i<j}

d=∣DD∣,DD={(xi,xj)∣λi≠λj,λi′≠λj′,i<j}d=|DD|,DD=\left\{(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda_i^{'}\neq\lambda_j^{'},i<j\right\}d=∣DD∣,DD={(xi​,xj​)∣λi​​=λj​,λi′​​=λj′​,i<j}

其中,λi\lambda_iλi​表示聚类得到的簇标记向量,而λi′\lambda_i^{'}λi′​是参考模型给出的簇标记向量。根据定义,我们可以写出如下代码:

function [a,b,c,d]=get_abcd(result,reference)
% result是聚类得到的簇划分
% reference是参考模型给出的簇划分
a=0;
b=0;
c=0;
d=0;for i=1:length(result)-1for j=i+1:length(result)if((result(i)==result(j)) && reference(i)==reference(j))a=a+1;endif((result(i)==result(j)) && reference(i)~=reference(j))b=b+1;endif((result(i)~=result(j)) && reference(i)==reference(j))c=c+1;endif((result(i)~=result(j)) && reference(i)~=reference(j))d=d+1;end end
end

测试与结果展示将在第三部分“实验结果”中呈现,下同。

2、Jaccard系数

Jaccard系数是用来衡量聚类结果的一个外部指标,其表达式如下:

JC=aa+b+cJC=\frac{a}{a+b+c}JC=a+b+ca​

在0-1区间内,该值越大越好。代码实现如下:

function JC=Jaccard(a,b,c)
% 求Jaccard系数
% JC值在[0-1]间越大越好
JC=a/(a+b+c);

3、闵可夫斯基距离

从现在开始我们要对聚类结果进行内部指标的度量,而主要的衡量标准就是“距离”。一个好的聚类结果,应该有尽可能小的“簇内距离”和尽可能大的“簇间距离”,不过第一步是计算距离的值,我们采用闵可夫斯基距离公式,即:

dist(xi,xj)=(∑u=1n∣xiu−xju∣p)1pdist(x_i,x_j)=(\sum_{u=1}^{n}|x_{iu}-x_{ju}|^p)^{\frac{1}{p}}dist(xi​,xj​)=(∑u=1n​∣xiu​−xju​∣p)p1​

xix_ixi​和xjx_jxj​是两个样本,它们各有n个连续型属性。我们逐属性做差求距离,p=2时计算的是欧氏距离,p=1时计算的是曼哈顿距离,代码如下:

function dist=Minkowski_distance(x1,x2,p)
% 闵可夫斯基距离是一个通用距离公式,p=2时是欧氏距离,p=1时是曼哈顿距离
dist=0;for i=1:length(x1)  % u=1:ndist=dist+abs(x1(i)-x2(i))^p;
enddist=dist^(1/p);

4、avg,diam,dmin,dcen,DB指数

有了距离的计算方法之后,我们就可以进一步计算具有代表意义的几个距离值了。

4.1 avg(C)

首先是对于一个簇内部的相关特征。一个簇C内样本间的平均距离可以体现簇的紧密程度,其表达式如下:

avg(C)=2∣C∣(∣C∣−1)∑1≤i≤j≤∣C∣dist(xi,xj)avg(C)=\frac{2}{|C|(|C|-1)}\sum_{1 \leq i \leq j \leq |C|}dist(x_i,x_j)avg(C)=∣C∣(∣C∣−1)2​∑1≤i≤j≤∣C∣​dist(xi​,xj​)

function avg=cal_avg(C1)
% 簇C1内样本间的平均距离
avg=0;for i=1:length(C1)-1for j=i+1:length(C1)avg=avg+Minkowski_distance(C1(i,:),C1(j,:),2);end
endavg=avg*2/(length(C1)*(length(C1)-1));
4.2 diam(C)

一个簇C内样本间的最远距离则体现了簇的宽容度,其表达式如下:

diam(C)=max1≤i≤j≤∣C∣dist(xi,xj)diam(C)=max_{1 \leq i \leq j \leq |C|}dist(x_i,x_j)diam(C)=max1≤i≤j≤∣C∣​dist(xi​,xj​)

function diam=cal_diam(C1)
% 簇C1内样本间的最远距离
diam=0;for i=1:length(C1)-1for j=i:length(C1)temp=Minkowski_distance(C1(i,:),C1(j,:),2);if(temp>diam)diam=temp;endend
end
4.3 dmin(C1,C2)

然后是两个簇之间的距离特征。dmin(C1,C2)d_{min}(C1,C2)dmin​(C1,C2)求取的是两个簇CiC_iCi​和CjC_jCj​最近样本间距离。显然最近样本间距离如果过小分类就不很准确。

function dmin=cal_dmin(C1,C2)
% 簇C1与C2最近样本间的距离
dmin=0;for i=1:length(C1)for j=1:length(C2)temp=Minkowski_distance(C1(i,:),C2(j,:),2);if(i==1 && j==1)dmin=temp;elseif(temp<dmin)dmin=temp;endendend
end
4.4 dcen(C1,C2)

dcen(C1,C2)=dist(μi,μj)d_{cen}(C1,C2)=dist(\mu_i,\mu_j)dcen​(C1,C2)=dist(μi​,μj​),是求取簇CiC_iCi​和CjC_jCj​中心点间的距离,也就是我们所说的簇间距离。好的聚类应该有尽可能大的簇间距离

function dcen=cal_dcen(C1,C2)
% 簇C1与簇C2中心点间的距离% 计算中心点
u1=mean(C1,1);
u2=mean(C2,1);dcen=Minkowski_distance(u1,u2,2);
4.5 DB指数

DB指数综合了簇间距离和簇内距离两个指标,定义了一个判断聚类效果好坏的值:

DBI=1k∑i=1kmaxj≠i(avg(Ci)+avg(Cj)dcen(μi,μj))DBI=\frac{1}{k}\sum_{i=1}^k max_{j \neq i}(\frac{avg(C_i)+avg(C_j)}{d_{cen}(\mu_i,\mu_j)})DBI=k1​∑i=1k​maxj​=i​(dcen​(μi​,μj​)avg(Ci​)+avg(Cj​)​)

注意DB指数是对整个聚类结果的评估,因此传入参数应该是C={C1,C2,...,Ck}C=\left\{C_1,C_2,...,C_k\right\}C={C1​,C2​,...,Ck​}

function DBI=cal_DBI(C)
% DB指数,越小越好
% C是三维矩阵(ni,mj,k),表示一共k个簇。每个簇为ni个样本,mj个属性
DBI=0;
max=0;
[~,~,k]=size(C);for i=1:kfor j=1:kif(i~=j)temp=(cal_avg(C(:,:,i))+cal_avg(C(:,:,j)))/(cal_dcen(C(:,:,i),C(:,:,j)));if(temp>max)max=temp;endendendDBI=DBI+max;max=0;
endDBI=DBI/k;

5-1、VDM,无序属性处理

第三步中我们实现了对于连续型属性的距离求解,但是很多时候我们的数据都是离散型的,甚至没有的1、2、3这样有数值关系上的“接近”,而是{飞机、火车、轮船}这样的无序属性。但是聚类的评价标准又确实是距离,因此我们必须用另外的公式来计算两个样本间的距离。

VDMp(a,b)=∑i=1k∣mu,a,imu,a−mu,b,imu,b∣pVDM_{p}(a,b)=\sum_{i=1}^{k}|\frac{m_{u,a,i}}{m_{u,a}}-\frac{m_{u,b,i}}{m_{u,b}}|^{p}VDMp​(a,b)=∑i=1k​∣mu,a​mu,a,i​​−mu,b​mu,b,i​​∣p

mu,am_{u,a}mu,a​表示的是全体簇中在属性u上取值为a的样本数,而mu,a,im_{u,a,i}mu,a,i​表示在第i个簇中,在属性u上取值为a的样本数。正因如此,我们在计算VDM时需要传入的参数有:选定属性u,属性u取值a和b,簇集合C,距离公式选择p。

function vdm=VDM(a,b,C,u,p)
% VDM计算属性u上两个离散值a与b之间的VDM距离
% C为簇集合,u为属性所在列号,p为距离选择
vdm=0;
[~,~,k]=size(C);% m_u_a(b)表示属性u上取值为a(b)的样本数
m_u_a=length(find(C(:,u,:)==a));
m_u_b=length(find(C(:,u,:)==b));for i=1:km_u_a_i=length(find(C(:,u,i)==a));m_u_b_i=length(find(C(:,u,i)==b));vdm=vdm+(abs((m_u_a_i/m_u_a)-(m_u_b_i/m_u_b)))^p;
end

5-2、MinkovDM,混合属性处理

更多的时候,我们研究的问题会同时包含连续型属性和离散型属性,因此我们需要结合前面计算的两者来完成两个样本间距离的描述:

MinkovDMp(xi,xj)=(∑u=1nc∣xiu−xju∣p+∑u=nc+1nVDMp(xiu,xju))1pMinkovDM_{p}(x_i,x_j)=(\sum_{u=1}^{n_c}|x_{iu}-x_{ju}|^{p}+\sum_{u=n_c + 1}^{n}VDM_{p}(x_{iu},x_{ju}))^{\frac{1}{p}}MinkovDMp​(xi​,xj​)=(∑u=1nc​​∣xiu​−xju​∣p+∑u=nc​+1n​VDMp​(xiu​,xju​))p1​

function dist=MinkovDM(WM,x1,x2,nc,seq,p)
% 处理混合属性距离,WM为混合属性簇集合
% x1、x2为样本;nc为连续属性和离散属性的分界;seq为1或2,表示先连续后离散或反之;p为距离公式选择
sum1=0; % 连续部分和
sum2=0; % 离散部分和if(seq==1)for i=1:ncsum1=sum1+abs(x1(i)-x2(i))^p;endfor i=nc+1:length(x1)sum2=sum2+VDM(x1(i),x2(i),WM,i,p);end
endif(seq==2)for i=1:ncsum2=sum2+VDM(x1(i),x2(i),WM,i,p);endfor i=nc+1:length(x1)sum1=sum1+abs(x1(i)-x2(i))^p;end
enddist=(sum1+sum2)^(1/p);

6、归一化

多数时候我们需要对样本属性值进行归一化处理,从而避免一个属性的影响被其他属性抵消。归一化的公式有很多,这里我选用了min-max Normalization算法:

y=x−minmax−miny=\frac{x-min}{max-min}y=max−minx−min​

function Y=Normalize(X)
% min-max归一化
% 公式:x'=(x-min)/(max-min)
[m,n]=size(X);
Y=X;for i=1:np=minmax(X(:,i)');  % minmax的结果为[min,max]for j=1:mY(j,i)=(X(j,i)-p(1))/(p(2)-p(1));end
end

三、实验结果

我们的实验流程中需要用到多个不同的数据集,因此下面的实验结果也将分段给出。

1、abcd和Jaccard系数

这里我们需要聚类的结果和参考模型作为数据,我们可以通过随机生成两个向量,或直接输入两个向量来获得:

T1=[1;1;1;2;2]; % 参考模型
T2=[1;2;1;1;2];    % 聚类结果[a,b,c,d]=get_abcd(T2,T1);   % 求a、b、c、d
JC=Jaccard(a,b,c); % 求Jaccard系数

结果如下图:

2、avg,diam,dmin,dcen,DB指数

这一部分用到的均为连续型属性值,因此我调用了iris数据集对其进行测试。按照之前实验的流程获得iris数据变量后,我将其划分为了下图样子:

C1、C2、C3分别是iris中标签为1、2、3的样本,也就相当于三个簇。而C是一个三维矩阵,是将C1、C2、C3聚合得到的,这样我们就得到了簇集合C={C1,C2,C3},下面开始进行测试。

2.1 avg(C)

由于我的avg函数传入的形参是一个簇,因此需要在主函数中循环调用才可以得到所有簇内样本间平均距离。

% main.m %
[~,~,c]=size(C);
avg=[];for i=1:cavg(i)=cal_avg(C(:,:,i));
end

2.2 diam(C)

簇内样本间最远距离也是同理

[~,~,c]=size(C);
diam=[];for i=1:cdiam(i)=cal_diam(C(:,:,i));
end

2.3 dmin(C1,C2)

簇间的一些度量就需要手动输入参数计算了

dmin_12=cal_dmin(C1,C2);
dmin_13=cal_dmin(C1,C3);
dmin_23=cal_dmin(C2,C3);

2.4 dcen(C1,C2)
dcen_12=cal_dcen(C1,C2);
dcen_13=cal_dcen(C1,C3);
dcen_23=cal_dcen(C2,C3);

2.5 DB指数

3、VDM和MinkovDM

从第五步开始我们需要用到无序离散型数据,因此我决定选用西瓜数据集,其原始数据如下:

我们将其中的文字转化为数字(matlab中cell数据不可以进行布尔运算),结果如下:

3.1 VDM

测试VDM时我们只需要完全的离散型数据即可,也就是色泽-触感的数据,因此我们将其读入matlab,得到W1、W2,以及由W1和W2聚合得到的W。

我们以如下参数调用:

vdm=VDM(1,2,W,3,2);

表示求取第3列属性(敲声)中,值为1(浊响)和2(沉闷)的两个离散值之间的欧式VDM距离。其结果为:

3.2 MinkovDM

然后是测试具有混合属性的两个样本之间的距离。这一次我们将密度和含糖率也导入matlab,获得WM1、WM2,以及由WM1和WM2聚合得到的WM

以如下参数调用:

dist=MinkovDM(WM,WM(1,:,1),WM(5,:,1),6,2,2);
% 或者 dist=MinkovDM(WM,WM1(1,:),WM1(5,:),6,2,2);

其结果如下:

4、 归一化

我们用鸢尾花数据中的C1作为参数,调用归一化函数,得到结果如下:

四、结语

这应该是本学期的倒数第三或第二次实验了。总的来说这学期的机器学习理论难度都是高于实践难度的,可能是考虑到我们菜水平有限,老师没有涉及更加复杂的实验,不过说实话课上学的也只是皮毛,多数内容还是需要自学才能更好的掌握。

【学习机器学习】实验——聚类算法性能度量相关推荐

  1. 如何学习机器学习、看待算法竞赛?粉丝精选留言

    在前几日的赠书活动中,看到大家的积极留言,非常用心,可以看出对机器学习的热爱.经授权,CV君特意将一些52CV粉丝对学习机器学习.参与算法竞赛的看法.理解与经验放出来,与大家分享,值得收藏细品,希望他 ...

  2. 机器学习之聚类算法——聚类效果评估可视化

    我曾在机器学习之聚类算法应用篇中介绍过,聚类算法常使用轮廓系数来评估聚类效果,不过有时候并不是轮廓系数越大越好,如下面两幅图所示,图中的红色虚线表示聚类系数分数: 显然将簇数据设置为2的时候得到的轮廓 ...

  3. 【机器学习】聚类算法DBSCAN、K-means、Mean Shift对比分析及具体代码实现

    [机器学习]聚类算法DBSCAN.K-means.Mean Shift对比分析及具体代码实现 一.DBSCAN算法(具有噪声的基于密度的聚类方法) 1.算法原理 基于数据分布密度不同对数据进行聚类,把 ...

  4. 大数据聚类算法性能比较及实验报告

    在大数据领域这个聚类算法真是起到了十分重要的作用,只有通过有效地聚类才能得到非常直观的结果. 有一个实验要求对比两种大数据聚类算法的性能,具体的代码也不是由我实现的,我只是改了一部分,主要还是博客大佬 ...

  5. [学习笔记] [机器学习] 8. 聚类算法(聚类算法:K-means、K-means++;聚类算法评估;特征降维:特征选择(Pearson相关系数、Spearman相关系数)、PCA主成分分析)

    视频链接 数据集下载地址:无需下载 1. 聚类算法简介 学习目标: 掌握聚类算法实现过程 知道 K-means 算法原理 知道聚类算法中的评估模型 说明 K-means 的优缺点 了解聚类中的算法优化 ...

  6. 【机器学习-西瓜书】九、聚类:性能度量;距离计算

    关键词:性能度量:距离计算:VDM 9.1聚类任务 聚类任务是无监督学习任务,我们只需要有样本,而不需要有标签.聚类试图将数据集中的样本划分为若干个子集,每个子集称为一个簇(cluster).簇其实就 ...

  7. 机器学习:算法性能度量之查准率与查全率

    我们经常使用错误率(即分类错误的样本占总体样本的比例)来分析一个机器学习算法的性能,但是有时候不能满足任务的需求. 例如,我们想要利用机器学习算法来预测肿瘤是不是恶性的.在训练集中,只有0.5%的样本 ...

  8. [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. C#,人工智能,机器学习,聚类算法,训练数据集生成算法、软件与源代码

    摘要:本文简述了人工智能的重要分支--机器学习的核心算法之一--聚类算法,并用C#实现了一套完全交互式的.可由用户自由发挥的,适用于聚类算法的训练数据集生成软件--Clustering.用户使用鼠标左 ...

最新文章

  1. .net core HttpContext(Http上下文)
  2. MySQL新建用户,授权,删除用户,修改密码
  3. Apache手工编译安装(内附软件包)
  4. vtigercrm中添加用户字段_linux笔记(一):linux添加用户并赋予root权限
  5. pandas nat_EDA神器pandas-profiling万岁?
  6. C语言——超市商品管理系统
  7. ldd -r xxx.so命令 undefined symbol即错误定位c++filt
  8. php获取qq头像地址,获取 QQ 头像地址,并且不暴露 QQ 号
  9. 谈下论坛和商城的开发项目
  10. 【matlab】matlab相关系数计算公式(Pearson和Spearman,以及Kendall Rank)
  11. 自己捣鼓的小程序实现订单代付的功能
  12. 计算机中的图表类型,高级会计师《职称计算机》图表制作:主要常用图表类型...
  13. 算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
  14. 数据挖掘经典十大算法_条件熵、信息增益介绍
  15. jQuery实现ajax跨域请求
  16. 老人与海好词100英文带翻译_The_Old_Man_and_The_Sea_老人与海_中英文对照版_(good)
  17. 广州积分入户需要满足哪些条件
  18. 小米路由器探测和测评本人亲测
  19. 重磅!两万字长文总结,梳理 Java 入门进阶哪些事(推荐收藏)
  20. win10没有计算器怎么办【系统天地】

热门文章

  1. 国内从事视觉领域的公司
  2. mysql latid1_mysql 高性能压力测试(总结了好久)
  3. Assignment 2: UDP Pinger[课后作业]
  4. 前端项目中上传图片如何实现的
  5. 记录AOSP源码编译刷机(pixel 4a)
  6. 基于经度坐标校正鱼眼图像
  7. 【达梦数据库的console工具进行备份恢复遇到报错:bakres连接DMAP失败】
  8. Ubuntu完全使用文档
  9. java关键字有什么用_JAVA中关键字有什么用
  10. matlab最基础教程(二):变量类型与赋值