机器学习-聚类算法

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 聚类步骤 

  1. 随即设置K个特征空间内的点作为初始点的聚类中心
  2. 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心作为标记类别。
  3. 接着对标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
  4. 如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步。

4. 模型评估 

4.1 误差平方和(SSE) 

SSE=\sum_{\mathrm{i}=1}^\mathrm{k}\sum_{p\in C_i}\lvert p-m_i\rvert^2

公式各个部分内容(k = 2):

 

SSE随着聚类迭代,其值会越来越小,直到最后趋于稳定。

如果质心的初始值选择不好,SSE只会达到一个不怎么好的局部最优解。

4.2 “肘”方法(Elbow method)——K值确定

 

  1. 对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的平方和。
  2. 平方和是会逐渐变小的,直到k == n时平方和为0,因为每个点都是它所在的簇中心本身。
  3. 在这个平方和变化过程中,会出现一个拐点(“肘”点),下降率突然变缓时即认为时最佳的k值。 

在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,停止增加类别。 

4.3 轮廓系数法( Silhouette Coefficient)

 结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果:

目的:内部距离最小化,外部距离最大化。

s\big(i\big)=\frac{b\big(i\big)-a\big(i\big)}{\max\big\{a(i),b(i)\big\}}

s\bigl(i\bigr)=\begin{cases}1-\dfrac{a\bigl(i\bigr)}{b\bigl(i\bigr)},&a\bigl(i\bigr)<b\bigl(i\bigr)\\[2ex]0,&a\bigl(i\bigr)=b\bigl(i\bigr)\\[2ex]\dfrac{b\bigl(i\bigr)}{a\bigl(i\bigr)}-1,&a\bigl(i\bigr)>b\bigl(i\bigr)\end{cases} 

计算样本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高则聚类效果越好。

\mathbf{s(k)}=\frac{tr(B_k)}{tr(W_k)}\frac{m-k}{k-1}

tr为矩阵的迹,Bk为类别之间的协方差矩阵,Wk为类别内部数据的协方差矩阵。

m为训练集样本数,k为类别数。 

矩阵的对角线可以表示一个物体的相似性。

在机器学习里,主要为了获取数据的特征值,在任何一个矩阵计算出来之后,都可以简单化,只要获取矩阵的迹,就可以表示这一块数据的最重要特征。这样就可以把很多无关紧要的数据删除掉,达到简化数据,提高处理速度。

 CH需要达到的目的:用尽量少的类别聚类尽量多的样本,同时获得较好的聚类效果。

5 算法优化

 k-means算法小结:

优点:

  1. 原理简单,实现容易
  2. 聚类效果中上(比较依赖于K的选择)
  3. 空间复杂度O(N),时间复杂度O(IKN)
    N为样本点个数,K为中心点个数,I为迭代次数

缺点: 

  1.  对离群点,噪声敏感(中心点易偏移)
  2. 很难发现大小差别很大的簇及进行增量计算
  3. 结果不一定是全局最优,只能保证局部最优(与K的个数和初值的选择有关。)

5.1 Canopy算法配合初始聚类 

优点:

  1. Kmeans对噪声抗干扰较弱,通过Canopy对比,将较小的NumPoint的Cluster直接去掉有利于抗干扰。
  2. Canopy选择出来的每个Canopy的centerPoint作为K会更精准。
  3. 只是针对每个Canopy的内做Kmeans聚类,减少相似计算的数量。

缺点:

算法T1,T2的确定问题,依旧可能落入局部最优解。

5.2 K-means++

P=\frac{D(x)^2}{\sum_{x\in X}D(x)^2} 

其中:\sum_{x\epsilon X}D(x)^2=1^2+2^2+1^2+2\ldots\ldots

注:下文将其标记为A 

kmeans++是让选择的之心尽可能地分散。 

 5.3 二分K-means

实现流程:

  1. 所有点作为一个簇
  2. 将该簇一分为二
  3. 选择能最大限度降低聚类代价函数(即误差平方和)的簇划分为两个簇
  4. 持续进行,知道簇的数目等于用户给定的数目k为止 

隐含原则:

因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于他们的之心,聚类效果就越好。所以需要对误差平方和和最大的簇进行再一次划分,因为误差平方和越大,表示该簇聚类效果越不好,越有可能是多个簇被当成了一个簇,所以我们首先需要对这个簇进行划分。

二分kmeans算法可以加速Kmeans算法的执行速度,因为他的相似度计算少了并且不受初始化问题的影响。因为这里不存在随机点的选取,且每一步都保证了误差最小。 

 5.4 k-medoids(k-中心聚类算法)

k-medoids 和kmeans是有区别的,不一样的地方在于中心点的选取。

  • kmeans 中,将中心点取为当前簇中所有数据点的平均值,对异常点很敏感。
  • k-medoids中,将从当前簇中选取到其他所有点距离之和最小的点作为中心点。

 

算法流程:

  1.  总体n个样本点中任意选取k个点作为medoids
  2. 按照于medoids最近的原则,将剩余的n-k个点分配到当前最佳的medoids代表的类中
  3. 对于第i个类中除对应medoids点外的所有其他点,按顺序计算当其为新的medoids时,代价函数的值,遍历所有可能,选取代价函数最小时对应的点作为新的medoids
  4. 重复2-3的过程,知道所有的medoids点不再发生变化或已达到设定的最大迭代次数
  5. 产出最终确定的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计算过程不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本来代表各自类型进行计算。由于计算样本量少,所以会减少运行时间,但另一方面抽样也必然会带来准确度的下降。

该算法迭代步骤:

  1. 从数据集中随机抽取一些数据形成小批量,把他们分配给最近的质心。
  2. 更新质心。

与kmeans相比,数据的更新在每一个小的样本集上。对于每一个小批量,通过计算平均值得到质心,并把小批量里的数据分配给该质心,随着迭代次数的增加,这些质心的变化是逐渐减小的,知道质心稳定或达到指定的迭代次数,停止计算。

5.8 优化算法总结

优化方法思路
Canopy+kmeansCanopy粗聚类配合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=\frac{n\sum xy-\sum x\sum y}{\sqrt{n\sum x^2-(\sum x)^2}\sqrt{n\sum y^2-(\sum y)^2}}
  • 特点:
    相关系数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):

  • 作用:反应变量之间相关关系密切程度的统计指标
  • 公式:RankIC=1-\frac{6\sum d_i^2}{n(n^2-1)}
    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官方指导意见:

 

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值