机器学习[3]–无监督学习–聚类

一、无监督学习的目标

利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监 督学习。
• 有监督学习和无监督学习的最大区别在于数据是否有标签
• 无监督学习最常应用的场景是聚类(clustering)和降维(Dimension
Reduction)

二、聚类(clustering)

聚类(clustering),就是根据数据的“相 似性”将数据分为多类的过程。
评估两个不同样本之间的“相似性” ,通 常使用的方法就是计算两个样本之间的“距离”。 使用不同的方法计算样本间的距离会关系到聚类 结果的好坏。

欧氏距离
欧氏距离是最常用的一种距离度量方法,源于欧式空间中两点的距离。
其计算方法如下:

曼哈顿距离
曼哈顿距离也称作“城市街区距 离”,类似于在城市之中驾车行驶, 从一个十字路口到另外一个十字楼口
的距离。其计算方法如下:

马氏距离

马氏距离表示数据的协方差距离, 是一种尺度无关的度量方式。也就是 说马氏距离会先将样本点的各个属性 标准化,再计算样本间的距离。其计 算方式如下:(s是协方差矩阵,如 图)

夹角余弦

余弦相似度用向量空间中两个向 量夹角的余弦值作为衡量两个样本差 异的大小。余弦值越接近1,说明两 个向量夹角越接近0度,表明两个向 量越相似。

Sklearn vs. 聚类

scikit-learn库(以后简称sklearn库)提 供的常用聚类算法函数包含在 sklearn.cluster这个模块中,如:K-Means, 近邻传播算法,DBSCAN,等
以同样的数据集应用于不同的算法,可能会得 到不同的结果,算法所耗费的时间也不尽相同, 这是由算法的特性决定的。

sklearn.cluster模块提供的各聚类算法函数可以使用不同的数据形式作为 输入:
标准数据输入格式:[样本个数,特征个数]定义的矩阵形式。
相似性矩阵输入格式:即由[样本数目,样本数目]定义的矩阵形式,矩阵中 的每一个元素为两个样本的相似度,如DBSCAN, AffinityPropagation(近邻传 播算法)接受这种输入。如果以余弦相似度为例,则对角线元素全为1. 矩阵中每 个元素的取值范围为[0,1]。

算法名称 参数 可扩展性 相似性度量
K-means 聚类个数 大规模数据 点间距离
DBSCAN 邻域大小 大规模数据 点间距离
Gaussian Mixtures 聚类个数及其他;超参 复杂度高,不适合处理大规模数据 马氏距离
Birch 分支因子,阈值等其他超参 大规模数据 两点间的欧式距离

1.K-means聚类

1.1算法

k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。
其处理过程如下:
1.随机选择k个点作为初始的聚类中心;
2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
3.对每个簇,计算所有点的均值作为新的聚类中心
4.重复2、3直到聚类中心不再发生改变

1.2 K-means的应用:
数据介绍:
K-means的应用
现有1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主 要变量数据,这八个变量分别是:食品、衣着、家庭设备用品及服务、医疗 保健、交通和通讯、娱乐教育文化服务、居住以及杂项商品和服务。利用已 有数据,对31个省份进行聚类。
实验目的:
通过聚类,了解1999年各个省份的消费水平在国内的情况。

1.3实验过程:
使用算法: K-means聚类算法 • 实现过程:
1. 建立工程,导入sklearn相关包
import numpy as np
from sklearn.cluster import KMeans
关于一些相关包的介绍:
NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组
运算提供大量的数学函数库。
使用sklearn.cluster.KMeans可以调用K-means算法进行聚类

调用KMeans方法所需参数:
• n_clusters:用于指定聚类中心的个数
• init:初始聚类中心的初始化方法
• max_iter:最大的迭代次数
• 一般调用时只用给出n_clusters即可,init
默认是k-means++,max_iter默认是300
其它参数:
• data:加载的数据
• label:聚类后各数据所属的标签
• axis: 按行求和
• fit_predict():计算簇中心以及为簇分配序号

1.4 拓展&&改进

计算两条数据相似性时,Sklearn 的K-Means默认用的是欧式距离。虽然还有余弦相
似度,马氏距离等多种方法,但没有设定计算距离方法的参数。

如果想要自定义计算距离的方式时,可以 更改此处源码。 def euclidean_distances():
建 议 使 用 scipy.spatial.distance.cdist 方 法
源码地址:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/pairwise.py

使用形式:scipy.spatial.distance.cdist(A, B, metric=‘cosine’)
https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html#scipy.spatial.distance.cdist

2. DBSCAN密度聚类

2.1 DBSCAN算法

是一种基于密度的聚类算法:
• 聚类的时候不需要预先指定簇的个数
• 最终的簇的个数不定

2.2 DBSCAN算法将数据点分为三类:
• 核心点:在半径Eps内含有超过MinPts数目的点
• 边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
• 噪音点:既不是核心点也不是边界点的点

2.3 DBSCAN算法流程:
1.将所有点标记为核心点、边界点或噪声点;
2.删除噪声点;
3.为距离在Eps之内的所有核心点之间赋予一条边;
4.每组连通的核心点形成一个簇;
5.将每个边界点指派到一个与之关联的核心点的簇中(哪一个核心点的半
径范围之内)。

举例:有如下13个样本点,使用DBSCAN进行聚类
P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13
X 1 2 2 4 5 6 6 7 9 1 3 5 3
Y 2 1 4 3 8 7 9 9 5 12 12 12 3

取Eps=3,MinPts=3,依 据DBSACN对所有点进行聚类 (曼哈顿距离)。
对每个点计算其邻域Eps=3内 的点的集合。
• 集合内点的个数超过 MinPts=3的点为核心点
• 查看剩余点是否在核心点的邻 域内,若在,则为边界点,否 则为噪声点。对每个点计算其邻域Eps=3内 的点的集合。
• 集合内点的个数超过 MinPts=3的点为核心点
• 查看剩余点是否在核心点的邻 域内,若在,则为边界点,否 则为噪声点。
距离不超过Eps=3的点相互 连接,构成一个簇,核心点邻域 内的点也会被加入到这个簇中。 则右侧形成3个簇。

2.4 DBSCAN的应用实例
数据介绍:
现有大学校园网的日志数据,290条大学生的校园网使用情况数据,数据包 括用户ID,设备的MAC地址,IP地址,开始上网时间,停止上网时间,上 网时长,校园网套餐等。利用已有数据,分析学生上网的模式。

实验目的:
通过DBSCAN聚类,分析学生上网时间和上网时长的模式。 技术路线:sklearn.cluster.DBSCAN

DBSCAN主要参数:
eps: 两个样本被看作邻居节点的最大距离
min_samples: 簇的样本数
metric:距离计算方式
例:sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric=’euclidean’)

详细:http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html#sklearn.cluster.DBSCAN

参考资料:
北京理工大学 礼欣 www.python123.org

发表评论

电子邮件地址不会被公开。 必填项已用*标注