李航第二章课后习题

本文详细解析了感知机为何无法表示异或问题,通过反证法证明了其线性不可分性。此外,还介绍了线性可分的充分必要条件,涉及凸壳的概念,并探讨了如何通过凸壳不相交构造线性可分的超平面。内容包括理论证明和部分代码实现。
摘要由CSDN通过智能技术生成

原文在我的个人博客上,欢迎叨扰。

2.1

**题目描述:**Minsky和Papert指出:感知机是线性模型,所以不能表示复杂的函数。如异或(XOR),验证感知机为什么不能表示异或。

解:异或的输入输出如下:

x(1) x(2) y
1 1 -1
1 -1 1
-1 1 1
-1 -1 -1

接下来我们简单证明一下异或操作的线性不可分性:

证:利用反证法,假设存在一个超平面 wx+b=0 ,满足条件:

y(wx+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

题目描述:证明以下定理:样本集线性可分的充分必要条件是正实例点所构成的凸壳与负实例点所构成的凸壳互不相交。

凸壳的定义:设集合 SRn 是由 Rn</

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值