机器学习 01:感知机

感知机 (perceptron) 是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别。
感知机的取值范围为 1 和 -1 二值。
感知机对应于输入空间中将实例划分为正负两类的分离超平面,属于判别模型。

一、主要思想:

w ⃗ \vec w w 为权重项, b b b 为偏置项, x ⃗ \vec x x 为特征值, y y y 为标签

线性可分的情况下,拟合线性函数 w ⃗ ⋅ x ⃗ + b \vec w\cdot\vec x+b w x +b,使得:
s i g n ( w ⃗ ⋅ x ⃗ + b ) = { 1 ≥ 0 − 1 < 0 \mathrm{sign}(\vec w\cdot\vec x+b)=\begin{cases}1&\ge0\\-1&<0\end{cases} sign(w x +b)={110<0

也就是: s i g n ( w ⃗ ⋅ x ⃗ + b ) y ≥ 0 \mathrm{sign}(\vec w\cdot\vec x+b)y\ge0 sign(w x +b)y0



二、误分类点:

根据上文,很容易知道对于一个特征向量 x ⃗ \vec x x 如果误分类了,则会有:
s i g n ( w ⃗ ⋅ x ⃗ + b ) y < 0 \mathrm{sign}(\vec w\cdot\vec x+b)y<0 sign(w x +b)y<0

借此可以很方便的找出误分类点。



三、损失函数:

把误分类点到线性函数的距离作为误差,组成损失函数:
l o s s F u n c = − ( w ⃗ ⋅ x ⃗ + b ) y ∥ w ∥ 2 lossFunc=-\frac{(\vec w\cdot\vec x+b)y}{\parallel w\parallel_2} lossFunc=w2(w x +b)y



四、更新权重项与偏置项:

采用梯度下降的方法进行更新。设 L ( w ⃗ , b ) = l o s s F u n c L(\vec w,b) = lossFunc L(w ,b)=lossFunc 我们要使 L ( w ⃗ , b ) L(\vec w,b) L(w ,b) 的值尽量小,则可以求其梯度的负数 − ∇ L -\nabla L L 即为该函数下降最快的方向,但是注意,通过这个方法可能无法到达全局最优点,可能会到达局部最优点或鞍点。不过这无所谓,对于感知机来说这就足够了。
− ∇ L = < x ⃗ y , y > w ⃗ = w ⃗ + α x ⃗ y b = b + α y \begin{aligned}-\nabla L&=<\vec xy,y>\\\vec w&=\vec w+\alpha\vec xy\\b&=b+\alpha y\end{aligned} Lw b=<x y,y>=w +αx y=b+αy
其中 α \alpha α 是学习率,要注意 x ⃗ y \vec xy x y 是一个向量。


模板:

import numpy as np

X_train = np.array([[1, 1], [1, 0], [0, 1], [0, 0]])
Y_train = np.array([1, 1, 1, -1])

class perceptron:
    def __init__(self, X, Y, Alpha = 0.01): # X, Y can be list or numpy.ndarray
        self.alpha = Alpha
        self.X_trn = np.array(X)
        self.Y_trn = np.array(Y)
        self.B = np.random.rand()
        self.W = np.random.rand(len(X[0]))

    def check(self, i):
        Sum = np.dot(self.W, self.X_trn[i]) + self.B
        if (Sum * self.Y_trn[i] >= 0):
            return True
        else:
            return False

    def Loss_func(self, i):
        self.W += self.alpha * self.X_trn[i] * self.Y_trn[i]
        self.B += self.alpha * self.Y_trn[i]

    def train(self):
        Error = True
        while (Error):
            Error = False
            for i in range(len(self.X_trn)):
                if (self.check(i) == False):
                    self.Loss_func(i)
                    Error = True
        print("W: ", self.W, "\tB: ", self.B)

per = perceptron(X_train, Y_train, 0.01)
per.train()

以及调库实现:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Perceptron

My_Data = datasets.load_iris()
clf = Perceptron()
x = My_Data['data']
y = My_Data['target']
train_x, test_x, train_y, test_y = train_test_split(x, y, test_size = 0.3)

clf.fit(train_x, train_y)
clf.predict(test_x)
print(clf.score(test_x, test_y))




同步更新于:SP-FA 的博客


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SP FA

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

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

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

打赏作者

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

抵扣说明:

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

余额充值