无监督问题,我们手里没有标签

聚类:相似的东西聚在一起

难点:如何进行调参

 

K-means算法 

          需要制定k值,用来获得到底有几个簇,即几种类型

          质心:均值,即向量各维取平均值

          距离的度量: 欧式距离和余弦相似度

         优化目标: min∑∑dist(ci, xi)   即每种类别的数据到该类别质心距离的之和最小

                               1-k x

      

 

根据上述的工作流程:

                     第一步:随机选择两个初始点,类别的质心点(图二)

                     第二步: 根据所选的质心点,根据欧式距离对数据进行分类(图三)

                     第三步:求得分类后的每个类别的质心(图四)

                     第四步: 根据所选的质心点,根据欧式距离对数据进行分类(图五)

                     第五步:求得分类后的每个类别的质心(图五)

                     ....  一直到分类的数据类别不发生变化为止

优势:简单,快速,适用于常规数据集,分布较为规则的数据集

劣势:

          K值难确定

          复杂度与样本数据呈线性关系

         不太适用于不规则的数据

 我们使用sklearn来实现kmeans代码,使用silhouette_score轮廓系数来作为评估

第一步:读入数据

第二步:提取特征列

第三步:建立kmeans模型和训练

第四步:使用.grouby计算每一种类别的聚类中心,即求平均

第五步:使用scatter_matrix 画出两个变量关系的散点图

第六步:使用sihouette_score 轮廓系数来比较不同数目的聚类簇的结果影响

 

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


# 1.读入数据
data = pd.read_csv('data.txt', sep=' ')

# 2.提取特征
X = data[['calories', 'sodium', 'alcohol', 'cost']]

# 3.建立Kmeans模型和训练
from sklearn.cluster import KMeans

model = KMeans(n_clusters=3).fit(X)
beer = data.copy()
beer['cluster3'] = model.labels_
# 根据分类结果,从小到大进行排序
beer = beer.sort_values(by=['cluster3'])

# 4. 使用groupby 计算出每一个聚类中心的质心点, 画散点图
centers = beer.groupby(by=['cluster3']).mean()
colors = np.array(['red', 'green', 'blue', 'yellow'])
plt.scatter(beer['calories'], beer['sodium'], c=colors[beer['cluster3']], s=50, alpha=0.6)
# 画出质心的位置
plt.scatter(centers.calories, centers.sodium, c='k', marker='+', s=100)
plt.show()

# 5. 使用scatter_matrix画出两两变量的关系图
from pandas.tools.plotting import scatter_matrix

scatter_matrix(beer[['calories', 'sodium', 'alcohol', 'cost']], s=50, alpha=0.6, c=colors[beer['cluster3']], figsize=(10, 10))
plt.suptitle('The cluster Three')
plt.show()

# 6.silhouette_score引入轮廓系数作为评估的标准
import sklearn

# k_cluster 从2-19,判断聚类的效果
scores = []
for i in range(2, 20):
    labels = KMeans(n_clusters=i).fit(X).labels_
    score = sklearn.metrics.silhouette_score(X, labels)
    scores.append(score)
    print(score)

plt.plot(list(range(2, 20)), scores)
plt.xlabel('The cluster k')
plt.ylabel('Silhoette_score')
plt.show()

posted on 2019-01-19 12:27  python我的最爱  阅读(461)  评论(0编辑  收藏  举报