對應書上的P84頁的代碼
# coding: utf-8
# 分別導入numpy、matplotlib以及pandas,用于數學運算、作圖以及數據分析。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd# 使用pandas分別讀取訓練數據與測試數據集。
digits_train = pd.read_csv('optdigits.tra', header=None)
digits_test = pd.read_csv('optdigits.tes', header=None)# 從訓練與測試數據集上都分離出64維度的像素特征與1維度的數字目標。
X_train = digits_train[np.arange(64)]#64個屬性值
y_train = digits_train[64]#一個結果值X_test = digits_test[np.arange(64)]
y_test = digits_test[64]# 從sklearn.cluster中導入KMeans模型。
from sklearn.cluster import KMeans# 初始化KMeans模型,并設置聚類中心數量為10。
kmeans = KMeans(n_clusters=10)
kmeans.fit(X_train)# 逐條判斷每個測試圖像所屬的聚類中心。
y_pred = kmeans.predict(X_test)# In[2]:# 從sklearn導入度量函數庫metrics。
from sklearn import metrics
# 使用ARI進行KMeans聚類性能評估。
print metrics.adjusted_rand_score(y_test, y_pred)# 導入numpy。
import numpy as np
# 從sklearn.cluster中導入KMeans算法包。
from sklearn.cluster import KMeans
# 從sklearn.metrics導入silhouette_score用于計算輪廓系數。
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt# 分割出3*2=6個子圖,并在1號子圖作圖。
plt.subplot(3,2,1)#這里的意思是這六個子圖是呈3行2列排序的。# 初始化原始數據點。
x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])
x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])
X = np.array(zip(x1, x2)).reshape(len(x1), 2)#zip(x1, x2)的意思就是拼接起來變成一個坐標。
#X就是點的坐標的集合
#reshape的作用就是讓列表的元素也是列表,如果沒有reshape這個函數,那么列表的元素是元組
#所以reshape對輸出功能沒有影響,只是讓輸出的形式發生了改變。# 在1號子圖做出原始數據點陣的分布。
plt.xlim([0, 10])
plt.ylim([0, 10])
plt.title('Instances')
plt.scatter(x1, x2)colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b']
markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']clusters = [2, 3, 4, 5, 8]#這里就是分成幾類的意思
subplot_counter = 1
sc_scores = []
for t in clusters:#t表示上面list中的某個參數的具體值print('t=',t)subplot_counter += 1print('subplot_counter=',subplot_counter)#參數subplot_counter之所以從2開始計數,是因為前面已經畫過一個圖了plt.subplot(3, 2, subplot_counter)#subplot表示畫在同一張圖中的子圖kmeans_model = KMeans(n_clusters=t).fit(X)#表示將數據集X,分成t類for i, l in enumerate(kmeans_model.labels_):#i和l都是標記,一個用來指代坐標值,一個用來指代顏色和標記。plt.plot(x1[i], x2[i], color=colors[l], marker=markers[l], ls='None')#i用來選定坐標,color表示畫marker時填充的顏色,marker表示畫圖時用的圖形標記plt.xlim([0, 10])plt.ylim([0, 10])sc_score = silhouette_score(X, kmeans_model.labels_, metric='euclidean')#這個講的是輪廓系數sc_scores.append(sc_score)#sc_scores是前面定義的# 繪制輪廓系數與不同類簇數量的直觀顯示圖。plt.title('K = %s, silhouette coefficient= %0.03f' %(t, sc_score))#句子中兩個%分別對應后面得t和sc_score# 繪制輪廓系數與不同類簇數量的關系曲線。對應書本P88圖2-12中的曲線
plt.figure()
plt.plot(clusters, sc_scores, '*-')
plt.xlabel('Number of Clusters')
plt.ylabel('Silhouette Coefficient Score')plt.show()# 導入必要的工具包。
import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt# 使用均勻分布函數隨機三個簇,每個簇周圍10個數據樣本。
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))#random.uniform(x, y)表示隨機范圍在x和y之間
cluster2 = np.random.uniform(5.5, 6.5, (2, 10))
cluster3 = np.random.uniform(3.0, 4.0, (2, 10))# 繪制30個數據樣本的分布圖像。
X = np.hstack((cluster1, cluster2, cluster3)).T#hstack用來串行連接3個數組
print('X=',X)
plt.scatter(X[:,0], X[:, 1])
print('X[:,0]=',X[:,0])#取得X中的第一列數據
print('X[:,1]=',X[:,1])#取得X中的第二列數據
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()# 測試9種不同聚類中心數量下,每種情況的聚類質量,并作圖。
#下面代碼就是為了繪制圖2-15的
K = range(1, 10)
print("------------------------------")
print("K=",K)
meandistortions = []for k in K:#K是個范圍kmeans = KMeans(n_clusters=k)#這里的意思是分成k類kmeans.fit(X)meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1))/X.shape[0])#cdist來自scipy,用來計算距離,這里特別代指歐氏距離
plt.plot(K, meandistortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Average Dispersion')
plt.title('Selecting k with the Elbow Method')
plt.show()
總結
以上是生活随笔為你收集整理的K-means算法在手写体数字图像数据上的使用示例-代码详解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。