numpy實現線性可分支援向量機
阿新 • • 發佈:2021-08-05
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)
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)