原始形式
# coding: utf-8
# 原始感知机的学习算法
import pandas as pd
import numpy as np
from pandas import *
import matplotlib.pyplot as plt
from numpy import *
x = np.array([[3, 4, 1],[3, 3, 1]]) #数据集
x = x.transpose()
print x[:,1]
y = np.array([1, 1, -1])
y = y.transpose()
m, n = shape(x)
w = zeros(n)
b = zeros(1)
Eta = 1
i = 1
while(1):
flag = 0
for i in range(0, m):
ca = 0
for h1 in range(0, n):
ca += x[i][h1] * w[h1]
result = (ca + b[0]) * y[i]
print i, result
if result <= 0:
flag = 1
for h1 in range(0, n):
w[h1] = w[h1] + Eta * y[i] * x[i][h1]
b[0] = b[0] + y[i]
break
if (i == 2) & (flag == 0):
break
for i in range(0, n):
print w[i] , b
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax1.scatter(x[:, 0], x[:, 1])
x1 = array([3, 3, 1])
y1 = 3 - x1
y1 = y1.transpose()
print 'x1', x1
print 'y1', y1
ax1.plot(x1, y1)
plt.show()
分类的结果图片显示为:
对偶形式
# 感知机的对偶形式
import pandas as pd
from pandas import *
import numpy as np
from numpy import *
x = array([[3, 4, 1], [3, 3, 1]])
y = array([1, 1, -1])
x = x.transpose()
m, n = shape(x)
Alpha = zeros(m)
Eta = 1
b = 0
flag = 0
while(1):
flag = 0
for i in range(0, m):
temp = 0
for j in range(0, m):
for k in range(0, n):
temp = temp + Alpha[j] * y[j] * x[j][k] * x[i][k]
result = y[i] * (temp + b)
if result <= 0:
flag = 1
Alpha[i] = Alpha[i] + Eta
b = b + Eta * y[i]
break
if (flag == 0) & (i == m-1):
break
for i in range(0, m):
print Alpha[i], b