感知机
1.Minsky和Papert指出:感知机是线性模型,所以不能表示复杂的函数,如异或(XOR),验证感知机为什么不能表示异或。
x(1) | x(2) | y |
0 | 0 | -1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | -1 |
表格表示输入相同为负实例,输入不同为正实例,满足异或的性质。解决这个题目要证明异或操作的线性不可分性,利用反证法证明:
假设存在一个超平面ωx+b=0,满足条件y(w⋅x+b)>0,根据表格数据可以得到四个等式:
①b<0
②ω(2)+b>0
③ω(1)+b>0
④ω(1)+ω(2)+b<0
①④合并得到ω(1)+ω(2)+2b<0,②③合并得到ω(1)+ω(2)+2b>0,矛盾,所以假设不成立,不存在超平面满足线性可分条件,因此异或操作线性不可分,感知机不能表示异或。
2.构建从训练数据集求解感知机模型的例子。(python实现)
(1)原始形式
import numpy as np
#构建感知机模型
def signfunction(w,x,b):
a=np.dot(w,x.T)+b
a[a<0] = -1
a[a>=0] = 1
return a
#学习w,b
def training(x,y,eta):
count=len(x)
feature_count=len(x[1])
#初始化w,b
#w=np.zeros(shape=feature_count)
w=np.random.randint(10,size=feature_count)
print("初始化w值为:",w)
b=0;
#统计误分类点的个数
wrong=sum(signfunction(w,x,b)!=y)
i=0
# 如果有误分类的点则更新w,b
while wrong>0:
xi = x[i]
yi = y[i]
# 选一个误分类的点更新w,b
if (yi * (np.dot(w, xi) + b) <= 0):
w = w + eta * yi * xi
b = b + eta * yi
wrong = sum(signfunction(w, x, b) != y)
# 当前点没有被误分类,则换下一个点
else:
i = (i + 1)%count
return w,b
if __name__ == '__main__':
x = np.array([[3,3],[4,3],[1,1]])
y=np.array([1,1,-1])
(w, b) = training(x,y,1)
print(w)
print(b)
输出如下:
所以,分离超平面为x(1)+2x(2)-4=0,感知机模型为f(x)=sign(x(1)+2x(2)-4)。注意:感知机学习算法由于采用不同的初值或者选取不同的误分类点,解可以不同,本例ω采用随机初始化0—10之间的整数,初始化不同,结果不同,经过式yi(w*xi+b)>0检验,模型正确。
(2)对偶形式
import numpy as np
#构建感知机模型
def signfunction(w,x,b):
a=np.dot(w,x.T)+b
a[a<0] = -1
a[a>=0] = 1
return a
#学习a,b,w
def training(x,y,eta):
count=len(x)
feature_count=len(x[1])
#初始化a,b,w
w=np.zeros(shape=feature_count)
a=np.zeros(shape=count)
b=0;
#计算Gram矩阵
Gram=np.dot(x,x.T)
print("G矩阵为:")
print(Gram)
wrong = sum(signfunction(w, x, b) != y)
i=0
while wrong>0:
if (y[i] * (a[0] * y[0] * Gram[0, i] + a[1] * y[1] * Gram[1, i] + a[2] * y[2] * Gram[2, i] + b )<= 0):
a[i] = a[i] + eta
b = b + y[i]
w = a[0] * y[0] * x[0] + a[1] * y[1] * x[1] + a[2] * y[2] * x[2]
wrong = sum(signfunction(w, x, b) != y)
else:
i = (i + 1) % count
print("a:",a)
print("b:",b)
print("w:",w)
if __name__ == '__main__':
x = np.array([[3,3],[4,3],[1,1]])
y=np.array([1,1,-1])
training(x,y,1)
输出如下: