学习向量量化LVQ
學習向量量化
“學習向量量化”(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]])
總結
- 上一篇: 支持向量机SVM序列最小优化算法SMO
- 下一篇: PSO算法