聚类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(r'C:\Users\luowe\Desktop\week9\week9\instacart\order_products__prior.csv') product = pd.read_csv(r'C:\Users\luowe\Desktop\week9\week9\instacart\products.csv') orders = pd.read_csv(r'C:\Users\luowe\Desktop\week9\week9\instacart\orders.csv') aisles = pd.read_csv(r'C:\Users\luowe\Desktop\week9\week9\instacart\aisles.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总结:

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

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

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

猜你喜欢

转载自www.cnblogs.com/luowei93/p/11964738.html