各种聚类算法的使用对比

谁说胖子不能爱 提交于 2020-02-07 02:34:46

1. 导入数据

# beer dataset
import pandas as pd
beer = pd.read_csv('data.txt', sep=' ')
beer

在这里插入图片描述

2.构建标签

X = beer[["calories","sodium","alcohol","cost"]]

3.使用聚类算法

K-means clustering:

from sklearn.cluster import KMeans

km = KMeans(n_clusters=3).fit(X)
km2 = KMeans(n_clusters=2).fit(X)

km.labels_

在这里插入图片描述

beer['cluster'] = km.labels_
beer['cluster2'] = km2.labels_
beer.sort_values('cluster')

在这里插入图片描述

from pandas.plotting import scatter_matrix
%matplotlib inline

cluster_centers = km.cluster_centers_

cluster_centers_2 = km2.cluster_centers_
beer.groupby("cluster").mean()

在这里插入图片描述

beer.groupby("cluster2").mean()

在这里插入图片描述

centers = beer.groupby("cluster").mean().reset_index()
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 14
import numpy as np
colors = np.array(['red', 'green', 'blue', 'yellow'])
plt.scatter(beer["calories"], beer["alcohol"],c=colors[beer["cluster"]])

plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black')

plt.xlabel("Calories")
plt.ylabel("Alcohol")

在这里插入图片描述

scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster"]], figsize=(10,10))
plt.suptitle("With 3 centroids initialized")

注释

scatter_matrix(frame, alpha=0.5, c,figsize=None, ax=None, diagonal='hist', marker='.', density_kwds=None,hist_kwds=None, range_padding=0.05, **kwds)

参数含义

  1. frame:pandas dataframe对象;
  2. alpha:图像透明度
  3. figsize:以英寸为单位的图像大小,一般以元组 (width, height) 形式设置
  4. ax:可选一般为none
  5. diagonal:必须且只能在{‘hist’, ‘kde’}中选择1个,’hist’表示直方图(Histogram plot),’kde’表示核密度估计(Kernel Density Estimation);该参数是scatter_matrix函数的关键参数
  6. marker:Matplotlib可用的标记类型,如’.’,’,’,’o’等
  7. density_kwds:(other plotting keyword arguments,可选),与kde相关的字典参数
  8. hist_kwds:与hist相关的字典参数
  9. range_padding:(float, 可选),图像在x轴、y轴原点附近的留白(padding),该值越大,留白距离越大,图像远离坐标原点
  10. kwds:与scatter_matrix函数本身相关的字典参数
    在这里插入图片描述
scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster2"]], figsize=(10,10))
plt.suptitle("With 2 centroids initialized")

在这里插入图片描述

Scaled data

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled

在这里插入图片描述

km = KMeans(n_clusters=3).fit(X_scaled)
beer["scaled_cluster"] = km.labels_
beer.sort_values("scaled_cluster")

在这里插入图片描述

beer.groupby("scaled_cluster").mean()

aidu

pd.plotting.scatter_matrix(X, c=colors[beer.scaled_cluster], alpha=1, figsize=(10,10), s=100)

在这里插入图片描述

聚类评估:轮廓系数(Silhouette Coefficient )

s(i)=b(i)a(i)max{a(i),b(i)},s(i)={1a(i)b(i),a(i)<b(i)0,a(i)=b(i)b(i)a(i)1,a(i)>b(i)}s(i)=\frac{b(i)-a(i)}{max\{a(i),b(i)\}},s(i)=\begin{Bmatrix} 1-\frac{a(i)}{b(i)} & ,a(i)<b(i)\\ 0 & ,a(i)=b(i)\\ \frac{b(i)}{a(i)}-1 & ,a(i)>b(i) \end{Bmatrix}

  • 计算样本i到同簇其他样本的平均距离ai。ai 越小,说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。
  • 计算样本i到其他某簇Cj 的所有样本的平均距离bij,称为样本i与簇Cj 的不相似度。定义为样本i的簇间不相似度:bi =min{bi1, bi2, …, bik}
  • si接近1,则说明样本i聚类合理
  • si接近-1,则说明样本i更应该分类到另外的簇
  • 若si 近似为0,则说明样本i在两个簇的边界上。
from sklearn import metrics
score_scaled = metrics.silhouette_score(X,beer.scaled_cluster)
score = metrics.silhouette_score(X,beer.cluster)
print(score_scaled, score)

在这里插入图片描述

scores = []
for k in range(2,20):
    labels = KMeans(n_clusters=k).fit(X).labels_
    score = metrics.silhouette_score(X, labels)
    scores.append(score)

scores

在这里插入图片描述

plt.plot(list(range(2,20)), scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihouette Score")

在这里插入图片描述

DBSCAN clustering

from sklearn.cluster import DBSCAN
db = DBSCAN(eps=10, min_samples=2).fit(X)
labels = db.labels_
beer['cluster_db'] = labels
beer.sort_values('cluster_db')

在这里插入图片描述

beer.groupby('cluster_db').mean()

在这里插入图片描述

pd.plotting.scatter_matrix(X, c=colors[beer.cluster_db], figsize=(10,10), s=100)

在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!