聚类K-means算法

Posted luowei93

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚类K-means算法相关的知识,希望对你有一定的参考价值。

聚类K-means算法

  问题:给你一张这样的图,也没给其他信息,让你去给他们分类?怎么分类

技术图片

 

   那么,我们可能会以帽子头发等为特征对他们进行分类,物以类聚,人以群分

技术图片

 

 


聚类的原理:

技术图片

 

  1. 随机在数据当中抽取三个样本,当做三个类别的中心点(k1,k2,k3). ##图一,颜色实心标记##
  2. 计算其余的点分别到这三个中心点的距离,这样每一个点(样本)就有3个距离(a,b,c),从中选出距离最近的一个中心点作为自己的标记形成三个族群.
  3. 分别计算这三个族群的平均值,把三个平均值与三个旧的中心点进行比较.
       - 如果相同:结束聚类.
       - 如果不同:把这个平均值当做新的中心点,重复第二步第三步直到结束聚类.

 

K-means步骤:

 

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

K-means→API:

sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++‘)
    k-means聚类
    n_clusters:开始的聚类中心数量
    init:初始化方法,默认为k-means++
    labels_:默认标记的类型,可以和真实值比较(不是值比较)

聚类有什么作用?

  聚类一般用在分类算法之前,然后进行预测.

聚类流程:

  • 降维之后的数据
  • k-means聚类
  • 聚类结果显示

 

 


案例演示:

 

# 导入案例数据
import
pandas as pd from sklearn.decomposition import PCA # 读取四张表的数据 prior = pd.read_csv(rC:UsersluoweDesktopweek9week9instacartorder_products__prior.csv) product = pd.read_csv(rC:UsersluoweDesktopweek9week9instacartproducts.csv) orders = pd.read_csv(rC:UsersluoweDesktopweek9week9instacartorders.csv) aisles = pd.read_csv(rC:UsersluoweDesktopweek9week9instacartaisles.csv) # 合并四张表到一张表,(用户-物品类别) data = pd.merge(prior, product, on=product_id) data = pd.merge(data, orders, on=order_id ) data = pd.merge(data, aisles, on=aisle_id) # 建立一个以用户为行,产品为列的表 # 即用户和产品进行交叉 table = pd.crosstab(data[user_id], data[aisle]) # 数据结构为(206209, 134),需要做主成分分析,进行降维 pca = PCA(n_components=0.9) # 保留90%的数据 res = pca.fit_transform(table) #之前的数据降维学习的数据

 

技术图片

 

 

# 数据量大,把数据减
x = res[:500]

# 假设用户一共分为4个类别
from sklearn.cluster import KMeans
km = KMeans(n_clusters=4)
km.fit(x)

# 聚类 ,分类加上标记
predict = km.predict(x)少

输出结果:

技术图片

 

 500个结果,把这四个类别画出来:

 

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))

# 建立四个颜色
colored = [green,red,yellow,blue]
color=[colored[i] for i in predict]
plt.scatter(x[:, 1],x[:, 11],color=color)  # 散点图,x第1列,y第11列
plt.xlabel(1)
plt.ylabel(2) 
plt.show()  #因为只取了2个维度,所以看上去...

 

技术图片

 

 


 

 

 

聚类的评估标准:

  聚类效果的好坏

技术图片

 

 # 外部聚类最大化,内部距离最小化 #

 


技术图片

 

 ## 轮廓系数,计算聚类效果的好坏 ##

考虑极端情况:

 

完美聚类 bi>>ai : sci=1
最差聚类 bi<<ai : sci = -1 轮廓系数[-1,1] 一般轮廓系数大于0.1就是非常好的效果

 

  

聚类评估API:

sklearn.metrics.silhouette_score(x,labels)
    计算所有样本的平均轮廓系数
    x:特征值
    labels:被聚类标记的目标值
## 评判聚类效果,轮廓系数
from sklearn.metrics import silhouette_score

silhouette_score(x,predict)  
# 通过不停的调优,网格搜索,交叉验证可以得到最好的聚类效果

输出:

技术图片

 

 


 

K-means总结:

特点
    采用迭代, 直观易懂, 并且实用

缺点
    容易收敛到局部最优解.(多次聚类)....#类 里面有局部聚类#

注意 : 聚类一般做在分类之前

 

以上是关于聚类K-means算法的主要内容,如果未能解决你的问题,请参考以下文章

K-means聚类算法一文详解+Python代码实例

动手写机器学习算法:K-Means聚类算法

为啥使用 k-means(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值?

K-means聚类算法及python代码实现

不足20行 python 代码,高效实现 k-means 均值聚类算法

K-means 与KNN 聚类算法