对于机器学习中三种聚类算法的比较与介绍
一、聚类算法
1、划分聚类
划分方法
- 将数据对象分配得到n个簇中,并且通过设定目标函数来驱使算法趋向于目标
定义
- 一系列数据 D = {d1, …, dN}
- 期望的簇数目N
- 用于评估聚类质量的目标函数(objective function),计算一个分配映射y:D–>{1, …, K},该分配下的目标函数值极小化或极大化。大部分情况下,我们要求y是一个满射,也就是说,K个簇中的每一个都不为空。
k-means聚类方式
- K-Means(K均值)算法是划分聚类算法中的一种,其中K表示簇的数量,means表示均值,算法通过预先设定的K值及每个簇的初始质心对相似的数据点进行划分。并通过划分后的均值迭代优化获得最优的聚类结果
- 伪代码
- 从D中任意选择k个对象作为初始簇的质心
- Repeat
- 根据簇质心的值,将每个数据分配到最相似的簇
- 计算簇均值,更新簇质心值
- until簇中心不在发生变化
- 关键词
- K表示簇的数量
- means表示均值
- 初始质心
- 划分
- 迭代
- 质点
- 系质量分布的平均值,是最能代表一个簇的点
质心对样本的迭代函数
- 一个衡量质心对簇样本的代表程度指标是RSS(Residual Sum of Squares,残差平方和),即所有数据到其簇质心距离的平方和
- 公式为
动态演示聚类过程的网站:https://www.naftaliharris.com/blog/visualizing-k-means-clustering/
K-means的结束
- 在每次数据重新分配过程中,每个向量都会分配给最近的质心,此时他对RSS计算的距离贡献值也会减小,因此RSS会单调减少
- 在簇中心重计算过程中,由于新的质量向量使得每个RSSk达到最小值,所有RSS也会单调递减
- 当迭代一个固定次数后停止
- 当RSS低于某个阈值时停止
- 当质心不在改变后停止
K-means的问题
- k-means算法是一个比较容易理解的算法
- 但是也存在着以下的问题
- 初始值对k-means聚类影响
- k-means初始值选择
- 将全部数据随机地分为C簇,计算各个簇的质心,将这些质心作为每个簇的初始点
- 从(c-1)聚类划分问题的解中产生C聚类划分问题的代表点,其具体做法是先从一类聚类的解找两聚类划分的代表点,再依次增加一个聚类代表点。对样本集首先看做一个聚类,计算其总均值,然后找与该均值相距最远的点
- k值对k-means聚类的影响
- k-means算法k值选择
- 依据实际业务来选择
- 从层次聚类中选择参考
- K均值算法运行时需注意的问题
- 数据集如果有以下不同的簇问题,k-means效果会不佳
- 簇大小相差大
- 簇密度相差大
- 非球型形状
- 数据如果存在离群点,k-means会很受影响,因为使用算法平均来选取类中心
Sklearn调用演示
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 4]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
kmeans.labels_
kmeans.predict([[0, 0], [4, 4]])
kmeans.cluster_centers_
2、层次聚类
引入层次聚类
- 基于划分聚类具有概念简单、速度快的优点
- 但是同时也有很多的缺点
- 需要预先定义簇的数目
层次聚类
- 指对与给定的数据集对象,我们通过层次聚类算法获得一个具有层次结构的数据集子集结合的过程
- 层次聚类分为两种
- 自底向上凝聚法
- 自顶向下的分裂法
凝聚层次聚类
- 凝聚法指的是初始时将每个样本点当作一个簇,所以原始簇的数量等于样本点的个数,然后依据某种准则合并这些初始的簇,直到达到某种条件或者达到设定的簇和数目
- 某种准则可以是相似度
- 伪代码
- 计算个数据间的相似度
- 每个数据就是一个簇
- Repeat
- 合并两个最相似的簇形成新簇
- 更新相似度矩阵
- Until只剩一个类簇
分裂层次聚类
- 初始时将所有样本归为一个簇,然后依据某种准则进行逐渐的分裂,直到达到某种条件或者达到设定的簇的数目
层次聚类运行过程
- 层次聚类不需要事先指定簇的数目,设定层次树高度就可以达到任意选择簇数量的目的
簇间相似度
- MIN:单链接
- 将两个簇的数据点中距离最近的两个数据点间距离作为这两个簇的距离
- 单链接产生非常分散的簇,擅长处理非球型簇
- 对离群点和噪声敏感
- MAX:全连接
- 将两个簇的数据点中距离最远的两个数据点间距离作为这两个簇的距离
- 对那些与总体结构不太一致的离群点给予了过多的关注。也就是说,全连接聚类并不能找出最直观的簇结构,容易打破大团
- 对离群点和噪声敏感
- Group Average:组平均
- 计算两个簇的数据点中的每个数据点与其他所有数据点的距离
- 对单链接和全连接的权衡,方法计算量比较大,但结果比前两种方法合理
- 对噪声和离群点没那么敏感
- Distance Between Centroids:质心距离
- 将两个簇的质心距离作为这两个簇的距离
- 减少组平均方法计算量比较大的问题
- 对噪声和离群点没那么敏感
- 偏向于球型簇
层次聚类的特点
- 不需要输入聚类数目k
- 一旦一个合并被执行,就不能修正
- 没有一个全局最优化的目标函数
- 计算量较大
3、密度聚类
主要特点
- 发现任意形状的聚类
- 处理噪声
- 需要密度参数作为终止条件
DBSCAN
- 密度 = 特定半径内(Eps)数据点的数量
- 核心点:当一个点Eps半径内数据点的数量(包含自己)大于(MinPts)时,他是一个核心点
- 边界点:当一个点Eps半径内数据点数量小于(MinPts),但包含至少一个核心点时,他是一个边界点
- 噪声点:不是核心点和边界点的其他点
- NEps(x):{y belongs to D| dist(y, x) <= Eps}
- 直接密度可达的:点p关于Eps,MinPts是从点q直接密度可达的
- 如果q达到核心点条件:
- p属于NEps(q)
- 密度可达
- 点p关于Eps,MinPts是从q密度可达的:如果存在一个节点链p1, …, pn,p1 = q, pn = p使得p1 + 1是从pi直接密度可达的。(不是对称关系)
- 密度相连
- 点p关于Eps,MinPts与点q是密度相连的:如果存在点o使得,p和q都是关于Eps,MinPts是从o密度可达的(是对称的)
- 利用密度相连的特定来来发现联通的稠密区域
- 任意两个足够靠近(eps内)的核心点将放在一个簇内
- 任何与核心点足够靠近的边界点也会被放入与核心点的相同的簇
DBSCAN算法
- 检测数据库中尚未检查过的对象p,如果p未被处理(归为某个簇或者标记未噪声),则检查其邻域,若包含的对象数 >= MinPts,建立新簇C,将其中的所有的点加入候选集N;若 <=MinPts则暂时标记为噪声
- 对候选集N中所有尚未被处理的对象q,检查其邻域,若至少包含MinPts个对象,则将这些对象加入N;如果q未归入任何一个簇,则将q加入到C;
- 重复步骤2,继续检查N中未处理的对象,当候选集N未空;
- 重复步骤1~3,直到所有对象都归入了某个簇或标记为噪声
优势
- 忽略噪声
- 发现任意形状的簇
劣势
- 参数难以确定
- 效果不佳
- 密度不均
- 高维数据
4、数据降维
降维
- 无监督学习的另一种常见算法——降维
- 减少要考虑的随机变量的数量
- 将为分析是指将高维数据到低维数数据空间(二维或三维)变化的过程,其目的是为了降低时间的复杂度和空间的复杂度或者是去掉数据集中夹杂的噪音,又或者是为了使用较少的特征进行解释,方便我们可以更好的解释数据以及实现数据的可视化
特征维度减少的方法
- 实现维度减少有两种技术
- 特征选择
- 选择原始数据集中最具代表性或者统计意义的维度特征
- 基于统计测试来选择最好的特征,常用的统计指标
- 评分最高:SelectBest
- 用户指定的最高得分百分比:SelectPercentile
- 假阳性率(false positive rate):SelectFpr
- 伪发现率(false discovery rate):SelectFdr
- 族系误差(family wise error):SelectFwe
- 代码实现
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
iris = load_iris()
X, y = iris.data, iris.target
X_new = SelectKBest(chi2, k = 2).fit_transform(X, y)
print(X_new)
- 特征提取
- 将原始特征转换为一组具有明显物理意义或者统计意义的特征
- 常用的降维方法
- 主成分分析(PCA)
- 数据从原来的坐标系转换到新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴选择和第一个坐标轴正交具有最大方差的方向。该过程一致重复,重复次数为原始数据中特征的数目
- 过程
- 线性变换:新特征轴可由原始轴线性变换表征
- 线性无关:构建的特征轴是正交的
- 主要先行分量(主成分):方差最大的方向(希望投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述)
- PCA算法的求解就是找到主要线性分量及其表征方式的过程
- 特点
- 对离群点很敏感
- 代码实现
data = iris.data
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newData = pca.fit_transform(data)
print(newData)
- 因子分析(Factor Analysis)
- 对离群点很敏感
* 代码实现
```python
data = iris.data
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newData = pca.fit_transform(data)
print(newData)
```
- 因子分析(Factor Analysis)