lvq聚類與k-means不同之處在於,它是有標記的聚類。
基本思想:初始化q個原型向量(q代表需要聚類的類別數),每個原型向量也初始化其標籤(標籤與樣本標籤取值範圍相同),如果原型向量的標籤與某樣本標籤相同/不同,則使用兩者間距離更新原型向量(相同時靠近更新,不同時遠離更新)。因此,原型向量將反映乙個標籤的樣本與其他標籤的樣本間的「邊界」。訓練完畢後,根據樣本到原型向量的距離,對樣本進行團簇劃分。
缺點:因為一般使用歐氏距離,各特徵的權重是相同的,無法反映不同特徵的重要性差異。
#先看看原始資料分布:學習向量量化lvq:有標記的聚類
import
numpy as np
import random
defdis(x,y):
return np.sqrt(np.sum(np.power(x[:-1]-y[:-1],2)))
#lvq演算法
def lvq(data,labels,k=4,lr=0.01,epochs=1000,delta=1e-3):
'''data:np.array,last feature is the label.
labels:1-dimension list or array,label of the data.
k:num_group
lr:learning rate
epochs:max epoch to stop running earlier
delta: max distance for two vectors to be 'equal'.
'''#
學習向量
q=np.empty(shape=(k,data.shape[-1]),dtype=np.float32)
#確認是否所有向量更新完了
all_vectors_updated=np.empty(shape=(k,),dtype=np.bool)
num_labels=len(labels)
#初始化原型向量,從每一類中隨機選取樣本,如果類別數小於聚類數,迴圈隨機取各類別中的樣本
for i in
range(k):
q[i]=random.choice(data[data[:,-1]==labels[i%num_labels]])
step=0
while
not all_vectors_updated.all() and step
#從樣本中隨機選取樣本,書上是這麼寫的,為啥不迴圈,要隨機呢?np.random的choice只支援一維
x=random.choice(data)
min_dis=np.inf
index=0
for i in
range(k):
distance=dis(x,q[i])
if distance
min_dis=distance
index=i
#儲存更新前向量
temp_q=q[index].copy()
#如果標籤相同,則q更新後接近樣本x,否則遠離
if x[-1]==q[index][-1]:
q[index][:-1]=q[index][:-1]+lr*(x[:-1]-q[index][:-1])
else
: q[index][:-1]=q[index][:-1]-lr*(x[:-1]-q[index][:-1])
#更新記錄陣列
if dis(temp_q,q[index])
all_vectors_updated[index]=true
step+=1
#訓練完後,樣本劃分到最近的原型向量簇中
categoried_data=
for i in
range(k):
for item in
data:
min_dis=np.inf
index=0
for i in
range(k):
distance=dis(item,q[i])
if distance
min_dis=distance
index=i
return
q,categoried_data
這裡執行了2次,可以看出與k-means一樣,對初值敏感
根據上圖可以看出,聚類的效果是在標記的前提下進行的,即團簇是很少跨過分類邊界y=x的。相當於對每乙個類別,進行了細分。因為每次訓練根據乙個樣本更新,epochs應該設定大一點。
LVQ學習向量量化
現在已經2011年五月份了,今年的兩個多月幾乎沒什麼成果,想到水樣年華這個詞,額!總結過往,翹首未來,心中不免些許迷茫,程式設計師之路在何方?靡靡之音,不絕於耳,然何時我也能奏一首陽春白雪,不為流傳於世,只求一心靈安靜之所!lvq原理不再贅述,其本質可以看成是最近鄰分類,所謂競爭性神經網路,即把歐氏...
機器學習之學習向量量化 LVQ
學習向量量化是一種聚類演算法,我自己感覺這應該是一種監督學習演算法吧,這種演算法屬於原型聚類,找到初始原型來刻畫聚類結構,與一般聚類演算法不同的是,lvq 這種演算法資料樣本帶有監督資訊標記 通過資料集不斷學習不斷移動原型向量的位置,把高維空間劃分成 n 個簇,每個原型向量代表乙個聚類簇。初始化一組...
學習向量量化
與 k 均值演算法類似,學習向量量化 learning vector quantization,簡 稱 lvq 也是試圖找到一組原型向量來刻畫聚類結構,但與一般聚類演算法不同 的是,lvq 假設資料樣本帶有類別標記,學習過程利用樣本的這些監督資訊來 輔助聚類.可看作通過聚類來形成 類別 子類 結構,...