机器学习 - 聚类,聚类类别,聚类相似度,聚类性能度量

news/2024/5/20 5:59:32 标签: 聚类, 机器学习, python

文章目录

聚类

在这里插入图片描述

一、概念

  1. 无监督学习:
    无监督学习(Unsupervised learning):训练样本的标记信息是未知的,目标是为了揭露训练样本的内在属性,结构和信息,为进一步的数据挖掘提供基础。

  2. 监督学习:
    监督学习(supervised learning):训练样本带有信息标记,利用已有的训练样本信息学习数据的规律预测未知的新样本标签

  3. 聚类
    聚类是一种最常用的无监督学习方法,对点集进行考察并按照某种 距离测度 将他们聚成多个“簇”的过程。聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大。


二、聚类的类别

1. 基于划分的聚类

  1. 基本思想:
    划分法(partitioning methods),给定一个有 N 个元组或者纪录的数据集,划分法将构造 K 个分组,每一个分组就代表一个聚类,K < N。而且这 K 个分组满足下列条件:
    (1) 每一个分组至少包含一个数据纪录;
    (2)每一个数据纪录属于且仅属于一个分组(注意:这个要求在某些模糊聚类算法中可以放宽);

  2. 特点:
    计算量大,很适合发现中小规模的数据库中小规模的数据库中的球状簇。

  3. 主要算法:
    k-means、k-medoids、k-modes、k-medians、kernel k-means等算法。

  4. 算法过程:
    K-maens算法过程:

    • 随机选择K个中心值
    • 根据样本数据各点与中心点的距离来进行归簇
    • 通过各个簇的均值,更新为每个簇的中心值
    • 重复2、3,直至聚类中心的位置不再变化

      详情参考博客:https://blog.csdn.net/pentiumCM/article/details/103657283

2. 基于层次的聚类

  1. 基本思想:
    基于层次的聚类算法(Hierarchical Clustering)有两种类型:凝聚的(Agglomerative)层次聚类和分裂的(Divisive)层次聚类。取决于层次的划分是“自底向上”还是“自顶向下”。
    凝聚层次聚类是 “自底向上” 的层次聚类算法,最初将每个数据看成一个簇,从最底层开始,每一次通过合并最相似的聚类来形成上一层次中的聚类,当全部数据点都合并到一个聚类的时候停止或者达到某个终止条件而结束,大部分层次聚类都是采用这种方法处理。
    分裂的(Divisive)层次聚类是 “自顶向下“” 的方法,从一个包含全部数据点的聚类开始,然后把根节点分裂为一些子聚类,每个子聚类再递归地继续往下分裂,直到出现只包含一个数据点的单节点聚类出现,即每个聚类中仅包含一个数据点。

  2. 特点:

  3. 算法流程:
    以下流程以 “自下向上”为例:

    1. 将每个数据看作一类,计算两两之间的最小距离;
    2. 将距离最小的两个类合并成一个新类;
    3. 重新计算新类与所有类之间的距离;
    4. 重复2、3,直到所有类最后合并成一类

  4. 示例:
    如对以下 5 个点进行凝聚层次聚类

xy
点012
点123
点2-33
点3-2-1
点45-1

在坐标轴上的位置:在这里插入图片描述层次聚类结果的聚类树为:在这里插入图片描述
我们可以看出层次聚类的过程为:
  首先将5个点分别看成一簇,为簇0、簇1、簇2、簇3、簇4,
然后将 簇0 和 簇1 聚集作为新的簇为 簇5,继续聚集将 簇2 和 簇3 聚成新簇为簇6,然后聚集 簇5 和 簇6 为新簇为簇7,最后将簇4和簇7聚集为簇8,这时候所有的数据被聚集在一个簇中,算法结束。

  1. 算法实现:
    采用了 python 的 scipy 模块
python">#!/usr/bin/env python
# encoding: utf-8
'''
@Author  : pentiumCM
@Email   : 842679178@qq.com
@Software: PyCharm
@File    : sci_cluster.py
@Time    : 2020/4/15 22:21
@desc	 : scipy实现层次聚类
'''

import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster

from matplotlib import pyplot as plt

data = np.array([[1, 2], [2, 3], [-3, 3], [-2, -1], [5, -1]])

# 画点
plt.scatter(x=data[:, 0:1], y=data[:, 1:2], marker='.', color='red')
n = np.arange(data.shape[0])
for i, txt in enumerate(n):
    plt.annotate(txt, (data[i:i + 1, 0:1], data[i:i + 1, 1:2]))
plt.show()

# 1. 层次聚类
# linkage方法用于计算两个聚类簇s和t之间的距离d(s,t)
# 层次聚类编码为一个linkage矩阵。
Z = linkage(data, 'average')
print("聚类过程:", Z)

# 从给定链接矩阵定义的层次聚类中形成平面聚类
f = fcluster(Z, 4, 'distance')

fig = plt.figure(figsize=(5, 3))
# 将层级聚类结果以树状图表示出来
dn = dendrogram(Z)
plt.show()

算法运行结果:
聚类的主要信息在 Z = linkage(data, ‘average’)中。
Z共有四列组成,第 1 字段与第 2 字段分别为聚类簇的编号,在初始距离前每个初始值被从0~n-1进行标识,每生成一个新的聚类簇就在此基础上增加一对新的聚类簇进行标识,第 3 个字段表示前两个聚类簇之间的距离,第 4 个字段表示新生成聚类簇所包含的元素的个数。

python">聚类过程: [[0.         1.         1.41421356     2.        ]
 		  [2.         3.         4.12310563     2.        ]
 		  [5.         6.         4.75565014     4.        ]
          [4.         7.         6.48606798     5.        ]]

层次聚类可以一次性聚类出所有的情况,当生成出聚类树的结果时,可以通过在聚类树上画水平线来选择聚成几类的结果。如用户需要聚成两类:在这里插入图片描述只需要从上往下画出如上图的水平线来判断聚成两类的结果,可以看出两类的结果,一类为 4,另一类为0、1、2、3。
如果需要聚成3类,只需要将水平线往下平移即可知道聚成三类的结果。


3. 基于密度的聚类


4. 基于网格的聚类


5. 基于模型的聚类


6. 基于模糊的聚类


三、聚类的相似度度量

聚类需要根据 样本特征的相似度 或者 距离 来作为是否归属于某一类的依据,也就是相似的样本归为一类,不相似的样本不归为一类。
度量样本特征的相似度或者距离有多种方式:

1. 闵氏距离:

在这里插入图片描述

  1. 当 p = 1 时,得到绝对值距离,称为曼哈顿距离:在这里插入图片描述
  2. 当 p = 2 时,称为欧式距离:在这里插入图片描述
  3. 当 p = ∞ 时,称为切比雪夫距离:在这里插入图片描述

    闵氏距离是一组距离的定义,随着次数的增加,向量分量中的大值对距离的贡献会越大,极端下切比雪夫距离只考虑最大的那个分量。一般常用欧式距离。
    缺点:(1)没有考虑分量的量纲的影响,相同的特征,变换一下量纲级别就会导致完全不一样的结果。(2)没有考虑各个分量之间的分布(期望,方差),马氏距离解决了这个问题。

2. 马氏距离:

两个服从同一分布并且其整体样本的协方差矩阵为 S 的 样本点 Xi 与 Xj 的差异程度: 在这里插入图片描述当协方差矩阵为单位矩阵的时候,马氏距离就等于欧式距离,当协方差矩阵仅为对角矩阵的时候,即为标准化之后的欧式距离。
马氏距离的两个优点:一是排除了量纲的影响,相当于标准化了,二是排除了变量之间的相关性的影响,相当除掉掉了向量线性相关部分。
马氏距离的缺点:夸大了变化微小变量的作用。


参考资料

  • 聚类算法分类:
    https://blog.csdn.net/count_on_me/article/details/82193745

  • 层次聚类
    https://blog.csdn.net/weixin_44530236/article/details/89160137
    https://blog.csdn.net/andy_shenzl/article/details/83783469#2%E3%80%81scipy%E5%AE%9E%E7%8E%B0

  • 聚类相似度度量:
    https://blog.csdn.net/qq_28012985/article/details/91349511

  • 闵氏距离:
    https://baike.baidu.com/item/%E9%97%B5%E6%B0%8F%E8%B7%9D%E7%A6%BB/22677930?fromtitle=%E9%97%B5%E5%8F%AF%E5%A4%AB%E6%96%AF%E5%9F%BA%E8%B7%9D%E7%A6%BB&fromid=23665511&fr=aladdin


http://www.niftyadmin.cn/n/1663840.html

相关文章

【JavaScript学习笔记】1:js的书写,显示数据,变量,函数

JavaScript描述的是网页的行为&#xff0c;可以直接改变HTML而改变网页的内容&#xff0c;或者提供和用户的交互。 js写在哪里 ①直接写入HTML JavaScript可以写在HTML的script双标签里&#xff0c;一般把这个双标签放在HEAD头里&#xff1a; <!DOCTYPE HTML> <HT…

python 三维绘图

文章目录python三维绘图一、创建三维坐标轴对象Axes3D参考&#xff1a;python三维绘图 一、创建三维坐标轴对象Axes3D 有两种方式&#xff1a; 目的都是生成具有三维格式的对象 Axes3D. 方式一 利用参数 projection‘3d’ 来实现&#xff1a; #!/usr/bin/env python # enco…

【JavaScript学习笔记】2:数据类型

关于js的动态类型 和python一样&#xff0c;js也是一个具有动态类型的语言&#xff0c;之前尝试的一直为x赋各种类型的值就验证了这一点。 动态类型有时会很麻烦&#xff0c;如果需要可以在声明变量时候用new指明类型&#xff1a; var xnew Number(666); undefined x; Numbe…

C的文件输入、输出

c的I/O&#xff0c;基于c primer plus学习c的标准I/Oc的文件I/Oc的标准I/O C的文件概念理解 文件&#xff1a;磁盘或固态硬盘上的一段已命名的存储区。所有的文件内容都是以二进制形式存储到文件。 文本文件&#xff1a;使用二进制编码后的字符来表示文本&#xff08;ASCII&a…

python(sklearn) 聚类性能度量

文章目录python(sklearn) 聚类性能度量一、sklearn聚类评价函数&#xff1a;二、评价函数说明&#xff1a;1. 轮廓系数&#xff08;Silhouette Coefficient&#xff09;2. CH分数&#xff08;Calinski Harabasz Score &#xff09;3. 戴维森堡丁指数(DBI)——davies_bouldin_sc…

c结构体和数组之间的联系

结构体和数组的异同学习的教材说结构体为“超级数组”&#xff0c;所以看看数组和结构体的相似点定义两个简单的结构体和数组并初始化 c99对应的数组指定初始化和结构体指定初始化有相似之处 int a[]{1,[6]23,4} // a[0]1,a[6]23,a[7]4. struct lok { int a; float b; int c[10…

【JavaScript学习笔记】3:变量作用域

局部变量 在函数体内用var声明的是局部变量&#xff0c;在函数结束即销毁&#xff1a; <!DOCTYPE HTML> <HTML> <BODY> </BODY> <HEAD><meta charset"utf-8"><script>//console.log(x); //函数外不可见myfun(); //函数执…

matplotlib 支持中文显示

matplotlib 支持中文显示 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号