利用sklearn实现kmeans和DBSCAN聚类算法

利用sklearn实现kmeans和DBSCAN算法

1.数据说明:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 导入相关的数据
beer = pd.read_csv('data/cluster_data.txt',sep=' ')
print(beer)


x = beer[['calories','sodium','alcohol','cost']]

利用sklearn实现kmeans和DBSCAN聚类算法_第1张图片

啤酒的相关数据包含名字、卡路里、酒精含量、售价等等,有四维的特征。

2.利用kmeans 进行聚类

# 使用k_mean进行聚类
from sklearn.cluster import KMeans
km = KMeans(n_clusters=2).fit(x)
km2 = KMeans(n_clusters=3).fit(x)
print("聚类1:",km.labels_)
print("聚类2:",km2.labels_)
beer['cluster'] = km.labels_
beer['cluster2'] = km2.labels_
beer.sort_values('cluster')
beer.sort_values('cluster2')
# 进行两次分类后的结果
print('进行两次分类后的结果:')
print(beer)

分别指定k=2 和 k = 3

输出:

聚类1: [0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 1]
聚类2: [1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 2 1 1 2 0]

进行两次分类后的结果:
​ name calories sodium … cost cluster cluster2
0 Budweiser 144 15 … 0.43 0 1
1 Schlitz 151 19 … 0.43 0 1
2 Lowenbrau 157 15 … 0.48 0 1
3 Kronenbourg 170 7 … 0.73 0 1
4 Heineken 152 11 … 0.77 0 1
5 Old_Milwaukee 145 23 … 0.28 0 1
6 Augsberger 175 24 … 0.40 0 1
7 Srohs_Bohemian_Style 149 27 … 0.42 0 1
8 Miller_Lite 99 10 … 0.43 1 0
9 Budweiser_Light 113 8 … 0.40 1 0
10 Coors 140 18 … 0.44 0 1
11 Coors_Light 102 15 … 0.46 1 0
12 Michelob_Light 135 11 … 0.50 0 1
13 Becks 150 19 … 0.76 0 1
14 Kirin 149 6 … 0.79 0 1
15 Pabst_Extra_Light 68 15 … 0.38 1 2
16 Hamms 139 19 … 0.43 0 1
17 Heilemans_Old_Style 144 24 … 0.43 0 1
18 Olympia_Goled_Light 72 6 … 0.46 1 2
19 Schlitz_Light 97 7 … 0.47 1 0

  1. 查看每一个类中各个特征的平均值

    # 计算cluster 中各项的平均值
    
    print(beer.groupby('cluster').mean())
    print(beer.groupby('cluster2').mean())
    

    输出:

    ​ cluster
    0 150.000000 17.000000 4.521429 0.520714 1.000000
    1 91.833333 10.166667 3.583333 0.433333 0.666667
    ​ calories sodium alcohol cost cluster
    cluster2
    0 102.75 10.0 4.075000 0.440000 1
    1 150.00 17.0 4.521429 0.520714 0
    2 70.00 10.5 2.600000 0.420000 1

  2. 画出酒精和卡路里的图像

# 提取中心点
center = beer.groupby('cluster').mean().reset_index()
plt.rcParams['font.size'] = 14
colors = np.array(['red','blue','black','yellow'])
# 绘制数据点
plt.scatter(beer['calories'],beer['alcohol'],c=colors[beer['cluster']])
# 绘制数据点中的中心点位置
plt.scatter(center.calories,center.alcohol,linewidths=3, marker='+', s=300, c='black')
plt.xlabel("Calories")
plt.ylabel("Alcohol")
plt.title("The relationship of Calories&Alcohol")
plt.show()

利用sklearn实现kmeans和DBSCAN聚类算法_第2张图片

  1. 对四维的数据进行两两的可视化

    # 对四维的数据进行两两的可视化
    pd.plotting.scatter_matrix(beer[["calories", "sodium", "alcohol", "cost"]], s=100, alpha=1, c=colors[beer["cluster2"]], figsize=(10, 10))
    plt.suptitle("with 3 centroids initialized")
    plt.show()
    

    利用sklearn实现kmeans和DBSCAN聚类算法_第3张图片

  2. 对数据进行标准化

    # 导入标准化的包
    from sklearn.preprocessing import StandardScaler
    
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(x)
    print('数据预处理之后的结果:')
    print(X_scaled)
    print("***********************************")
    
    # 用KMeans的fit一下
    km = KMeans(n_clusters=3).fit(X_scaled)
    # pandas新建一列
    beer["scaled_cluster"] = km.labels_
    print(beer.sort_values("scaled_cluster"))
    
    # 求质心均值
    beer.groupby("scaled_cluster").mean()
    # 画出标准化后的图像
    pd.plotting.scatter_matrix(x, c=colors[beer.scaled_cluster], alpha=1, figsize=(10,10), s=100)
    plt.suptitle("with 3 centroids initialized using scaled_cluster")
    plt.show()
    

利用sklearn实现kmeans和DBSCAN聚类算法_第4张图片

数据预处理之后的结果:
[[ 0.38791334 0.00779468 0.43380786 -0.45682969][ 0.6250656 0.63136906 0.62241997 -0.45682969]
[ 0.82833896 0.00779468 -3.14982226 -0.10269815][ 1.26876459 -1.23935408 0.90533814 1.66795955]
[ 0.65894449 -0.6157797 0.71672602 1.95126478][ 0.42179223 1.25494344 0.3395018 -1.5192243 ]
[ 1.43815906 1.41083704 1.1882563 -0.66930861][ 0.55730781 1.87851782 0.43380786 -0.52765599]
[-1.1366369 -0.7716733 0.05658363 -0.45682969][-0.66233238 -1.08346049 -0.5092527 -0.66930861]
[ 0.25239776 0.47547547 0.3395018 -0.38600338][-1.03500022 0.00779468 -0.13202848 -0.24435076]
[ 0.08300329 -0.6157797 -0.03772242 0.03895447][ 0.59118671 0.63136906 0.43380786 1.88043848]
[ 0.55730781 -1.39524768 0.71672602 2.0929174 ][-2.18688263 0.00779468 -1.82953748 -0.81096123]
[ 0.21851887 0.63136906 0.15088969 -0.45682969][ 0.38791334 1.41083704 0.62241997 -0.45682969]
[-2.05136705 -1.39524768 -1.26370115 -0.24435076][-1.20439469 -1.23935408 -0.03772242 -0.17352445]]

  1. 查看标准化前后的结果

    # - 计算样本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.cluster2)
    print(score_scaled, score)
    print("***********************************")
    

    利用sklearn实现kmeans和DBSCAN聚类算法_第5张图片

    输出:0.1797806808940004 0.6731775046455793

    这里是未标准化的结果比较好

  2. 遍历取k 值

    # 9)遍历K值,看哪个K值合适
    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('得分值为:')
    print(scores)
    
    plt.plot(list(range(2, 20)), scores)
    plt.xlabel("Number of Clusters Initialized")
    plt.ylabel("Sihouette Score")
    plt.show()
    

    利用sklearn实现kmeans和DBSCAN聚类算法_第6张图片

DBSCAN 实现
from sklearn.cluster import DBSCAN
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
beer = pd.read_csv('data/cluster_data.txt',sep=' ')
print(beer)
x = beer[['calories','sodium','alcohol','cost']]
db = DBSCAN(eps=10,min_samples=2).fit(x)
lables = db.labels_
beer['cluster_db'] = lables
print(beer.sort_values('cluster_db'))

center = beer.groupby('cluster_db').mean().reset_index()
plt.rcParams['font.size'] = 14
colors = np.array(['red','blue','black','yellow','green'])
pd.plotting.scatter_matrix(x, c=colors[beer.cluster_db], alpha=1, figsize=(10,10), s=100)
plt.suptitle("DBSCAN CLUSTER")
plt.show()

利用sklearn实现kmeans和DBSCAN聚类算法_第7张图片

9 Budweiser_Light 113 … 0.40 -1
3 Kronenbourg 170 … 0.73 -1
6 Augsberger 175 … 0.40 -1
17 Heilemans_Old_Style 144 … 0.43 0
16 Hamms 139 … 0.43 0
14 Kirin 149 … 0.79 0
13 Becks 150 … 0.76 0
12 Michelob_Light 135 … 0.50 0
10 Coors 140 … 0.44 0
0 Budweiser 144 … 0.43 0
7 Srohs_Bohemian_Style 149 … 0.42 0
5 Old_Milwaukee 145 … 0.28 0
4 Heineken 152 … 0.77 0
2 Lowenbrau 157 … 0.48 0
1 Schlitz 151 … 0.43 0
8 Miller_Lite 99 … 0.43 1
11 Coors_Light 102 … 0.46 1
19 Schlitz_Light 97 … 0.47 1
15 Pabst_Extra_Light 68 … 0.38 2
18 Olympia_Goled_Light 72 … 0.46 2

-1标记噪声点,非负整数标记类别

你可能感兴趣的:(机器学习)