原文在我的个人博客上,欢迎叨扰。
2.1
**题目描述:**Minsky和Papert指出:感知机是线性模型,所以不能表示复杂的函数。如异或(XOR),验证感知机为什么不能表示异或。
解:异或的输入输出如下:
x(1) | x(2) | y |
---|---|---|
1 | 1 | -1 |
1 | -1 | 1 |
-1 | 1 | 1 |
-1 | -1 | -1 |
接下来我们简单证明一下异或操作的线性不可分性:
证:利用反证法,假设存在一个超平面
y(w⋅x+b)>0
∀x∈{
(1,1)T,(−1,1)T,(1,−1)T,(−1,−1)T}
根据异或的输入输出,可以得到以下四个不等式:
w(1)+w(2)+b<0⇢(1)
w(1)−w(2)+b>0⇢(2)
−w(1)−w(2)+b<0⇢(3)
−w(1)+w(2)+b>0⇢(4)
(1)式+(3)式可得: b<0 ,但是(2)式+(4)式可得: b>0 。矛盾,故不存在超平面满足线性可分条件。
2.2
题目描述:模仿例题 2.1,构建从训练数据求解感知机模型的例子。
解:很水的一道题,用jupyter撸了一遍代码:
import numpy as np
import random
import matplotlib.pyplot as plt
# 定义输入数据
tx = [[3,3],[4,3],[1,1]]
ty = [+1,+1,-1]
# 作图
tcolor = [0]*len(ty)
for i in range(len(ty)):
tcolor[i] = ('r' if ty[i] == +1 else 'b')
print(tcolor)
transpose = np.array(tx).T
plt.scatter(transpose[0],transpose[1],c=tcolor)
plt.axis([0, 5, 0, 5])
plt.show()
['r', 'r', 'b']
# 定义原始形式的感知机
class Perceptron():
def __init__(self):
self.learning_rate = 1
def train(self,x,y):
# 定义w和b
w = np.array([1]*len(x[0]))
b = 1
print "w,b初始值:"
print w,b
# 正确个数
correct_flag = [0]*len(x)
while 1:
# 从训练集中拿一个数据
index = random.randint(0, len(x) - 1)
if correct_flag[index]:
continue
X = np.array(x[index])
Y = y[index]
# 是否分类正确
temp = Y*(np.sum(w*X) + b)
if temp > 0:
correct_flag[index] = 1
# print("点(%d,%d)分类正确" % (X[0],X[1]))
if np.sum(correct_flag) >= len(x):
print("所有点分类正确,结束迭代")
break
else:
correct_flag = [0]*len(x)
print("点(%d,%d)分类错误" % (X[0],X[1]))
w = w + self.learning_rate*Y*X
b = b + self.learning_rate*Y
print "对w,b进行调整:"
print w,b
self.w = w
self.b = b
def getWb(self):
return self.w,self.b
p = Perceptron()
p.train(tx,ty)
w,b初始值:
[1 1] 1
点(1,1)分类错误
对w,b进行调整:
[0 0] 0
点(1,1)分类错误
对w,b进行调整:
[-1 -1] -1
点(4,3)分类错误
对w,b进行调整:
[3 2] 0
点(1,1)分类错误
对w,b进行调整:
[2 1] -1
点(1,1)分类错误
对w,b进行调整:
[1 0] -2
所有点分类正确,结束迭代
# 作图
w,b=p.getWb()
# 构造直线
if w[1] == 0:
y=np.linspace(0,5,100) #这个表示在0到5之间生成100个x值
x=[-(w[1]*i+b)/w[0] for i in y] #对上述生成的1000个数循环用sigmoid公式求对应的y
else:
x=np.linspace(0,5,100) #这个表示在0到5之间生成100个x值
y=[-(w[0]*i+b)/w[1] for i in x] #对上述生成的1000个数循环用sigmoid公式求对应的y
plt.plot(x,y)
plt.scatter(transpose[0],transpose[1],c=tcolor)
plt.axis([0, 5, 0, 5])
plt.show()
2.3
题目描述:证明以下定理:样本集线性可分的充分必要条件是正实例点所构成的凸壳与负实例点所构成的凸壳互不相交。
凸壳的定义:设集合 S∈Rn 是由 Rn