“ 多用聚类算法的方式去思考,可以把你的思维锻炼得更加结构化,助你更快理清琐碎的生活。希望我们可以通过聚类,把纷繁复杂的世界变得简单一些,最终看清这复杂的世界。
--郭炜”

01
—
人以群分,物以类聚
聚类就是输入一群杂乱无章的数据,通过一些算法,输出若干个小组,并且这些小组里面会把数据都分门别类,这些聚好的类别小组达到内聚和分离的特性,即组内的对象相互之间是相似的(内聚),而不同组中的对象是不同的(分离)。组内的相似性越大,组间差别越大,聚类效果就越好。
聚类是一个最基础的数据挖掘算法,也是最经久不衰的算法之一。
02
—
K-Means
1、K-Means 是一种非监督学习,解决的是聚类问题。
K 代表的是 K 类,
Means 代表的是中心点(即意见领袖,它是这个类别的核心)
算法的本质是通过计算距离确定 K 类的中心点
2、 K-Means 和 KNN 区分
解决数据挖掘的两类问题:K-Means 是聚类,KNN 是分类
两种不同的学习方式:K-Means 是非监督学习,无需分类标签,而KNN 是有监督学习,需给分类标识。
K 值的含义不同:K-Means 代表 K 类。KNN 代表 K 个最接近的邻居。
03
—
工作原理
K-Means 有自我纠正机制,在不断的迭代过程中,会纠正中心点。中心点在整个迭代过程中,并不是唯一的。
Step 1:选择K个初始中心点
选择依据:a.业务专家和个人的经验;b.背后业务逻辑;c.随机
Step 2:计算剩下点与中心点距离,分配到最近的中心点,形成K个类
对于点的划分,就看它离哪个类的中心点的距离最近,就属于哪一类。
(延伸:关于距离可以回顾:算法-5 分类:KNN(k近邻)
在算法的世界里,我们可以有各种方法把人和人之间的属性和行为的差异数字化,然后把它们算成“欧几里得距离”或者“余弦相似度”,你现在只需要理解,最终任何事物的特征属性都可以变成类似距离的东西来计算就可以了。)
Step 3:重新计算每个类的均值,作为新的中心点
中间迭代中心点一般采用均值的方式计算得出
重复2、3直到聚类中心不再发生改变或达到你设置的最大迭代次数。

注意事项:使用聚类算法的时候要先把一些异常点尽量剔除掉,或者单独把它们单独聚成一类。否则有一些很异常的数据就会影响我们聚类算法最终的准确性。
04
—
应用场景
应用场景
数据聚类
实现图片、声音、视频的聚类,图片根据颜色、纹理、形状等特征聚类
用户画像,聚类一个人最常见的行为属性、聚类行为轨迹找到人群最密集的地方从而针对性地去放置广告牌或者进行一些活动
辅助医疗科研研究、辅助医疗管理、辅助医生的临床诊断、辅助生物学里的蛋白质表达等等
聚类算法可以帮助我们在非常复杂的数据环境里面快速聚出一些类别,从而看到这些数据里面的特征。同时,聚类能够避免直接使用平均值去看事物发生辛普森悖论,也能避免我们过度深入细节看不到事物的全貌。
05
—
Python sklearn 简介
A、sklearn库提供常用聚类算法函数包含在sklearn.cluster这个模块中,sklearn.cluster 一共提供了 9 种聚类方法,比如 Mean-shift,DBSCAN,Spectral clustering(谱聚类)等。这些聚类方法的原理和 K-Means 不同。
以同样的数据集应用于不同算法,可能会得到不同的结果,算法耗费的时间也不尽相同,这是由算法的特性决定的。

cluster可以使用不同的数据形式作为输入:
标准数据输入格式:[样本个数、特征个数]定义的矩阵形式
相似性矩阵输入格式:即由[样本数目]定义的矩阵形式,矩阵中的每一个元素为两个样本的相似度,如DBSCAN,AP聚类接受这种输入。如果以余弦相似度为例,则对角线元素全为1。矩阵中每个元素的取值范围为[0,1]

B、K-Means
1、引用
from sklearn.cluster import KMeans
2、创建
KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')
n_clusters: 即 K 值,一般需要多试一些 K 值来保证更好的聚类效果。你可以随机设置一些 K 值,然后选择聚类效果最好的作为最终的 K 值;
max_iter:最大迭代次数,如果聚类很难收敛的话,设置最大迭代次数可以让我们及时得到反馈结果,否则程序运行时间会非常长;
n_init:初始化中心点的运算次数,默认是 10。程序是否能快速收敛和中心点的选择关系非常大,所以在中心点选择上多花一些时间,来争取整体时间上的快速收敛还是非常值得的。由于每一次中心点都是随机生成的,这样得到的结果就有好有坏,非常不确定,所以要运行 n_init 次, 取其中最好的作为初始的中心点。如果 K 值比较大的时候,你可以适当增大 n_init 这个值;
init:即初始值选择的方式,默认是采用优化过的 k-means++ 方式,你也可以自己指定中心点,或者采用 random 完全随机的方式。自己设置中心点一般是对于个性化的数据进行设置,很少采用。random 的方式则是完全随机的方式,一般推荐采用优化过的 k-means++ 方式;
algorithm:k-means 的实现算法,有“auto” “full”“elkan”三种。一般来说建议直接用默认的"auto"。简单说下这三个取值的区别,如果你选择"full"采用的是传统的 K-Means 算法,“auto”会根据数据的特点自动选择是选择“full”还是“elkan”。我们一般选择默认的取值,即“auto”
3、可以单独使用 fit 函数和 predict 函数,也可以合并使用 fit_predict 函数。其中 fit(data) 可以对 data 数据进行 k-Means 聚类。predict(data) 可以针对 data 中的每个样本,计算最近的类。
data:加载的数据
label:聚类后各数据所属的标签
fit_predict:计算类中心及为类分配序号
4、拓展&改进
K-Means默认欧式距离,虽然还有其它距离方法,但没有设定计算距离方法的参数。建议使用:scipy.spatial.distance.cdits(A,B,metric='cosine')
5、模型评估:
一般使用轮廓系数(越大越好)或者误差平方和(即SSE,一般用于手肘法中确认K值的拐点)
——文章有参考数据分析实战-陈旸

Python 系列-算法篇(起):算法-1 “高大上”的数据挖掘
Python 系列-基础篇(起):时隔一年重学Python
统计与概率系列(起):统计-1 统计与概率是门虐待学吗?
数据库与SQL(起):数据库与SQL-1 数据库系统




