聚类分析的过程和两个常用的聚类算法

聚类分析过程

一般聚类分析的数据源是需要相对干净的,即需要做统一的特征清洗、特征变换过程,即空值、非法值、异常值、类别变量等的处理。主要过程如下:

数据采集:我们可以认为是统一的ETL过程,这里涉及埋点、转发、存储、提取等过程。是典型的数据分析前置过程。

特征变换/特征选择:聚类对异常数据特别敏感,同时原始数据直接进入聚类分析不大现实。特征处理包含行维度、列维度的处理,行维度主要包括:空值、非法值、异常值等方面的处理,而列维度涉及降维处理,冗余的列对聚类影响较大,所以一般聚类分析之前会做一次PCA。

聚类分析、聚类评估:下文将重点举例描述

结果解读:无监督学习,一般没有label,聚类的数量也是未知的,需要结合业务知识进一步解读聚类结果,比如从用户画像维度进一步切分同个分类的数据,从统计维度挖掘特征。

知识发现:解读结果之后,需要落地实现或者输出报告,我们把这个过程称为知识发现的过程。聚类结果产生的label结果,往往可以作为监督学习的来源。

下面举两个经典的聚类分析算法进一步说明。

Kmeans

基于距离聚类的聚类算法

算法步骤:
1、根据设定分类数量,随机生成N个中心点
2、每个点计算与中心点距离,按最近距离合并分类
3、基于2重新计算每个分类的中心点
4、重复2~3,直到中心点收敛

sklearn实现

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3)
pred = kmeans.fit_predict(X)

聚类效果

GMM

高斯混合模型是几个高斯分布的叠加,每一个分布代表一个分类

算法步骤:
1、设定分类数量
2、对每一个高斯分布均值、方差随机初始化
3、计算每个样本的在各个高斯分布的概率、权重值,Expectation-step
4、根据最大似然重新估算高斯分布均值、方差,Maximization-step
5、重复3~4直到高斯分布均值和方差收敛

sklearn实现

from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components=3)
gmm = gmm.fit(X)
pred_gmm = gmm.predict(X)

聚类效果

模型评价

GMM和KMeans分类结果有一定的随机性,可能得到局部优化解,需要多次微调。
GMM是概率分类结果,可以对比topN分类,比如文档聚类;GMM计算代价更大,大数据集是个负担。

评估指标

聚类算法的评估主要衡量两个方面:同类紧密程度、类间分散程度;从不同指标看,同类越紧密、类间越分散,聚类效果越好
基本上为无监督聚类,所以“Rand Index”之类的指标不是太实用,常用EIBOW方法 ,根据SSE评估聚类效果,另外对于聚类结果评估可以采用以下两种方式:

1、Silhouette index

    s = (b-a)/max(a,b)
    ai:同分类内,单点与其他点的平均距离
    bi:分类中的点与最近分类点的平均距离
    a:所有点ai的均值
    b:所有点bi的均值

基于轮廓的衡量方法,可能不适合 Single link、Complete link、DBSCANE等聚类方法。

2、Calinski-Harabasz
CH指标通过“同类”、“类间”协方差矩阵的迹(各个变量的方差)衡量,计算速度较快。

聚类分析的过程和两个常用的聚类算法

python WindowsError: [Error 145] :解决

执行自动化脚本时,删除文件夹里旧文件报错。如下
C:\ProgramData\Anaconda2\python.exe F:/AutoStartTime/Record_QQLive.py
删除旧文件 -- 开始
Traceback (most recent call last):
File "F:/AutoStartTime/Record_QQLive.py", line 197, in
QQLive = Record_QQLive(serial='cddfc295')
File "F:/AutoStartTime/Record_QQLive.py", line 26, in init
self.test_initEnv()
File "F:/AutoStartTime/Record_QQLive.py", line 92, in test_initEnv
shutil.rmtree(self.pcAppPath)
File "C:\ProgramData\Anaconda2\lib\shutil.py", line 261, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\ProgramData\Anaconda2\lib\shutil.py", line 261, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "C:\ProgramData\Anaconda2\lib\shutil.py", line 270, in rmtree
onerror(os.rmdir, path, sys.exc_info())
File "C:\ProgramData\Anaconda2\lib\shutil.py", line 268, in rmtree
os.rmdir(path)
WindowsError: [Error 145] : u'QQLive\ad\nocache'

原因: 该文件夹处于被打开状态

解决办法: 关闭文件夹后再执行脚本 。so sad~~~低级错误

python WindowsError: [Error 145] :解决

windows10 subsystem for linux adb 连接识别设备

系统:windows10 subsystem for linux ubuntu 16.04

问题:安装了Android-tools 之后 adb 可以执行,但adb devices拉不到设备list

原因: windows 系统的adb version 必须与linux 子系统的adb version保持一致

解决步骤:
1、ubuntu adb 安装
sudo apt-get update && sudo apt-get install android-tools-adb

2、重新下载一个与windows adb version 一样的 linux 版本adb (查看命令 adb version)
wget -O - https://skia.googlesource.com/skia/+archive/cd048d18e0b81338c1a04b9749a00444597df394/platform_tools/android/bin/linux.tar.gz | tar -zxvf - adb

3、覆盖/usr/bin/adb
* sudo mv adb /usr/bin/adb
* sudo chmod +x /usr/bin/adb (如果有执行权限可省略这一步)
* adb version (查看版本是否与windows下的adb 一致)
* adb devices (成功拉取到设备list)

windows10 subsystem for linux adb 连接识别设备