我一直在看這個將數字資料集擬合到 Python 教程here上的 k-means 集群,其中一些代碼只是讓我感到困惑。
我確實理解這部分我們需要使用 10 個集群來訓練我們的模型。
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
kmeans = KMeans(n_clusters=10, random_state=0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
下面向我們展示了控制臺上 10 個集群質心的輸出。它首先創建有兩行的圖形和軸,每行有 5 個軸子圖回傳圖形,(8,3) 是顯示在控制臺上的圖形的大小。但在那之后,我只是不明白該命令如何在 for 回圈中顯示集群質心的輸出。
fig, ax = plt.subplots(2, 5, figsize=(8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks=[], yticks=[])
axi.imshow(center, interpolation='nearest', cmap=plt.cm.binary)
此外,這部分是檢查聚類在找到資料中的相似數字方面的準確性。我知道我們需要創建一個與填充為零的集群具有相同大小的標簽,以便我們可以將預測的標簽放在那里。但同樣,我只是不明白他們如何在 for 回圈中實作它。
from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
mask = (clusters == i)
labels[mask] = mode(digits.target[mask])[0]
有人可以解釋一下每行命令的作用嗎?謝謝你。
uj5u.com熱心網友回復:
問題 1:代碼如何繪制質心?
重要的是要看到每個質心都是特征空間中的一個點。換句話說,質心看起來像是訓練樣本之一。在這種情況下,每個訓練樣本都是一個 8 × 8 的影像(盡管它們已經被扁平化為具有 64 個元素的行(因為sklearn總是希望輸入X是一個二維陣列)。所以每個質心也代表一個 8 × 8 的影像。
回圈遍歷軸(2×5矩陣)和質心(kmeans.cluster_centers_一起。目的zip是確保每個Axes物件都有一個對應的(這是將一堆n個東西center繪制成一堆的常用方法) n個子圖)。質心已被重新整形為 10 × 8 × 8 陣列,因此 10 個質心中的每一個都是我們期望的 8 × 8 影像。
由于每個質心現在都是一個二維陣列,您可以使用imshow它來繪制它。
問題2:代碼如何分配標簽?
最簡單的事情可能是將代碼拆開并自行運行其中的一部分。例如,看看clusters == 0. 這是一個布爾陣列。您可以使用布爾陣列來索引相同形狀的其他陣列。回圈中的第一行代碼將這個陣列分配給mask我們可以使用它。
然后我們labels使用布爾陣列索引(試試看!)說,“將這些值更改為標簽向量的相應元素的模式平均值,即digits.target。” [0]由于函式回傳的內容,因此只需要索引scipy.stats.mode()(再次嘗試一下)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/485284.html
下一篇:將這些張量與梯度相乘的方法
