聚类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(r‘C:UsersluoweDesktopweek9week9instacartorder_products__prior.csv‘) product = pd.read_csv(r‘C:UsersluoweDesktopweek9week9instacartproducts.csv‘) orders = pd.read_csv(r‘C:UsersluoweDesktopweek9week9instacartorders.csv‘) aisles = pd.read_csv(r‘C: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(来自 Scipy)聚类到两个片段的图像会显示两个以上不同的像素值?