【机器学习】聚类 Kmeans &DBSCAN

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

在这里插入图片描述


from sklearn.cluster import KMeans
X = beer[["calories","sodium","alcohol","cost"]]
km = KMeans(n_clusters=3).fit(X)
km2 = KMeans(n_clusters=2).fit(X)

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

from pandas.tools.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")```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200317173324949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcyNzM4Mw==,size_16,color_FFFFFF,t_70)

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

在这里插入图片描述

对数据做标准化以后,在进行聚类

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
km = KMeans(n_clusters=3).fit(X_scaled)

beer["scaled_cluster"] = km.labels_

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  • 计算样本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)

0.179780680894 0.673177504646

  • 结果发现,标准化后的数据聚类效果反而没有未作处理的聚类效果好

修改聚类的类别数,进行比较

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

[0.69176560340794857,
0.67317750464557957,
0.58570407211277953,
0.42254873351720201,
0.4559182167013377,
0.43776116697963124,
0.38946337473125997,
0.39746405172426014,
0.33061511213823314,
0.34131096180393328,
0.34597752371272478,
0.31221439248428434,
0.30707782144770296,
0.31834561839139497,
0.28495140011748982,
0.23498077333071996,
0.15880910174962809,
0.084230513801511767]

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

在这里插入图片描述

  • k等于2的时候,聚类效果最好

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.scatter_matrix(X, c=colors[beer.cluster_db], figsize=(10,10), s=100)

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值