3. sklearn的K-Means的使用


1. K-Means原理解析

2. K-Means的優化

3. sklearn的K-Means的使用

4. K-Means和K-Means++實現

1. 前言

在機器學習中有幾個重要的python學習包。

  1. sklearn:sklearn里面包含了各種機器學習的算法結構
  2. numpy:numpy里面主要是矩陣的運算和數據的處理的內容,和sklearn搭配使用。
  3. matplotlib:matplotlib庫是用來繪圖的。

2. K-Means參數

  • n_clusters : 聚類的個數k,default:8.
  • init : 初始化的方式,default:k-means++
  • n_init : 運行k-means的次數,最后取效果最好的一次, 默認值: 10
  • max_iter : 最大迭代次數, default: 300
  • tol : 收斂的閾值, default: 1e-4
  • n_jobs : 多線程運算, default=None,None代表一個線程,-1代表啟用計算機的全部線程。
  • algorithm : 有“auto”, “full” or “elkan”三種選擇。"full"就是我們傳統的K-Means算法, “elkan”是我們講的elkan K-Means算法。默認的"auto"則會根據數據值是否是稀疏的,來決定如何選擇"full"和“elkan”。一般數據是稠密的,那么就是“elkan”,否則就是"full"。一般來說建議直接用默認的"auto"。

3. K-Means使用(1)

from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],[4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
kmeans.labels_ #輸出原始數據的聚類后的標簽值
>>> array([0, 0, 0, 1, 1, 1], dtype=int32)
kmeans.predict([[0, 0], [4, 4]]) #根據已經建模好的數據,對新的數據進行預測
>>> array([0, 1], dtype=int32)
kmeans.cluster_centers_ #輸出兩個質心的位置。
>>> array([[1., 2.],[4., 2.]])

KMeans在sklearn.cluster的包里面,在sklearn里面都是使用fit函數進行聚類。順便提一句,在sklearn中基本所有的模型的建模的函數都是fit,預測的函數都是predict。

4. K-Means使用(2)

這個例子有會生成4幅圖。

image

  1. 對數據用k=8去聚類。因為數據本身只有3類,所以聚類效果不好。
  2. 對數據用k=3去聚類,效果不錯。
  3. 還是用k=3去聚類,但是改變初始化方式init=random,n_init=1,這樣的隨機初始化,最后的效果會不好。
  4. 最后一張圖是數據本身的label,和第二幅相差不大。

具體代碼如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D #3D的庫

from sklearn.cluster import KMeans
from sklearn import datasets

np.random.seed(5) #設置隨機數種子

iris = datasets.load_iris()
X = iris.data
y = iris.target

estimators = [('k_means_iris_8', KMeans(n_clusters=8)),#k=8的kmeans
              ('k_means_iris_3', KMeans(n_clusters=3)), #k=3的kmeans
              ('k_means_iris_bad_init', KMeans(n_clusters=3, n_init=1,init='random')) #k=3,隨機初始化的kmeans
              ]

fignum = 1
titles = ['8 clusters', '3 clusters', '3 clusters, bad initialization']
for name, est in estimators:
    fig = plt.figure(fignum, figsize=(4, 3))
    ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
    est.fit(X) #fit建立模型
    labels = est.labels_ #獲得模型聚類后的label

    ax.scatter(X[:, 3], X[:, 0], X[:, 2],
               c=labels.astype(np.float), edgecolor='k') #繪制X中的第3,0,2個維度的特征

    ax.w_xaxis.set_ticklabels([])
    ax.w_yaxis.set_ticklabels([])
    ax.w_zaxis.set_ticklabels([])
    ax.set_xlabel('Petal width') #設置坐標軸名
    ax.set_ylabel('Sepal length')
    ax.set_zlabel('Petal length')
    ax.set_title(titles[fignum - 1]) #設置圖的名字
    ax.dist = 12
    fignum = fignum + 1

# 繪制數據真實標簽
fig = plt.figure(fignum, figsize=(4, 3))
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)

for name, label in [('Setosa', 0),
                    ('Versicolour', 1),
                    ('Virginica', 2)]:
    ax.text3D(X[y == label, 3].mean(), #尋找特征的均值點
              X[y == label, 0].mean(),
              X[y == label, 2].mean() + 2, name,
              horizontalalignment='center',
              bbox=dict(alpha=.2, edgecolor='w', facecolor='w'))

y = np.choose(y, [1, 2, 0]).astype(np.float)
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y, edgecolor='k')

ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
ax.set_title('Ground Truth')
ax.dist = 12

fig.show() #繪制整張圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM