感知机模型
按照统计学三要素来写的话:
模型:符号函数
策略:损失函数;误点到超平面的距离之和
算法:利用梯度下降算法进行求解
感知机原理:
感知机模型用来线性判别数据集,什么意思呢就是用一超平面来隔断两个不同的类别,超平面在二维的数据集中就是一条直线,在三维的数据集中就是一个平面,假设有n维的数据,那么划分的超平面为(n-1)维度。如下图二维和三维的情况,蓝色部分为超平面:
如何来找这个超平面可以使得分类呢,这里采用计算点到超平面的距离之和作为损失函数。
点到这个超平面的距离公式推导为:
有了这个后我们就可以来写感知机模型了。原谅我偷懒了,这里就把图片弄过来吧,图片来源(统计学习方法)
# coding:utf-8
"""
@author:Darren
@file:perceptron.py
@time:2020/1/14
"""
import numpy as np
class Perceptron:
def __init__(self, x, y, n, eta):
self.x = x # 实例点
self.y = y # 实例点的分类
self.n = n # 实例点个数
self.eta = eta # 学习率
# 随机梯度下降法
def SGD(self):
# 对w,b取初值
w = np.array([0, 0])
b = 0
# 记录一次迭代是否有误分类点
flag = 1
while flag == 1:
flag = 0
for i in range(n):
# 如果有误分类点
if self.y[i] * (w.dot(self.x[i]) + b) <= 0:
# 更新w,b,设置flag为1
w = w + self.eta * self.y[i] * self.x[i]
b = b + self.eta * self.y[i]
flag = 1
return w, b
if __name__ == "__main__":
x = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])
n = 3
eta = 1
perceptron = Perceptron(x, y, n, eta)
w, b = perceptron.SGD()
print("w is",w)
print("b is",b)
结果
w is [1 1]
b is -3