1. 聚类算法简介
1.1 图解
使用不同的聚类准则,产生的聚类结果不同。
聚类算法在现实中的应用
- 用户画像,广告推荐,Data Segmentation,搜索引擎的流量推荐,恶意流量识别
- 基于位置信息的商业推送,新闻聚类,筛选排序
- 图像分割、降维、识别;离群点检测;信用卡消费异常;发觉相同功能的基因片段
1.2 聚类算法的概念
聚类算法是一种无监督学习算法,主要用于将相似的样本自动归到一个类别中。
在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧氏距离法。
1.3 聚类算法与分了算法的最大区别
聚类算法是无监督学习算法,分类算法属于监督学习算法。
2. 聚类算法api初步使用
2.1 api介绍
sklearn.cluster.KMeans(n_clusters=8)
参数: n_clusters:开始的聚类中⼼数量,整型,缺省值 = 8,生成的聚类书,即产生的质心数。
方法:estimator.fit(x);estimator.predict(x);estimator.fit_predict(x)
计算聚类中心并预测人每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)
3. 聚类算法实现流程
k-means包含的两层内容:
- K:初始中心点(计划聚类数)
- means:求中心点到其他数据点距离的平均值
3.1 K-means 聚类步骤
- 随即设置K个特征空间内的点作为初始点的聚类中心
- 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心作为标记类别。
- 接着对标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
- 如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步。
4. 模型评估
4.1 误差平方和(SSE)
公式各个部分内容(k = 2):
SSE随着聚类迭代,其值会越来越小,直到最后趋于稳定。
如果质心的初始值选择不好,SSE只会达到一个不怎么好的局部最优解。
4.2 “肘”方法(Elbow method)——K值确定
- 对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的平方和。
- 平方和是会逐渐变小的,直到k == n时平方和为0,因为每个点都是它所在的簇中心本身。
- 在这个平方和变化过程中,会出现一个拐点(“肘”点),下降率突然变缓时即认为时最佳的k值。
在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,停止增加类别。
4.3 轮廓系数法( Silhouette Coefficient)
结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果:
目的:内部距离最小化,外部距离最大化。
计算样本i到同簇其他样本的平均距离ai,ai越小样本i的簇内不相似度越小,说明样本i越应该被聚类到该簇。
计算样本i到最近簇Cj的所有样本的平均距离bij,称样本i与最近簇Cj的不相似度,定义为样本i的簇间不相似度:bi = min{bi1,bi2,···,bik},bi越大,说明样本i越不属于其他簇。
求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。
平均轮廓系数取值范围为[-1,1], 系数越大,聚类效果越好。
簇内样本的距离越近,簇间样本距离越远。
轮廓系数为1时,说明这个点与周围簇距离较远,结果非常好,当他为0时,说明这个点可能处在两个簇的边界上,当值为负时,暗含该点可能被误分了。
4.4 CH系数(Calinski-Harabasz Index)
Calinski-Harabasz:
类别内部数据的协方差越小越好,类别之间的协方差越大越好。(类别内部数据的距离平方越小越好,类别之间的距离平方和越大越好)
这样CH分数s会高,分数s高则聚类效果越好。
tr为矩阵的迹,Bk为类别之间的协方差矩阵,Wk为类别内部数据的协方差矩阵。
m为训练集样本数,k为类别数。
矩阵的对角线可以表示一个物体的相似性。
在机器学习里,主要为了获取数据的特征值,在任何一个矩阵计算出来之后,都可以简单化,只要获取矩阵的迹,就可以表示这一块数据的最重要特征。这样就可以把很多无关紧要的数据删除掉,达到简化数据,提高处理速度。
CH需要达到的目的:用尽量少的类别聚类尽量多的样本,同时获得较好的聚类效果。
5 算法优化
k-means算法小结:
优点:
- 原理简单,实现容易
- 聚类效果中上(比较依赖于K的选择)
- 空间复杂度O(N),时间复杂度O(IKN)
N为样本点个数,K为中心点个数,I为迭代次数
缺点:
- 对离群点,噪声敏感(中心点易偏移)
- 很难发现大小差别很大的簇及进行增量计算
- 结果不一定是全局最优,只能保证局部最优(与K的个数和初值的选择有关。)
5.1 Canopy算法配合初始聚类
优点:
- Kmeans对噪声抗干扰较弱,通过Canopy对比,将较小的NumPoint的Cluster直接去掉有利于抗干扰。
- Canopy选择出来的每个Canopy的centerPoint作为K会更精准。
- 只是针对每个Canopy的内做Kmeans聚类,减少相似计算的数量。
缺点:
算法T1,T2的确定问题,依旧可能落入局部最优解。
5.2 K-means++
其中:
注:下文将其标记为A
kmeans++是让选择的之心尽可能地分散。
5.3 二分K-means
实现流程:
- 所有点作为一个簇
- 将该簇一分为二
- 选择能最大限度降低聚类代价函数(即误差平方和)的簇划分为两个簇
- 持续进行,知道簇的数目等于用户给定的数目k为止
隐含原则:
因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于他们的之心,聚类效果就越好。所以需要对误差平方和和最大的簇进行再一次划分,因为误差平方和越大,表示该簇聚类效果越不好,越有可能是多个簇被当成了一个簇,所以我们首先需要对这个簇进行划分。
二分kmeans算法可以加速Kmeans算法的执行速度,因为他的相似度计算少了并且不受初始化问题的影响。因为这里不存在随机点的选取,且每一步都保证了误差最小。
5.4 k-medoids(k-中心聚类算法)
k-medoids 和kmeans是有区别的,不一样的地方在于中心点的选取。
- kmeans 中,将中心点取为当前簇中所有数据点的平均值,对异常点很敏感。
- k-medoids中,将从当前簇中选取到其他所有点距离之和最小的点作为中心点。
算法流程:
- 总体n个样本点中任意选取k个点作为medoids
- 按照于medoids最近的原则,将剩余的n-k个点分配到当前最佳的medoids代表的类中
- 对于第i个类中除对应medoids点外的所有其他点,按顺序计算当其为新的medoids时,代价函数的值,遍历所有可能,选取代价函数最小时对应的点作为新的medoids
- 重复2-3的过程,知道所有的medoids点不再发生变化或已达到设定的最大迭代次数
- 产出最终确定的k个类
k-medoids对噪声的鲁棒性好。
5.5 Kernel k-means
kernel k-means 就是将每个样本进行一个投射到高维空间的处理,然后再将处理后的数据使用普通的kmeans算法思想进行聚类。
5.6 ISODATA
类别数目随着聚类过程而变化;
对类别数会进行合并,分裂。
合并:当聚类结果某一类中样本数太少,或两个类间的距离太近时合并。
分裂:当聚类结果中某一类的类内方差太大,将该类进行分裂。
5.7 Mini Batch K-Means
适合大数据量级(通常当样本量大于1w做聚类)的聚类算法。
Mini Batch KMeans使用了Mini Batch(分批处理)的方法对数据点之间的距离进行计算。
Mini Batch计算过程不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本来代表各自类型进行计算。由于计算样本量少,所以会减少运行时间,但另一方面抽样也必然会带来准确度的下降。
该算法迭代步骤:
- 从数据集中随机抽取一些数据形成小批量,把他们分配给最近的质心。
- 更新质心。
与kmeans相比,数据的更新在每一个小的样本集上。对于每一个小批量,通过计算平均值得到质心,并把小批量里的数据分配给该质心,随着迭代次数的增加,这些质心的变化是逐渐减小的,知道质心稳定或达到指定的迭代次数,停止计算。
5.8 优化算法总结
优化方法 | 思路 |
---|---|
Canopy+kmeans | Canopy粗聚类配合kmeans |
kmeans++ | 距离越远越容易成为新的质心 |
二分k-means | 拆除SSE最⼤的簇 |
k-medoids | 和kmeans选取中心点的方式不同 |
kernel kmeans | 映射到⾼维空间 |
ISODATA | 动态聚类,可以更改K值大小 |
Mini-batch K-Means | 大数据集分批聚类 |
6. 特征降维
6.1 降维
定义:降维是指在某些特定条件下,降低随机变量(特征)个数,得到一组不相关主变量的过程
- 降低随机变量的个数
- 相关特征
正是因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测影响会较大。
降维的两种方式
- 特征选择
- 主成分分析(类似于特征提取)
6.2 特征选择
定义: 数据中包含冗余或者无关变量(或称特征、属性、指标等)。从原有特征中找出主要特征
方法:
Filter(过滤式):主要探究特征本身的特点、特征和目标值之间的关联
- 方差选择法:低方差特征过滤
- 相关系数
Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联)
- 决策树:信息熵、信息增益
- 正则化:L1,L2
- 深度学习:卷积等
低方差特征过滤
删除低方差的一些特征。
- 特征方差小:某个特征大多样本的值比较接近
- 特征方差大:某个特征很多样本的值都有差别
API:
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
- 删除所有低方差特征
- Variance.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
数据计算:筛选特征
相关系数
皮尔逊相关系数(Pearson Correlation Coefficient):
- 作用:反应变量之间相关关系密切程度的统计指标
- 公式:
- 特点:
相关系数r值介于-1到1之间:
当r>0时,表示两变量正相关,r<0时,两变量为负相关
当|r|=1时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系
当0<|r|<1时,表示两变量存在⼀定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱
⼀般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关- api:
from scipy.stats import pearsonr
x : (N,) array_like
y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
斯皮尔曼相关系数(Rank IC):
- 作用:反应变量之间相关关系密切程度的统计指标
- 公式:
n为等级个数,d为二列成对变量的等级差数举- 特点:
斯皮尔曼相关系数表明 X (自变量) 和 Y (因变量)的相关⽅向。 如果当X增加时, Y 趋向于增加,斯皮尔曼相关系数则为正。
与之前的皮尔逊相关系数大小性质一样,取值在[-1,1]之间- api:from scipy.stats import spearmanr
6.3 主成分分析
6.3.1 什么是主成分分析 (PCA)
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息
应用:回归分析或者聚类分析中
6.3.2 api
sklearn.decomposition.PCA(n_components=None)
- 将数据分解为较低维数空间
- n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征- PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后指定维度的array
7. 算法选择指导
scikit learn官方指导意见: