日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

学习向量量化LVQ

發(fā)布時間:2023/11/28 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习向量量化LVQ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

學習向量量化

“學習向量量化”(Learning Vector Quantization,簡稱LVQ)是一種利用監(jiān)督信息輔助的聚類算法,像K-Meas算法一樣也是通過調整一組類似于質心的點來進行聚類。


算法描述

假設給定樣本D={(X1,Y1),(X2,Y2),…,(Xm,Ym)},X表示樣本的屬性,Y表示樣本的類別標記。LVQ目的是學習一組n維原型向量{P1,P2,…Pq},當樣本點距離這組原型向量的某個分向量距離最近時那么它的類別標記應當與這個原型分向量一致。原型向量的訓練過程和K-Means算法大同小異,初始時通過隨機一組原型向量(可以從樣本點中隨機提取),當與原型向量最近的樣本點類別標記與此原型向量的類別不同時,那么要調整原型向量,使得原型向量離當前的樣本點遠一些,相反則需要調整它離當前樣本點近一些,當算法滿足停止條件時(達到最大迭代次數,或原型向量更新變化很小甚至不變時)則可以返回這一組原型向量。

代碼實現(xiàn):

生成數據集:

X=datasets.make_blobs(n_samples=1000,centers=3) #1000個樣本點分為3類

初始化原型向量:

P=np.zeros((q,col)) #原型向量for i in range(q):   #初始化原型向量index=np.where(sample[1]==Label[i])[0]choose=np.random.randint(0,len(index),1)P[i,:]=sample[0][index[choose],:]

訓練主體:

for i in range(1000):   #訓練choose=np.random.randint(0,row,1) #隨機選取一個樣本dis=np.linalg.norm(sample[0][choose,:]-P,axis=1) #計算與原型向量的距離y=dis.tolist().index(min(dis))  #獲取距離最近的原型向量下標if Label[y]==sample[1][choose]: #更新原型向量P[y,:]=P[y,:]+eta*(sample[0][choose,:]-P[y,:])else:P[y,:]=P[y,:]-eta*(sample[0][choose,:]-P[y,:])

完整代碼:

from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np
X=datasets.make_blobs(n_samples=1000,centers=3) #1000個樣本點分為3類def lvq(sample,q,Label,eta):if q!=len(Label):return 0row,col=np.shape(sample[0]) #獲取樣本集的規(guī)格P=np.zeros((q,col)) #原型向量for i in range(q):   #初始化原型向量index=np.where(sample[1]==Label[i])[0]choose=np.random.randint(0,len(index),1)P[i,:]=sample[0][index[choose],:]for i in range(1000):   #訓練choose=np.random.randint(0,row,1) #隨機選取一個樣本dis=np.linalg.norm(sample[0][choose,:]-P,axis=1) #計算與原型向量的距離y=dis.tolist().index(min(dis))  #獲取距離最近的原型向量下標if Label[y]==sample[1][choose]: #更新原型向量P[y,:]=P[y,:]+eta*(sample[0][choose,:]-P[y,:])else:P[y,:]=P[y,:]-eta*(sample[0][choose,:]-P[y,:])IDX=[]  #分類標記for i in sample[0]:  #以距離最近的標記為樣本的類別D=np.linalg.norm(i-P,axis=1)y=D.tolist().index(min(D))IDX.append(Label[y])plot(IDX,sample[0],max(Label)+1,P)return P
def plot(a,X,k,p):  #繪畫板塊m=kfor j in range(m):index=[i for i,v in enumerate(a) if v==j]x=[]y=[]for k in index:x.append(X[k][0])y.append(X[k][1])plt.scatter(x,y)plt.scatter(p[:,0],p[:,1],marker='x')plt.show()

測試代碼:

lvq(X,5,[0,1,0,1,2],0.3)
array([[  7.02402226,   3.74801884],[-10.38672182,   3.03633487],[  8.20578187,   4.94912081],[ -8.30953565,   3.69883677],[  7.69178827,  -7.90175793]])

總結

以上是生活随笔為你收集整理的学习向量量化LVQ的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。