《统计学习方法》第二章感知机习题

2.1 验证感知机为什么不能表示异或

设有样本点x1=(0,0),x2=(0,1),x3=(1,0),x4=(1,1),则由异或的性质得各样本点的输出为y1=0,y2=1,y3=1,y4=0,所以x1和x4为负样本点,x2和x3为正样本点。由正负样本点的分布很容易得知样本不是线性可分的,因此不能用感知机表示。

2.2 构建从训练数据集求解感知机模型的例子

数据集选取sklearn自带的load_iris数据集。Iris数据集在模式识别研究领域应该是最知名的数据集了,有很多文章都用到这个数据集。这个数据集里一共包括150行记录,其中前四列为花萼长度,花萼宽度,花瓣长度,花瓣宽度等4个用于识别鸢尾花的属性,第5列为鸢尾花的类别(包括Setosa,Versicolour,Virginica三类)。也即通过判定花萼长度,花萼宽度,花瓣长度,花瓣宽度的尺寸大小来识别鸢尾花的类别。再这里,我们选取花瓣长度,花瓣宽度作为训练数据,并选用Setosa,Versicolour构造y标签。

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

iris=load_iris()
df=pd.DataFrame(iris.data, columns=iris.feature_names)
df['label']=iris.target

# 从iris中构建数据集,这里选用petal字段的数据,即取第2,3和最后一列的前100条数据
data=np.array(df.iloc[:100, [2, 3, -1]])
X, Y=data[:, :-1], data[:, -1]
Y=np.array([1 if e==1 else -1 for e in Y])

class Perceptron:
    def __init__(self, x_data):
        self.w = np.zeros(len(x_data[0]))# w维度与x维度相同
        self.b = 0 # 偏置
        self.n = 0.1 # 学习率

    def sign(self, x):
        y=np.dot(x, self.w)+self.b
        return y

    def train(self,x,y):
        while True:
            false_count = 0
            for i in range(len(x)):
                # 误分类点,需要更新权重
                if y[i]*self.sign(x[i])<=0:
                    self.w = self.w + self.n*np.dot(y[i], x[i])
                    self.b = self.b + self.n*y[i]
                    false_count += 1
            # 没有误分类点就退出
            if false_count==0:
                break

p = Perceptron(X)
p.train(X, Y)
print(p.w, p.b)
# 直线是w1x1+w2x2+b=0
x1=np.linspace(1, 4, 20)  # 生成20个横坐标,是从1-4的等差序列
x2=-(p.w[0]*x1+p.b)/p.w[1]  # 根据直线计算纵坐标
plt.plot(x1, x2, color='red', alpha=0.8, linestyle='-.')

plt.scatter(X[:50, 0], X[:50, 1], label='0')
plt.scatter(X[50:, 0], X[50:, 1], label='1')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend()
plt.show()

在这里插入图片描述

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

详细证明参考凸壳与线性可分

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hilbob

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值