用心创造,手写线性回归算法。

摘要

让我们一起手写回归分析吧!它是最简单的回归算法,通过线性拟合数据点来预测结果。我们使用MSE来衡量误差,并采用最小二乘法进行优化。输入数据为X,输出为Y。让我们开始吧!

正文

手撸深度学习优化算法 – 回归分析

系列产品文章内容文件目录:

  • 感知机
  • 回归分析

假如说感知机是最最最简易的随机森林算法,那麼回归分析便是最最最简易的回归算法,因此 这一篇大家就一起来欢乐的用二种姿态手撸回归分析吧;

优化算法详细介绍

回归分析根据超平面线性拟合数据信息点,工作经验偏差一般应用MSE(均平方米偏差),优化方法为最小二乘法,优化算法以下:

  1. 假定键入数据信息为X,輸出为Y,为了更好地简易考虑,这儿的数据信息点为一维数据信息(更强数据可视化,处理方法没差别);
  2. MSE公式计算为:\(\frac{1}{N}\sum_{i=1}^{N}(w*x_i b-y_i)^2\)
  3. 最小二乘法:最少指的是总体目标是min,二乘指的便是MSE中偏差的二次方,公式计算为:\(min\frac{1}{N}\sum_{i=1}^{N}(w*x_i b-y_i)^2\)
  4. 因为总体目标是搜索线性拟合最好是的超平面,因而仍然界定自变量wb
  5. 针对w和b的求得有二种方法:
    1. 列举降到最低的公式计算,运用提升求得器求得:
      1. 根据已经知道的X、Y,不明的w、b搭建MSE公式计算;
      2. 界定降到最低MSE的目标函数;
      3. 运用求得器立即求得以上涵数获得新的w和b;
    2. 对工作经验误差函数求偏导并令其为0计算出wb的解析解:
      1. 根据降到最低MSE的优化问题能够立即计算出w和b的计算方式;
      2. 根据计算出的计算方式立即测算求得;

运用求得器求得

运用求得器求得能够当作便是个列公式计算的全过程,把已经知道的数据信息X和Y,不明的自变量w和b界定好,搭建出MSE的公式计算,随后丢到求得器立即对w和b求偏导就可以,相对而言编码繁杂,可是全过程更简易,沒有一切数学课计算;

编码完成

复位数据

X = np.array([1.51, 1.64, 1.6, 1.73, 1.82, 1.87])
y = np.array([1.63, 1.7, 1.71, 1.72, 1.76, 1.86])

界定自变量标记

说白了自变量指的便是这些必须求得的一部分,频次便是超平面的w和b;

w,b = symbols('w b',real=True)

界定工作经验误差函数MSE

RDh = 0
for xi,yi in zip(X,y):
    RDh  = (yi - (w*xi b))**2
RDh = RDh / len(X)

界定求得涵数

这里便是对w和b求偏导;

eRDHw = diff(RDh,w)
eRDHb = diff(RDh,b)

求得w和b

ans = solve((eRDHw,eRDHb),(w,b))
w,b = ans[w],ans[b]

运作結果

详细编码

from sympy import symbols, diff, solve
import numpy as np
import matplotlib.pyplot as plt

'''
回归分析线性拟合wx b平行线;

最小二乘法指的是提升求得全过程是根据对工作经验偏差(这里是均平方米偏差)求偏导并令其为0以解的w和b;
'''

# 数据 D X为爸爸个子,Y为儿子身高
X = np.array([1.51, 1.64, 1.6, 1.73, 1.82, 1.87])
y = np.array([1.63, 1.7, 1.71, 1.72, 1.76, 1.86])

# 结构标记
w,b = symbols('w b',real=True)

# 界定工作经验偏差计算方法:(1/N)*sum(yi-(w*xi b))^2)
RDh = 0
for xi,yi in zip(X,y):
    RDh  = (yi - (w*xi b))**2
RDh = RDh / len(X)

# 对w和b求偏导:求偏导的結果是获得2个結果为0的化学方程
eRDHw = diff(RDh,w)
eRDHb = diff(RDh,b)

# 求得判别式组
ans = solve((eRDHw,eRDHb),(w,b))
w,b = ans[w],ans[b]
print('促使工作经验偏差RDh获得极小值的主要参数为:' str(ans))

plt.scatter(X,y)
x_range = [min(X)-0.1,max(X) 0.1]
y_range = [w*x_range[0] b,w*x_range[1] b]
plt.plot(x_range,y_range)

plt.show()

推导公式求得

与运用优化器求得的差别取决于对于\(min\frac{1}{N}\sum_{i=1}^{N}(w*x_i b-y_i)^2\)\(w\)\(b\)求偏导并令其为0,并计算出wb的计算方法是自身计算的,或是由优化器进行的,实际上假如自身计算,那麼最后编码完成上面比较简单(计算全过程不容易发生在编码中);

w和b的求得公式计算计算

最先,大家的提升总体目标为:

\[min \frac{1}{N}\sum_{i=1}^{N}(w*x_i b-y_i)^2
\]

除去公式计算中不相干的变量定义一部分:

\[min \sum_{i=1}^{N}(w*x_i b-y_i)^2
\]

因为一般w是空间向量,而b为标量,因而一般会将w和b组成[w b],x变成[x 1]来统一解决w和b,调节后以下:

\[\sum_{i=1}^{N}(wx_i^T-y_i)^2
\]

上式把平方米拆卸有:

\[\sum_{i=1}^{N}(ww^Tx_ix_i^T-2wx_i^Ty_i y_i^2)
\]

针对w(留意这时w为原w和b的组成)求偏导全过程以下:

\[\begin{equation*}
\begin{split}
\frac{\partial \sum_{i=1}^{N}(ww^Tx_ix_i^T-2wx_i^Ty_i y_i^2)}{\partial w} &= 2w^Tx_ix_i^T-2x_i^Ty_i \\
&= 0 \\
\end{split}
\end{equation*}
\]

上式形变后有:

\[2w^Tx_ix_i^T – 2x_i^Ty_i = 0 \\
w^Tx_ix_i^T = x_i^Ty_i \\
w^T = (x_ix_i^T)^{-1}x_i^Ty_i
\]

因为这里的w实际上是w和b的组成,因而根据这一次计算就获得了w和b2个求得方式 ;

编码完成

结构数据

X = np.array([1.51,1.64,1.6,1.73,1.82,1.87]).reshape(-1,1)
y = np.array([1.63,1.7,1.71,1.72,1.76,1.86])

为X提升原素全为1的一列用以和b的测算

ones = np.ones(X.shape[0]).reshape(-1,1)
X = np.hstack((ones,X))

根据求得公式计算求得w和b

w = np.linalg.inv(self.X.T @ self.X) @ self.X.T @ self.y
w,b = w[1:],w[0]

运作結果

详细编码

详细编码针对求得一部分应用的是伪逆而不是逆,缘故取决于求得公式计算中恰好结构了伪逆,而伪逆适用范围大国求逆,因而应用伪逆替代逆;

import numpy as np
import matplotlib.pyplot as plt

rnd = np.random.RandomState(3)  # 为了更好地演试,选用固定不动的任意

'''
单自变量回归分析最小二乘法的引流矩阵完成:引流矩阵完成的优点取决于numpy自身适用伪逆;

实际上便是针对偏差平均数的引流矩阵方式针对W求导并令其为0,获得w_hat = (X^T*X)^-1*X^T*Y,在其中(X^T*X)^-1*X^T称之为伪逆(pseudo inverse,即涵数pinv)

因而能够省去正中间很多的结构工作经验偏差、解偏导方程等流程;
'''

class LinearRegression(object):
    def __init__(self,X,y):
        ones = np.ones(X.shape[0]).reshape(-1,1) # 1用以测算b
        self.X = np.hstack((ones,X))
        self.y = y

    def train(self):
        # 留意,尽管一般状况下下边二者是等额的的,可是在引流矩阵没法求逆或一些别的状况下时,二者并不相同
        # 相对来说伪逆界定更为广泛,用途更广,因而能够的状况下提议应用伪逆
        # self.w = np.linalg.inv(self.X.T @ self.X) @ self.X.T @ self.y
        self.w = np.linalg.pinv(self.X) @ self.y
        self.w = self.w.reshape(-1)
        self.w,self.b = self.w[1:],self.w[0]
        return self.w,self.b

    def predict(self,x):
        return self.w.dot(x) self.b

    def get(self):
        return self.X,self.y,self.w,self.b

if __name__ == '__main__':
    X0 = np.array([1.51,1.64,1.6,1.73,1.82,1.87]).reshape(-1,1)
    y = np.array([1.63,1.7,1.71,1.72,1.76,1.86])

    model = LinearRegression(X=X0,y=y)
    w,b = model.train()
    print(f'最小二乘法的引流矩阵方法結果为:w={w} b={b}')
    print(model.predict(np.array([X0[0]])))
    plt.scatter(X0,y)
    plt.plot([min(X0),max(X0)],[model.predict(min(X0)),model.predict(max(X0))])
    plt.show()

最终

针对优化算法的学习培训,一定的数学思想方法是必需的,针对公式计算的计算能够使我们针对优化算法內部运作逻辑性有更加深入的掌握;

关注不迷路

扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!

温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
文章版权声明 1、本网站名称:宇凡盒子
2、本站文章未经许可,禁止转载!
3、如果文章内容介绍中无特别注明,本网站压缩包解压需要密码统一是:yufanbox.com
4、本站仅供资源信息交流学习,不保证资源的可用及完整性,不提供安装使用及技术服务。点此了解
5、如果您发现本站分享的资源侵犯了您的权益,请及时通知我们,我们会在接到通知后及时处理!提交入口
0

评论0

请先

站点公告

🚀 【宇凡盒子】全网资源库转储中心

👉 注册即送VIP权限👈

👻 全站资源免费下载✅,欢迎注册!

记得 【收藏】+【关注】 谢谢!~~~

立即注册
没有账号?注册  忘记密码?

社交账号快速登录