1. 程式人生 > 其它 >numpy實現線性可分支援向量機

numpy實現線性可分支援向量機

importtorch importtorch.nnasnn importnumpyasnp importpandasaspd a=np.zeros(128) b=0 deftake(i1,i2): globalb ifi1==i2: return0 w=0 foriinrange(128): w=w+a[i]*train[i]*train_label[i] e1=np.dot(w,train[i1])+b-train_label[i1] e2=np.dot(w,train[i2])+b-train_label[i2] eta=np.dot(train[i1],train[i1])+np.dot(train[i2],train[i2])-2*np.dot(train[i1],train[i2]) alpha2=a[i2]+train_label[i2]*(e1-e2)/eta L=0 H=0 old2=a[i2] iftrain_label[i1]!=train_label[i2]: L=np.maximum(0,a[i2]-a[i1]) ifalpha2<L: a[i2]=L else: a[i2]=alpha2 else: L=0 H=np.maximum(0,a[i2]+a[i1]) ifalpha2<L: a[i2]=L elifalpha2>H: a[i2]=H else: a[i2]=alpha2 a[i1]=a[i1]+train_label[i1]*train_label[i2]*(old2-a[i2]) b1=train_label[i1]-np.dot(w,train[i1]) b2=train_label[i2]-np.dot(w,train[i2]) ifa[i1]>0: b=train_label[i1]-np.dot(w,train[i1]) elifa[i2]>0: b=train_label[i2]-np.dot(w,train[i2]) else: b=(b1+b2)/2 ifabs(old2-a[i2])<=0.0001: return0 return1 defexamineExample(i2): forsuoinrange(128): if(a[suo]>0): if(take(suo,i2)): return1 forsuoinrange(128): if(a[suo]==0): if(take(suo,i2)): return1 return0 train=np.random.randint(-300,300,(128,4)) test=np.random.randint(-300,300,(30,4)) train=train.astype(float) test=test.astype(float) foriinrange(4): train[:,i]=(train[:,i]-train[:,i].mean())/train[:,i].std() foriinrange(4): test[:,i]=(test[:,i]-test[:,i].mean())/test[:,i].std() print(train) w=[1,2,3,4] train_label=np.dot(train,w)+5 test_label=np.dot(test,w)+5 train_label=train_label>0 train_label=train_label.astype(int) train_label=train_label*2-1 test_label=test_label>0 test_label=test_label.astype(int) test_label=test_label*2-1

numChanged=0 examineAll=1 while(numChanged>0orexamineAll): numChanged=0 ifexamineAll: foriinrange(128): numChanged=numChanged+examineExample(i) else: foriinrange(128): if(a[i]>0): numChanged=numChanged+examineExample(i) ifexamineAll==1: examineAll=0 elifnumChanged==0: examineAll=1 w=0 foriinrange(128): w=w+a[i]*train[i]*train_label[i] m=0 max=0 li=0 foriinrange(128): ifi==0: max=a[i] li=0 if(a[i]!=0): b=train_label[i]-np.dot(w,train[i]) print(b) ifi==0: li=0 max=a[i] elifmax<np.float(a[i]): max=a[i] li=i b=train_label[li]-np.dot(w,train[li]) print(b) sum1=0 loss=0 foriinrange(128): targer=0 ifnp.dot(w,train[i])+b>0: targer=1 elifnp.dot(w,train[i])+b<0: targer=-1 iftarger!=train_label[i]: sum1=sum1+1 print("訓練出錯數",sum1,"訓練誤差率:",sum1/128) foriinrange(30): targer=0 ifnp.dot(w,train[i])+b>0: targer=1 elifnp.dot(w,train[i])+b<0: targer=-1 iftarger!=train_label[i]: loss=loss+1 print("測試出錯數",loss,"測試誤差率:",loss/30) print(a) print(w,b)