感知机回归

概述

感知机分类一文中提到了感知机模型在分类问题上的应用,如果,我们需要将其使用于回归问题呢,应该怎样处理呢?

其实只要修改算法的最后一步,

sign(x)={+1,x≥0−1,x&lt;0(1.1) sign(x)=\left\{\begin{matrix}+1 &amp;, x\geq 0\\ -1 &amp;, x&lt; 0\end{matrix}\right.\tag{1.1}" role="presentation">sign(x)={+1?1,x≥0,x<0(1.1)sign(x)={+1,x≥0?1,x<0(1.1) sign(x)=\left\{\begin{matrix}+1 &, x\geq 0\\ -1 &, x< 0\end{matrix}\right.\tag{1.1}sign(x)={+1?1?,x≥0,x<0?(1.1)

函数即可。经过sign函数的处理,只可能是两个值,要么1,要么-1,。如果将最后的sign函数改成该函数:

f(x)=x(1.2) f(x)=x\tag{1.2}" role="presentation">f(x)=x(1.2)f(x)=x(1.2) f(x)=x\tag{1.2}f(x)=x(1.2)

那么,最后的输出值就是一个实数而不是1或-1中的一个值了,这样就达到了回归的目的。


损失函数

在实际问题中,损失函数是根据不同的问题进行设计的,因此,单单改变了激活函数还不够,还需要改变损失函数,通常情况下,回归问题使用的损失函数为:

e=12(y−y^)2(2.1) e=\frac{1}{2}(y-\hat{y})^2\tag{2.1}" role="presentation">e=12(y?y?)2(2.1)e=12(y?y^)2(2.1) e=\frac{1}{2}(y-\hat{y})^2\tag{2.1}e=21?(y?y^?)2(2.1)

在公式(2.1)中,y y" role="presentation">yy yy表示训练样本里面的标记,也就是实际值;y^ \hat{y}" role="presentation">y?y^ \hat{y}y^?表示模型计算的出来的预测值。e e" role="presentation">ee ee叫做单个样本的误差。至于为什么前面要乘1/2 1/2" role="presentation">1/21/2 1/21/2,是为了后面计算方便。

根据公式(2.1),在n n" role="presentation">nn nn个样本的数据集中,可以将总误差E E" role="presentation">EE EE记为:

E=12∑i=1n(y(i)−y^(i))2(2.2) \begin{aligned}E&amp;=\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})^2\end{aligned}\tag{2.2}" role="presentation">E=12∑i=1n(y(i)?y?(i))2(2.2)E=12∑i=1n(y(i)?y^(i))2(2.2) \begin{aligned}E&=\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})^2\end{aligned}\tag{2.2}E?=21?i=1∑n?(y(i)?y^?(i))2?(2.2)

在公式(2.2)中,y(i) y^{(i)}" role="presentation">y(i)y(i) y^{(i)}y(i)表示第i i" role="presentation">ii ii个样本的真实值,y^(i) \hat{y}^{(i)}" role="presentation">y?(i)y^(i) \hat{y}^{(i)}y^?(i)表示第i i" role="presentation">ii ii个样本的预测值。且

y^(i)=h(x(i))=wTx(i)(2.3) \begin{aligned}\hat{y}^{(i)}&amp;=h(\mathrm{x}^{(i)})\\&amp;=\mathrm{w}^T\mathrm{x^{(i)}}\end{aligned}\tag{2.3}" role="presentation">y?(i)=h(x(i))=wTx(i)(2.3)y^(i)=h(x(i))=wTx(i)(2.3) \begin{aligned}\hat{y}^{(i)}&=h(\mathrm{x}^{(i)})\\&=\mathrm{w}^T\mathrm{x^{(i)}}\end{aligned}\tag{2.3}y^?(i)?=h(x(i))=wTx(i)?(2.3)

我们的目的,是训练模型:求取到合适的w \mathrm{w}" role="presentation">ww \mathrm{w}w,使(2.2)取得最小值。


求参数的方法

3.1 极大似然估计

该方法之前有提到过,大致思路为让损失函数对参数求导并令其为0,求出参数的值。具体的可以参考线性回归模型 ,但该方法仅适用于激活函数为f(x)=x f(x)=x" role="presentation">f(x)=xf(x)=x f(x)=xf(x)=x的情况。

3.2 梯度下降算法

该方法是计算机通过强大的计算能力,一步步把极值点“试”出来,大致过程如下:

还记的感知机学习的步骤吗?主要是解决两个问题:

  1. 往哪走?
  2. 走多远?

首先随机选择一个点x x" role="presentation">xx xx,在之后的过程中每次修改该点,经过数次迭代之后最终到达函数的最小值点。根据梯度的性质:梯度的反方向是函数值下降最快的方向,每次沿着梯度相反的方向修改x x" role="presentation">xx xx的值,最后是有可能走到极小值附近的。该公式可以表示为:

xnew=xold−η∇f(x)(3.1) \mathrm{x}_{new}=\mathrm{x}_{old}-\eta\nabla{f(x)}\tag{3.1}" role="presentation">xnew=xold?η?f(x)(3.1)xnew=xold?η?f(x)(3.1) \mathrm{x}_{new}=\mathrm{x}_{old}-\eta\nabla{f(x)}\tag{3.1}xnew?=xold??η?f(x)(3.1)

将其应用于我们的目标函数的权值中时,则有

wnew=wold−η∇E(w)(3.2) \begin{aligned}\mathrm{w}_{new}=&amp;\mathrm{w}_{old}-\eta\nabla{E(\mathrm{w})}\\\tag{3.2}\end{aligned}" role="presentation">wnew=wold?η?E(w)(3.2)wnew=wold?η?E(w)(3.2) \begin{aligned}\mathrm{w}_{new}=&\mathrm{w}_{old}-\eta\nabla{E(\mathrm{w})}\\\tag{3.2}\end{aligned}wnew?=?wold??η?E(w)?(3.2)

对∇E(w) \nabla{E(\mathrm{w})}" role="presentation">?E(w)?E(w) \nabla{E(\mathrm{w})}?E(w)则有:

∇E(w)=∂∂wE(w)=∂∂w12∑i=1n(y(i)−y^(i))2=12∂∂w∑i=1n(y(i)2−2y^(i)y(i)+y^(i)2)=12∂∂w∑i=1n(−2y^(i)y(i)+y^(i)2)=12∑i=1n[−2y(i)∂y^(i)∂w+∂y^(i)2∂w]=12∑i=1n[−2y(i)∂wTx(i)∂w+2y^(i)∂wTx(i)∂w]=12∑i=1n[−2y(i)x(i)+2y^(i)x(i)]=−∑i=1n(y(i)−y^(i))x(3.3) \begin{aligned}\nabla{E(\mathrm{w})}&amp;=\frac{\partial}{\partial\mathrm{w}}E(\mathrm{w})\\&amp;=\frac{\partial}{\partial\mathrm{w}}\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})^2\\&amp;=\frac{1}{2}\frac{\partial}{\partial\mathrm{w}}\sum_{i=1}^{n}(y^{(i)2}-2\hat{y}^{(i)}y^{(i)}+\hat{y}^{(i)2})\\&amp;=\frac{1}{2}\frac{\partial}{\partial\mathrm{w}}\sum_{i=1}^{n}(-2\hat{y}^{(i)}y^{(i)}+\hat{y}^{(i)2})\\&amp;=\frac{1}{2}\sum_{i=1}^{n}[-2y^{(i)}\frac{\partial \hat{y}^{(i)}}{\partial\mathrm{w}}+\frac{\partial \hat{y}^{(i)2}}{\partial \mathrm{w}}]\\&amp;=\frac{1}{2}\sum_{i=1}^{n}[-2y^{(i)}\frac{\partial \mathrm{w}^T\mathrm{x^{(i)}}}{\partial\mathrm{w}}+2\hat{y}^{(i)}\frac{\partial \mathrm{w}^T\mathrm{x^{(i)}}}{\partial \mathrm{w}}]\\&amp;=\frac{1}{2}\sum_{i=1}^{n}[-2y^{(i)}\mathrm{x^{(i)}}+2\hat{y}^{(i)}\mathrm{x^{(i)}}]\\&amp;=-\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})\mathrm{x}\tag{3.3}\end{aligned}" role="presentation">?E(w)=??wE(w)=??w12∑i=1n(y(i)?y?(i))2=12??w∑i=1n(y(i)2?2y?(i)y(i)+y?(i)2)=12??w∑i=1n(?2y?(i)y(i)+y?(i)2)=12∑i=1n[?2y(i)?y?(i)?w+?y?(i)2?w]=12∑i=1n[?2y(i)?wTx(i)?w+2y?(i)?wTx(i)?w]=12∑i=1n[?2y(i)x(i)+2y?(i)x(i)]=?∑i=1n(y(i)?y?(i))x(3.3)?E(w)=??wE(w)=??w12∑i=1n(y(i)?y^(i))2=12??w∑i=1n(y(i)2?2y^(i)y(i)+y^(i)2)=12??w∑i=1n(?2y^(i)y(i)+y^(i)2)=12∑i=1n[?2y(i)?y^(i)?w+?y^(i)2?w]=12∑i=1n[?2y(i)?wTx(i)?w+2y^(i)?wTx(i)?w]=12∑i=1n[?2y(i)x(i)+2y^(i)x(i)]=?∑i=1n(y(i)?y^(i))x(3.3) \begin{aligned}\nabla{E(\mathrm{w})}&=\frac{\partial}{\partial\mathrm{w}}E(\mathrm{w})\\&=\frac{\partial}{\partial\mathrm{w}}\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})^2\\&=\frac{1}{2}\frac{\partial}{\partial\mathrm{w}}\sum_{i=1}^{n}(y^{(i)2}-2\hat{y}^{(i)}y^{(i)}+\hat{y}^{(i)2})\\&=\frac{1}{2}\frac{\partial}{\partial\mathrm{w}}\sum_{i=1}^{n}(-2\hat{y}^{(i)}y^{(i)}+\hat{y}^{(i)2})\\&=\frac{1}{2}\sum_{i=1}^{n}[-2y^{(i)}\frac{\partial \hat{y}^{(i)}}{\partial\mathrm{w}}+\frac{\partial \hat{y}^{(i)2}}{\partial \mathrm{w}}]\\&=\frac{1}{2}\sum_{i=1}^{n}[-2y^{(i)}\frac{\partial \mathrm{w}^T\mathrm{x^{(i)}}}{\partial\mathrm{w}}+2\hat{y}^{(i)}\frac{\partial \mathrm{w}^T\mathrm{x^{(i)}}}{\partial \mathrm{w}}]\\&=\frac{1}{2}\sum_{i=1}^{n}[-2y^{(i)}\mathrm{x^{(i)}}+2\hat{y}^{(i)}\mathrm{x^{(i)}}]\\&=-\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})\mathrm{x}\tag{3.3}\end{aligned}?E(w)?=?w??E(w)=?w??21?i=1∑n?(y(i)?y^?(i))2=21??w??i=1∑n?(y(i)2?2y^?(i)y(i)+y^?(i)2)=21??w??i=1∑n?(?2y^?(i)y(i)+y^?(i)2)=21?i=1∑n?[?2y(i)?w?y^?(i)?+?w?y^?(i)2?]=21?i=1∑n?[?2y(i)?w?wTx(i)?+2y^?(i)?w?wTx(i)?]=21?i=1∑n?[?2y(i)x(i)+2y^?(i)x(i)]=?i=1∑n?(y(i)?y^?(i))x?(3.3)

所以,梯度更新公式为:

wnew=wold+η∑i=1n(y(i)−y^(i))x(i)(3.4) \mathrm{w}_{new}=\mathrm{w}_{old}+\eta\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})\mathrm{x}^{(i)}\tag{3.4}" role="presentation">wnew=wold+η∑ni=1(y(i)?y?(i))x(i)(3.4)wnew=wold+η∑i=1n(y(i)?y^(i))x(i)(3.4) \mathrm{w}_{new}=\mathrm{w}_{old}+\eta\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})\mathrm{x}^{(i)}\tag{3.4}wnew?=wold?+ηi=1∑n?(y(i)?y^?(i))x(i)(3.4)

若有M+1个特征,(常数项也包括在内),则w,x \mathrm{w},\mathrm{x}" role="presentation">w,xw,x \mathrm{w},\mathrm{x}w,x是M+1维列向量,所以(3.4)可以写成

[w0w1w2...wm]new=[w0w1w2...wm]old+η∑i=1n(y(i)−y^(i))[1x1(i)x2(i)...xm(i)] \begin{bmatrix}w_0 \\w_1 \\w_2 \\... \\w_m \\\end{bmatrix}_{new}=\begin{bmatrix}w_0 \\w_1 \\w_2 \\... \\w_m \\\end{bmatrix}_{old}+\eta\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})\begin{bmatrix}1 \\x_1^{(i)} \\x_2^{(i)} \\... \\x_m^{(i)} \\\end{bmatrix}" role="presentation">??????w0w1w2...wm??????new=??????w0w1w2...wm??????old+η∑ni=1(y(i)?y?(i))????????1x(i)1x(i)2...x(i)m????????[w0w1w2...wm]new=[w0w1w2...wm]old+η∑i=1n(y(i)?y^(i))[1x1(i)x2(i)...xm(i)] \begin{bmatrix}w_0 \\w_1 \\w_2 \\... \\w_m \\\end{bmatrix}_{new}=\begin{bmatrix}w_0 \\w_1 \\w_2 \\... \\w_m \\\end{bmatrix}_{old}+\eta\sum_{i=1}^{n}(y^{(i)}-\hat{y}^{(i)})\begin{bmatrix}1 \\x_1^{(i)} \\x_2^{(i)} \\... \\x_m^{(i)} \\\end{bmatrix}???????w0?w1?w2?...wm?????????new?=???????w0?w1?w2?...wm?????????old?+ηi=1∑n?(y(i)?y^?(i))????????1x1(i)?x2(i)?...xm(i)??????????

与分类器的比较

算法 分类 回归
模型 sign(x)={+1,x≥0−1,x&lt;0 sign(x)=\left\{\begin{matrix}+1 &amp;, x\geq 0\\ -1 &amp;, x&lt; 0\end{matrix}\right." role="presentation">sign(x)={+1?1,x≥0,x<0sign(x)={+1,x≥0?1,x<0 sign(x)=\left\{\begin{matrix}+1 &, x\geq 0\\ -1 &, x< 0\end{matrix}\right.sign(x)={+1?1?,x≥0,x<0? f(x)=x f(x)=x" role="presentation">f(x)=xf(x)=x f(x)=xf(x)=x
训练规则 w←w+η(y−y^)x \mathrm{w}\gets\mathrm{w}+\eta(y-\hat{y})\mathrm{x}" role="presentation">w←w+η(y?y?)xw←w+η(y?y^)x \mathrm{w}\gets\mathrm{w}+\eta(y-\hat{y})\mathrm{x}w←w+η(y?y^?)x w←w+η(y−y^)x \mathrm{w}\gets\mathrm{w}+\eta(y-\hat{y})\mathrm{x}" role="presentation">w←w+η(y?y?)xw←w+η(y?y^)x \mathrm{w}\gets\mathrm{w}+\eta(y-\hat{y})\mathrm{x}w←w+η(y?y^?)x

5.代码实现

代码在这里, 翻我牌子

制作数据

import numpy as np

from sklearn.model_selection import train_test_split

def load_data(n):
    X = np.arange(0, 10, 0.1)
    y = X + (np.random.rand(len(X)) - 0.5) * n
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    return X_train, X_test, y_train, y_test

def show_data():
    import matplotlib.pyplot as plt
    print(X.shape)
    plt.scatter(X, y)
    plt.plot(X, X)
    plt.show()

主代码

‘‘‘
用感知机实现回归算法
‘‘‘
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

class ProceptronRegression():
def __init__(self, max_itr=100, lr_rate=0.01, eps=0.1):
self.max_itr = max_itr
self.lr_rate = lr_rate
self.eps = eps

def SquareLoss(self, y, y_pred):
return np.sum((y - y_pred)**2) / len(y)**2

def fit(self, X, y):
w = np.random.rand(2) # b, a, 构造y = a*x + b

for itr in range(self.max_itr):
# print(len(X)**2)
temp = 0
for d in range(len(X)):

x_ = np.array([1, X[d]])
y_ = y[d]
temp += (y_ - np.dot(w, x_)) * x_

# print(temp)
w += self.lr_rate * temp
# print(w)
self.w = w
y_pred = self.predict(X)
if self.SquareLoss(y, y_pred)

原文地址:https://www.cnblogs.com/hichens/p/12340797.html

时间: 2024-07-29 15:07:10

感知机回归的相关文章

基于 Keras 用 LSTM 网络做时间序列预测

基于 Keras 用 LSTM 网络做时间序列预测 本文主要参考了 Jason Brownlee 的博文 Time Series Prediction with LSTM Recurrent Neural Networks in Python with Keras 原文使用 python 实现模型,这里是用 R 时间序列预测是一类比较困难的预测问题. 与常见的回归预测模型不同,输入变量之间的"序列依赖性"为时间序列问题增加了复杂度. 一种能够专门用来处理序列依赖性的神经网络被称为 递归

斯坦福CS229机器学习课程笔记三:感知机、Softmax回归

为了给课程的前四讲画上一个句号,这里补充两个前四讲中Andrew大神提到过的模型. The perceptron learning algorithm 感知机 模型:从模型上来看感知机与逻辑回归十分相似,只不过逻辑回归的g函数是逻辑函数(又称sigmoid函数),它是一条从y值0到1的连续曲线.当z→∞,g(z)→1:当z → −∞,g(z)→0.g(z) = 1/(1+e-z)而感知机的g函数是分段函数,只输出0和1.虽然和逻辑回归形式上相近,但是很难为感知机的预测加上概率解释,也很难说感知机

感知机算法(MATLAB)

感知机算法属于比较简单的分类器算法,但是跟逻辑回归和支持向量机一样属于构建分类超平面. 不同的是感知机采用分错的样本与分类超平面的距离作为损失函数,下面的算法基于随机梯度下降法,采用异步方式达到收敛状态 function [w,b]=perceptionLearn(x,y,learningRate,maxEpoch) % Perception Learn Algorithm % x,y 一行为一个样本,y取值{-1,+1} [m,n]=size(x); w=zeros(n,1); b=0; fi

机器学习 —— 基础整理(五):线性回归;二项Logistic回归;Softmax回归;广义线性模型

本文简单整理了以下内容: (一)线性回归 (二)二分类:二项Logistic回归 (三)多分类:Softmax回归 (四)广义线性模型 二项Logistic回归是我去年入门机器学习时学的第一个模型,我觉得这个模型很适合用来入门(但是必须注意这个模型有很多很多很多很多可以展开的地方).比较有意思的是那时候还不会矩阵微积分,推导梯度时还是把矩阵全都展开求的(牛顿法要用的二阶梯度也是)... 下面的文字中,"Logistic回归"都表示用于二分类的二项Logistic回归. 首先约定一下记号

分类和逻辑回归(Classification and logistic regression)

分类问题和线性回归问题问题很像,只是在分类问题中,我们预测的y值包含在一个小的离散数据集里.首先,认识一下二元分类(binary classification),在二元分类中,y的取值只能是0和1.例如,我们要做一个垃圾邮件分类器,则为邮件的特征,而对于y,当它1则为垃圾邮件,取0表示邮件为正常邮件.所以0称之为负类(negative class),1为正类(positive class) 逻辑回归 首先看一个肿瘤是否为恶性肿瘤的分类问题,可能我们一开始想到的是用线性回归的方法来求解,如下图:

逻辑回归算法(MATLAB)

根据李航博士总结的统计学习三要素方法=模型+策略+算法,对应于逻辑回归 模型=基于单极型函数(逻辑函数)的条件概率模型 策略=经验损失对应的训练样本先验概率最大化 算法=随机梯度上升法 逻辑回归MATLAB代码比较简单,如下所示,循环对所有的样本,进行梯度上升算法 <span style="font-size:18px;">function [w]=LogisticRegression(x,y,learningRate,maxEpoch) % Logistic Regres

机器学习实战——Logistic回归

回归概述(个人理解的总结) 回归是数学中的一种模拟离散数据点的数学模型的方法,拟合一个连续的函数从而可以对未知的离散数据点进行分类或预测.这种方法有一个统一的形式,给定n维特征的数据集合,对任意一个数据点Xi={x(1)i,x(2)i,...,x(n)i}的每个维度都有一个回归系数wi与之对应,整个模型就存在一个系数向量w={w1,w2...wn}.如果是系数向量w与特征Xi的线性组合,那么就是一个n空间下的超平面,如果对应分类问题,那么这个超平面就是分类器的决策平面(分类超平面).由于线性组合

DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43221829 本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参考本文第一部分的算法简介. 经详细注释的代码:放在我的gith

机器学习之SVM与逻辑回归的联系和区别

通常说的SVM与逻辑回归的联系一般指的是软间隔的SVM与逻辑回归之间的关系,硬间隔的SVM应该是与感知机模型的区别和联系.而且工程中也不能要求所有的点都正确分类,训练数据中噪声的存在使得完全正确分类很可能造成过拟合. 软间隔SVM与逻辑回归的联系 要说软间隔SVM与联系就要看软间隔SVM的缘由. 软间隔SVM表示样本数据不必要求全部正确分类,允许少量的数据点犯错.于是将硬间隔SVM的优化目标由: 变成硬间隔的优化目标: 在上面的优化目标中加上了惩罚项,C越大惩罚越大允许的错误越小.但是直接使用0