手寫LVQ(學習向量量化)聚類演算法

2022-02-17 04:30:33 字數 3474 閱讀 7346

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 假設資料樣本帶有類別標記,學習過程利用樣本的這些監督資訊來 輔助聚類.可看作通過聚類來形成 類別 子類 結構,...