Python無監督學習(三)

2021-10-20 19:16:34 字數 3881 閱讀 4808

自組織對映是一種基於拓撲表示法的資料降維技術。這樣的技術有很多,其中主成分分析便是比較有名的一種。然而,作為降維技術和視覺化形式,自組織對映自有其獨到之處。

自組織對映演算法需要反覆迭代一些簡單的操作。在目標資料集很小時,自組織對映與k均值聚類非常類似(後面很快會講到);目標資料集較大時,自組織對映就會用一種強大的方式展現複雜資料集的拓撲結構。

自組織對映是由許多節點構成的網格(一般是矩形或六邊形),每個節點都包含乙個權重向量,該權重向量的維度與輸入資料集相同。節點可以隨機初始化,但與資料集分布大致相似的初始化能令演算法訓練得更快。

演算法會隨觀測值的輸入而迭代,迭代的形式如下所示。

與輸入向量距離最近的權重向量所在節點即最佳匹配單元。

即優勝鄰域內的節點,其中優勝鄰域也是由鄰域函式決定的。

該過程可能會重複多次,並運用合適的取樣方法,直到網路收斂(當新輸入項增加時,損失無法進一步降低)。

與神經網路的節點不同,自組織對映的節點通常會包含乙個長度與輸入資料集維度相同的權重向量,也就是說,輸入資料集的拓撲結構可以用乙個低維對映來儲存並進行視覺化。

目前,先在熟悉的環境下應用自組織對映演算法。

前面提到過,自組織對映演算法是迭代的,建立在向量間歐幾里得距離之上。

該對映會形成乙個清晰易讀的2d網格。就通用的鳶尾花教學資料集來說,自組織對映可以非常簡潔地進行對映(見圖1-8)。

圖 1-8

圖中的類得到了有效劃分,且按空間進行了排序。此例中的背景色代表的是聚類密度。藍色類和綠色類出現了細微的重疊,此處自組織對映的分類也不夠理想。在鳶尾花資料集中,自組織對映會在100次迭代後得到收斂的解決方案,而迭代增加到1000次時,效果提公升並不明顯。對分類不清的更複雜的資料集來說,該過程可能會持續成千上萬次迭代。

尷尬的是,python目前沒有類似scikit-learn這種包含自組織對映演算法的包。因此,我們必須自己動手實現。

我們將處理的自組織對映**位於相應的github庫中。現在我們先來看一下相關指令碼,並大致理解**的執行。

import numpy as np

from sklearn.datasets import load_digits

from som import som

from pylab import plot,axis,show,pcolor,colorbar,bone

digits = load_digits(

)data = digits.data

labels = digits.target

至此,我們就載入好了digits資料集,並根據資料標籤定義了變數labels。這樣做可以方便我們觀察自組織對映演算法是如何通過低維對映進行類區分的。

som = som(16,16,64,sigma=1.0,learning_rate=0.5)

som.random_weights_init(data)

print(

"initiating som."

)som.train_random(data,10000)

print(

"\n. som processing complete"

)bone(

)pcolor(som.distance_map(

).t)

colorbar(

)

這裡我們使用了som.py檔案中定義的som類,該類包含了我們用來實現自組織對映演算法的方法。我們將提供對映的維度(經過一系列嘗試後,本例將16×16作為網格規模,因為這樣的網格規模能夠給特徵對映留有充足的延伸空間,即使仍可能存在一些簇間的重疊)和輸入資料的維度(用來確定自組織對映節點的權重向量的維度)作為函式的引數,同時提供sigma值和學習率。

本例中的sigma定義了鄰域函式的覆蓋範圍。如前文所述,我們使用的是高斯鄰域函式。最恰當的sigma值與網格規模有關。對8×8的網格來說,sigma的值一般取1.0,而本例16×16的網格對應的最佳sigma值為1.3。sigma取值不恰當是很容易發現的。當sigma過小時,資料點會在網格的中心聚集;當sigma過大時,網格中心就會出現若干較大空白。

不言自明,指標學習率指的是自組織對映的初始學習率。隨著對映的迭代,學習率會根據以下公式進行調整:

學 習率

(t)=

學習率/

(1+0.5∗t

)學習率 (t) = 學習率 / (1+0.5*t)

學習率(t)

=學習率

/(1+

0.5∗

t)其中t為迭代指數。

先用隨機權重來初始化我們的自組織對映。

與k均值聚類相同,自組織對映的隨機初始化比基於近似資料分布的初始化要慢。應用與k均值++演算法相似的預處理步驟,可以節約自組織對映的執行時間。目前來看,我們的自組織對映已經在digits資料集上執行得很快了,因此沒必要進行這樣的優化。

接下來,給每個類定義標籤並分配顏色,以便在自組織對映影象中區分它們。然後遍歷每個資料點。

每次迭代時,都要根據自組織對映演算法的計算結果標出表明類的bmu。

自組織對映結束迭代時,需要新增u矩陣(一種表示相對觀測密度的顏色矩陣)作為乙個單色圖層:

labels[labels ==

'0']

= 0labels[labels ==

'1']

= 1labels[labels ==

'2']

= 2labels[labels ==

'3']

= 3labels[labels ==

'4']

= 4labels[labels ==

'5']

= 5labels[labels ==

'6']

= 6labels[labels ==

'7']

= 7labels[labels ==

'8']

= 8labels[labels ==

'9']

= 9markers =

['o', 'v', '1', '3', '8', 's', 'p', 'x', 'd', '*'

]colors =

["r", "g", "b", "y", "c", (0,0.1,0.8), (1,0.5,0), (1,1,0.3),

"m", (0.4,0.6,0)

]for cnt,xx in enumerate(data):

w = som.winner(xx)

plot(w[0]+.5,w[1]+.5,markers[labels[cnt]

], marke***cecolor=

'none', markeredgecolor=colors[labels[cnt]

], markersize=12, markeredgewidth=2)

axis(

[0,som.weights.shape[0],0,som.weights.shape[1]])

show(

)

以上**可以得到的影象如圖1-9所示。

圖 1-9

這段**生成了一幅16×16個節點的自組織對映影象。由圖可知,對映成功將每個簇分離成了拓撲上截然不同的影象區域。雖然其中幾個類(尤其是藍綠色圓圈代表的數字5和綠色星號代表的數字9)出現在了自組織對映空間的許多位置,但大多數情況下,每個類都單獨佔據一塊區域,這說明自組織對映還是非常有效的。u矩陣表明,資料點密度較高的區域往往會包含多個類的資料,這一點我們在k均值聚類和主成分分析影象中早已見過,並不足為奇。

有監督學習和無監督學習 無監督學習

一.無監督學習包含的演算法 聚類 kmeans聚類演算法 降維 pca 之所以叫無監督學習 是因為模型是從無標籤的資料開始學習,沒有目標值。二.kmeans聚類 1.聚類演算法步驟 定義 將高維資料轉化為低維資料的過程,在此過程中可能會捨棄原有資料,創造新的變數 作用 降低原始資料的維數 複雜度 損...

無監督學習與監督學習

1.無監督和有監督的理解方法有很多,主要可以從以下幾方面來理解 1 無監督與監督學習的區別在於乙個無教學值,乙個有教學值。但是,個人認為他們的區別在於無監督學習一般是採用聚簇等演算法來分類不同樣本。而監督學習一般是利用教學值與實際輸出值產生的誤差,進行誤差反向傳播修改權值來完成網路修正的。但是無監督...

監督學習和無監督學習

機器學習要解決的第一類問題是分類問題。機器學習的另一項任務是回歸,它主要用於 數值型資料。大多數人可能都見過回歸的例子 資料擬合曲線 通過給定資料點的最優擬合曲線。分類和回歸都屬於監督學習,之所以稱之為監督學習,是因為這類演算法必須知道 什麼,即目標變數的分類資訊。與監督學習對應的是無監督學習,此時...