模式识别实验三

实验三

一  实验名称

感知器设计

二 目的和意义

使用感知器完成线性分类任务

三 操作步骤或算法结构

  1. 数据预处理。载入数据文件( iris.csv 文件)中的数据,并将其分成样本向量矩阵X和样本分类结果向量 G \bf G G

  2. 4 4 4 列向量的 X X X 在最前增加一列常数 1 1 1,得到增广向量 y y y 。定义增广权向量 α α α,取各项初值为 1 1 1

  3. 根据错分惩罚的感知器准则函数原理设计感知器(公式 8.1 8.1 8.1 8.4 8.4 8.4,及教材 150 页算法 8-1 ),将包含三类的样本 X X X 分别训练。取出每一类的 80 % 80\% 80% 作为训练样本,剩余 20 % 20\% 20% 作为对比样本。第一次训练,将第一类训练样本保持不变,第二第三类取负值,分类判断出第一类样本。第二次训练,将剩余样本的第二类保持不变,第三类取负值,试训练第二类样本。观察两次训练的结果是否收敛。

    • 公式 8.1 8.1 8.1
      f ( x ) = sign ( ω T x + b ) = { + 1    ω T x + b ≥ 0 − 1    o t h e r s f(\textbf x) = \textbf {sign} (\omega^T\textbf x+b) = \begin{cases}+1 \ \ \omega^Tx +b \geq 0 \\-1\ \ others\end{cases} f(x)=sign(ωTx+b)={+1  ωTx+b01  others

    • 公式 8.2 8.2 8.2
      sign ( x ) = { + 1    x ≥ 0 − 1    x < 0   \textbf {sign}(\textbf x) =\begin{cases}+1\ \ \textbf x \geq 0 \\-1\ \ \textbf x < 0\ \end{cases} sign(x)={+1  x01  x<0 

    • 公式 8.3 8.3 8.3
      − 1 ∣ ∣ ω ∣ ∣ ∑ x i ∈ M y i ( ω T x i + b ) -\frac{1}{||\omega||}\sum\limits_{x_i \in M}y_i(\omega^T\textbf x_i+b) ∣∣ω∣∣1xiMyi(ωTxi+b)

    • 公式 8.4 8.4 8.4
      ∂ L i ( ω , b ) ∂ ω = − y i x i ∂ L i ( ω , b ) ∂ b = − y i \frac{\partial L_i(\omega,b)}{\partial \omega} = -y_i\textbf x_i\\\frac{\partial L_i(\omega,b)}{\partial b} = -y_i ωLi(ω,b)=yixibLi(ω,b)=yi

  4. 调整上述步骤中的步长、训练样本分类方式和迭代次数参数,重复实验,观察结果。试推测感知器训练不收敛的可能原因。

四 结构程序设计

读取数据

import pandas as pd

iris = pd.read_csv('iris.csv')

训练模型

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=['sepal length', 'sepal width', 'petal length', 'petal width'])
df['label'] = iris.target

data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:, :-1], data[:, -1]
y = np.array([1 if i == 1 else -1 for i in y])

# 感知机模型
class Model:
    def __init__(self):
        self.w = np.ones(len(data[0]) - 1, dtype=np.float64)
        self.b = 0
        self.rate = 0.1

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

    def fit(self, X_train, y_train):
        fault = False
        while not fault:
            wrong_count = 0
            for d in range(len(X_train)):
                x = X_train[d]
                y = y_train[d]
                if y * self.sign(x, self.w, self.b) <= 0:
                    self.w = self.w + self.rate * np.dot(y, x)
                    self.b = self.b + self.rate * y
                    wrong_count += 1
            if wrong_count == 0:
                fault = True
        return "success"

perceptron = Model()
perceptron.fit(X, y)

x = np.linspace(3, 6, 10)
y = -(perceptron.w[0] * x + perceptron.b) / perceptron.w[1]
plt.plot(x, y)

plt.plot(data[:50, 0], data[:50, 1], 'bo', color="blue", label="0")
plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color="red", label="1")
plt.legend()
plt.show()

五 结果讨论与分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可见感知机在该数据集上有非常好的分类效果。

对于较为简单的数据,不需要使用更加复杂的深度神经网络结构,使用传统的机器学习算法即可。不仅能够同样取得非常好的效果,并且在可解释性和算力要求上有优势。

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值