-
Notifications
You must be signed in to change notification settings - Fork 0
/
dual perceptron.py
56 lines (48 loc) · 1.56 KB
/
dual perceptron.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from __future__ import division
import random
import numpy as np
import matplotlib.pyplot as plt
def sign(v):
if v>=0:
return 1
else:
return -1
def train(train_num,train_datas,lr):
w=0.0
b=0
datas_len=len(train_datas)
alpha=[0 for i in range(datas_len)]
train_array=np.array(train_datas)
gram=np.matmul(train_array[:,0:-1],train_array[:,0:-1].T)
for idx in range(train_num):
tmp=0
i=random.randint(0,datas_len-1)
yi=train_array[i,-1]
#print yi
for j in range(datas_len):
tmp+=alpha[j]*train_array[j,-1]*gram[i,j]
tmp+=b
if(yi*tmp<=0):
alpha[i]=alpha[i]+lr
b=b+lr*yi
for i in range(datas_len):
w+=alpha[i] * train_array[i,0:-1] * train_array[i,-1]
return w,b,alpha,gram
def plot_points(train_datas, w, b):
plt.figure()
x1 = np.linspace(0, 10, 100)
x2 = (-b - w[0] * x1) / (w[1] + 1e-10)
plt.plot(x1, x2, color='r', label='y1 data')
datas_len = len(train_datas)
for i in range(datas_len):
if (train_datas[i][-1] == 1):
plt.scatter(train_datas[i][0], train_datas[i][1], s=50)
else:
plt.scatter(train_datas[i][0], train_datas[i][1], marker='x', s=50)
plt.show()
if __name__=='__main__':
train_data1 = [[1, 3, 1], [2, 2, 1], [3, 8, 1], [2, 6, 1]]
train_data2 = [[2, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]]
train_datas = train_data1 + train_data2
w,b,alpha,gram=train(train_num=500,train_datas=train_datas,lr=0.01)
plot_points(train_datas,w,b)