利用聚类算法进行啤酒分类
一.聚类简介
原理:将数据集划分为不相交的子集,每个子集称为一个簇,每个簇对应一个类别
目标:簇内相似度高,簇间相似度低
性能度量:轮廓系数,表达式如下:
二.聚类基本步骤
1.设置要分组的组数K
2.随机指定每组中心
3.将离中心近的点归到相应族群
4.重新计算组内中心点
5.用新的中心点重新对个体分类
三.案例实战
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
#读取文件
beer = pd.read_csv('data.txt', sep=' ')
beer.head()
#K-means clustering
from sklearn import metrics
from sklearn.cluster import KMeans
#筛选最好的聚类数目
#获取属性
X = beer[["calories","sodium","alcohol","cost"]]
#存储结果
dic={}
for k in range(2,20):
#获取标签
labels = KMeans(n_clusters=k).fit(X).labels_
#计算轮廓轮廓系数
score = metrics.silhouette_score(X, labels)
#记录分数
dic[k]=score
#按照值进行排序
print(sorted(dic.items(),key = lambda k : k[1],reverse = True))
#分类2类是最好的类别
#进行聚类
km2 = KMeans(n_clusters=2).fit(X)
#添加标签
X['cluster2'] = km2.labels_
#按照标签排序
X.sort_values('cluster2')
%matplotlib inline
import matplotlib.pyplot as plt
#设置颜色
plt.rcParams['font.size'] = 14
#获取聚类中心
centers = X.groupby("cluster2").mean().reset_index()
centers
import numpy as np
#设置颜色
colors = np.array(['red', 'green'])
#聚为2类的中心
cluster_centers_2 = km2.cluster_centers_
#画样本点
plt.scatter(X["calories"], X["alcohol"],c=colors[X["cluster2"]])
#画中心点
plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black')
#x轴标签
plt.xlabel("Calories")
#y轴标签
plt.ylabel("Alcohol")
#我们发现效果还不错,但是有些点效果还是不是很好