一、K-means 聚类算法介绍
1.K-means聚类算法原理
(1)先抛出一个情景问题
航空公司怎么样对客户分群,区分高价值客户、无价值客户等,对不同的客户群体实施个性化的营销策略,实现利润最大化? 对于该类情景题,可使用聚类分析方法。
(2)聚类分析相关概念
在没有给定划分类别的情况下,根据数据的相似度进行分组的一种方法,分组的原则是组内距离最小化而组间距离最大化。
K-means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的K类别,采用距离作为相似性的评级指标,即认为两个对象的距离越近,其相似度越大。
算法过程:
1、从N个样本数据中随机选取K个对象作为初始的聚类质心。
2、分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中。
3、所有对象分配完成之后,重新计算K个聚类的质心。
4、与前一次的K个聚类中心比较,如果发生变化,重复过程2,否则转过程5.
5、当质心不再发生变化时,停止聚类过程,并输出聚类结果。
2.K-means算法优缺点
优点:
(1)原理简单,速度快
(2)对大数据集有比较好的伸缩性,因为分类簇数为k<<n、而迭代计算次数为t<<n,其中n是所有对象的数目,k是簇的数目,t是迭代的次数
缺点:
(1)需要指定聚类数量K
(2)对异常值敏感,聚类前需剔除离群点
(3)对初始值敏感,一量初始值选择不好,可能无法得到有效的聚类结果,可以多设置些不同的初始值,对比最后的运算结果,一直到结果趋于稳定来解决这一问题,也可采用K-Means++算法
3.K-menas++算法
K-Means++算法就是对K-Means随机初始化质心的方法的优化,其基本思想就是:初始的聚类中心之间的相互距离要尽可能远,方法如下:
(1)从输入的数据点集合中随机选择一个点作为第一个聚类中心
(2)计算数据集中每个点与第一个聚类中心的距离D(x)
(3)选择一个D(x)较大的点作为新的聚类中心,且该D(x)较大的点(需主观判断)作为聚类中心的概率较大
(4)重复2和3直到k个聚类中心被选出来
(5)利用这k个初始的聚类中心来运行标准的k-means算法
二、语法函数 及 案例
1.K-means语法函数
from sklearn.cluster import KMeans
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:簇的个数,即你想聚成几类
- init: 初始簇中心的获取方法
- n_init: 获取初始簇中心的更迭次数,默认会初始10次质心,然后返回最好的结果。
- max_iter: 最大迭代次数
- tol: 容忍度,即kmeans运行准则收敛的条件
- precompute_distances:是否需要提前计算距离
- verbose: 冗长模式
- random_state: 随机生成簇中心的状态条件。
- copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。
- n_jobs: 并行设置
- algorithm: kmeans的实现算法,有:‘auto’, ‘full’, ‘elkan’, 其中 'full’表示用EM方式实现
使用时很多参数已给出了默认值,一般不用去修改这些参数
2.K-means简单案例
import numpy as np
from sklearn.cluster import KMeans
#生成一个随机数据,样本大小为100, 特征数为3
data = np.random.rand(100, 3)
#构造一个聚类数为3的聚类器
estimator = KMeans(n_clusters=3)#构造聚类器
estimator.fit(data)#聚类
label_pred = estimator.labels_ #获取聚类标签
centroids = estimator.cluster_centers_ #获取聚类中心
inertia = estimator.inertia_ # 获取聚类准则的总和
其中:
estimator初始化Kmeans聚类;
estimator.fit聚类内容拟合;
estimator.label_聚类标签,这是一种方式,还有一种是predict;
estimator.cluster_centers_聚类中心均值向量矩阵
estimator.inertia_代表聚类中心均值向量的总和
3.K-means案例2
from sklearn.cluster import KMeans
import numpy as np
data = np.random.rand(100, 3)
km_cluster = KMeans(n_clusters=3, max_iter=300, n_init=40, init='k-means++')
#返回各自文本的所被分配到的类索引
result = km_cluster.fit_predict(data)
print("Predicting result: ", result)
km_cluster是KMeans初始化,其中用init的初始值选择算法用’k-means++’;
km_cluster.fit_predict相当于km_cluster.fit()+km_cluster.predict()合并,一次性得到聚类预测之后的标签;
km_cluster.labels_ 与 km_cluster.predict(data)这是两种聚类结果标签输出的方式,结果貌似都一样。都需要先km_cluster.fit(data),然后再调用。