seaboat的专栏——a free boat on the sea.

思想自由,技术自由

机器学习之感知器

感知器

在讲神经网络前先说说感知器,感知器是一种二分类的线性分类模型,输出值取-1或1。感知器是最基础的神经网络,理解好感知器对后面的各种神经网络模型是很有帮助的。如下图,
这里写图片描述

它可以有多个输入(x1,x2,...xn),每个输入对应有一个权重(w1,w2...wn),除此之外还有一个偏置项w0

则输出为

o(x)=1,1,ifi=0nxiwi>0;otherwise;

其中将x0看成是1。而
i=0nxiwi=x0w0+x1w1+...+xnwn

则可以看成是x与w的点积。

感知器的作用

它的输入就是一个线性函数,所以可用于线性分类。同时感知器是单层神经网络,是神经网络的基础。

损失函数

损失函数可以用错误分类的点到超平面的总距离来表示,不直接使用统计错误分类的点总数作为损失函数是因为这样的损失函数不是w的连续可导函数。其中距离可用欧氏距离来表示,可用w的L2范数w来表示,于是根据距离公式有,

1w|wx0+b|

对于错误分类的点有,yi(wxi+b)>0,其中y为1或-1,所以错误分类点到超平面的距离为

1wyi(wx0+b)

得到总距离为
1wxiϵMyi|wx0+b|

忽略范数部分,于是得到损失函数
L(w,b)=xiϵMyi(wx0+b)

所以要做的是最小化损失函数L(w,b),使用梯度下降法,梯度分别由w和b的偏导决定,过程中随机用某个错误分类点来更新w和b,更新公式为w+ηyixib+ηyi

实现代码

import numpy as np

eta = 0.1
ite = 20

def train(x, y):
    w_ = np.zeros(1 + x.shape[1])
    for _ in range(ite):
        for xi, yi in zip(x, y):
            update = eta * (yi - predict(xi, w_))
            w_[1:] += update * xi
            w_[0] += update
    return w_

def predict(x, w):
    return np.where(np.dot(x, w[1:]) + w[0] >= 0, 1, -1)

x_train = np.array([[1, 2], [2, 1], [2, 3], [3, 5], [1, 3], [4, 2], [7, 3], [4, 5], [11, 3], [8, 7]])
y_train = np.array([1, 1, -1, -1, 1, -1, -1, 1, -1, 1])

w = train(x_train, y_train)
print("w = " , w)
x1 = [4, 3]
print(predict(x1, w))

========广告时间========

公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以购买。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================
欢迎关注:

这里写图片描述

阅读更多

扫码向博主提问

去开通我的Chat快问

wangyangzhizhou

博客专家

java深度,架构,AI,中间件,高并发
  • 擅长领域:
  • java
  • 架构
  • 中间件
  • tomcat
  • AI
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/71170343
个人分类: 机器学习
所属专栏: 机器学习&深度学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭