机器学习 - K-means聚类分析

一、K-means 聚类算法介绍

1.K-means聚类算法原理

(1)先抛出一个情景问题

航空公司怎么样对客户分群,区分高价值客户、无价值客户等,对不同的客户群体实施个性化的营销策略,实现利润最大化? 对于该类情景题,可使用聚类分析方法。

 

(2)聚类分析相关概念

在没有给定划分类别的情况下,根据数据的相似度进行分组的一种方法,分组的原则是组内距离最小化而组间距离最大化。

K-means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的K类别,采用距离作为相似性的评级指标,即认为两个对象的距离越近,其相似度越大。

算法过程: 

1、从N个样本数据中随机选取K个对象作为初始的聚类质心。 

2、分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中。 

3、所有对象分配完成之后,重新计算K个聚类的质心。 

4、与前一次的K个聚类中心比较,如果发生变化,重复过程2,否则转过程5. 

5、当质心不再发生变化时,停止聚类过程,并输出聚类结果。 

机器学习 - K-means聚类分析_第1张图片

 

2.K-means算法优缺点

优点:

(1)原理简单,速度快

(2)对大数据集有比较好的伸缩性,因为分类簇数为k<

 

缺点:

(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),然后再调用。

你可能感兴趣的:(python,python,机器学习)