1. 程式人生 > >《Python機器學習及實踐》----無監督學習之資料聚類

《Python機器學習及實踐》----無監督學習之資料聚類

本片部落格是根據《Python機器學習及實踐》一書中的例項,所有程式碼均在本地編譯通過。資料為從該書指定的百度網盤上下載的,或者是sklearn自帶資料下載到本地使用的。
程式碼片段:

# 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('D:\Source Code\machinelearn\optdigits.tra'
, header=None) digits_test = pd.read_csv('D:\Source Code\machinelearn\optdigits.tes', header=None) # 從訓練與測試資料集上都分離出64維度的畫素特徵與1維度的數字目標。 X_train = digits_train[np.arange(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) # 從sklearn匯入度量函式庫metrics。 from sklearn import metrics # 使用ARI進行KMeans聚類效能評估。 print metrics.adjusted_rand_score(y_test, y_pred) 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) # 初始化原始資料點。 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) # 在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: subplot_counter += 1 plt.subplot(3, 2, subplot_counter) kmeans_model = KMeans(n_clusters=t).fit(X) for i, l in enumerate(kmeans_model.labels_): plt.plot(x1[i], x2[i], color=colors[l], marker=markers[l], ls='None') plt.xlim([0, 10]) plt.ylim([0, 10]) sc_score = silhouette_score(X, kmeans_model.labels_, metric='euclidean') sc_scores.append(sc_score) # 繪製輪廓係數與不同類簇數量的直觀顯示圖。 plt.title('K = %s, silhouette coefficient= %0.03f' %(t, sc_score)) # 繪製輪廓係數與不同類簇數量的關係曲線。 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)) 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 plt.scatter(X[:,0], X[:, 1]) plt.xlabel('x1') plt.ylabel('x2') plt.show() # 測試9種不同聚類中心數量下,每種情況的聚類質量,並作圖。 K = range(1, 10) meandistortions = [] for k in K: kmeans = KMeans(n_clusters=k) kmeans.fit(X) meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1))/X.shape[0]) plt.plot(K, meandistortions, 'bx-') plt.xlabel('k') plt.ylabel('Average Dispersion') plt.title('Selecting k with the Elbow Method') plt.show()