sklearn库实现聚类k-means算法实战--DBSCAN clustering

目录

数据样子以及任务:

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

分几类好呢?

DBSCAN clustering


数据样子以及任务:

一共20条数据:每种啤酒的特征。假设将这些啤酒分成3类

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

X = beer[["calories","sodium","alcohol","cost"]] #将涉及计算的数据拿出来

from sklearn.cluster import KMeans

km = KMeans(n_clusters=3).fit(X) #建立分类器,并且进行训练
km2 = KMeans(n_clusters=2).fit(X) #建立第二个分类器并训练

km.labels_  #打印每条数据属于的类别。第一条数据属于0类别
#array([0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 1, 0, 0, 1, 2])


#将这些类别填进表格
beer['cluster'] = km.labels_
beer['cluster2'] = km2.labels_
beer.sort_values('cluster') # 按照cluster进行排序

from pandas.tools.plotting import scatter_matrix
%matplotlib inline

cluster_centers = km.cluster_centers_

cluster_centers_2 = km2.cluster_centers_

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')


#每两个变量之间进行画图
scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster"]], figsize=(10,10))
plt.suptitle("With 3 centroids initialized")

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

#第二个分类的画图
scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster2"]], figsize=(10,10))
plt.suptitle("With 2 centroids initialized")

-----------------------------------归一化后重新操作
#归一化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled  #[-1,1]之间

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

聚类评估:轮廓系数(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 :第一个是归一化的结果,不好

分几类好呢?

依次分成2~20类,每次都计算轮廓系数

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)  #eps :数据浮动比较大则设置的大一些,反正小一些

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)

实例:2015年所有省份各个指标值,进行聚类

数据:

import pandas as pd
from sklearn.cluster import KMeans
from pandas.tools.plotting import scatter_matrix
import numpy as np
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn import metrics

datefram=pd.read_csv('2015.csv',)

#-----------------------------------查看数据
print(datefram[datefram.isnull().values==True])#查看有没有缺失值

import pandas_profiling  #打印报表
a= pandas_profiling.ProfileReport(datefram)

datefram.info() #查看信息

datefram.describe()

#----------------------------进行聚类

datefram=datefram.ix[:,1:] #取出来有效值,将第一列的省份去掉
X = datefram.values

#---------------------看看分成几类好用
scores = []
for k in range(2,20):
    labels = KMeans(n_clusters=k).fit(X).labels_
    score = metrics.silhouette_score(X, labels)
    scores.append(score)
print(scores)

#将得分输入到dateframe




得分如下:分成两类最好。

猜你喜欢

转载自blog.csdn.net/weixin_42053726/article/details/87377782
今日推荐