吴恩达线性回归模型_作业1

线性回归模型总结

  线性模型就是使用一条曲线模拟样本分布,例如 y = a x + b y=ax+b y=ax+b y = a x 3 + b x 2 + c x + d y=ax^{3}+bx^{2}+cx+d y=ax3+bx2+cx+d 等等,甚至可以使用更高维的模型,但是需要防止过拟合问题。确定好了模型,唯一需要做的事情就是求出参数abcd,即解模型参数。那么如何求出参数呢?

  我们把各种模型分为有监督与无监督模型,有监督模型即要求样本有真实标签,我们需要使用真实标签指导完成求参工作。而无监督模型不要求样本带有真实标签。有监督模型又可以分为分类模型与回归模型,其中分类模型有逻辑回归、决策树等,回归模型有线性回归模型。

  线性回归模型是有监督的回归问题,那么就需要使用真实标签来指导求解参数。就好像大炮弹,首先我们乱射一个角度,然后看一下真实目标与实际打中的目标的差距,然后我们就可以根据这个差距调整大炮的角度。而这个衡量误差的函数就是平方误差代价函数:

J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2} J(θ0,θ1)=2m1i=1m(hθ(x(i))y(i))2
  至此我们只需要调整参数,使得代价函数J最小,从而使用梯度下降法对J函数进行优化,求解一组合适的参数 θ \theta θ。综上这就是线性回归模型,在此感谢吴恩达老师的系列课程!

下面是线性回归模型的例子,实现使用的是非矩阵法,其缺点就是运行慢

import numpy as np
import pandas as pd
import matplotlib as mpl
#线性回归出公式  y=2x+1  
x=[1,2,3,4,5,7,8]
y=[3,5,7,9,11,15,17]
#下列参数分别为:梯度下降的次数、模型参数1、模型参数2、样本个数、学习率
count=1000;w0=0;w1=0;m=len(x);a=0.01

这里定义的线性模型为 y = w 0 ∗ x + w 1 y=w0*x+w1 y=w0x+w1,如下代码所示:

#定义线性模型
def model(x):
    return w0*x+w1
#定义损失函数
def loss(true_y,pre_y):
    return (true_y-pre_y)**2

下面使用 θ 0 \theta_{0} θ0, θ 1 \theta_{1} θ1替代代码中的w1,w0,代价函数为: J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2} J(θ0,θ1)=2m1i=1m(hθ(x(i))y(i))2

对w1求偏导后得到:
∂ ∂ θ 0 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \frac{\partial}{\partial \theta_{0}} J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) θ0J(θ0,θ1)=m1i=1m(hθ(x(i))y(i))

对w0求偏导后得到:
∂ ∂ θ 1 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x ( i ) \frac{{\partial}}{\partial \theta_{1}} J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) \cdot x^{(i)} θ1J(θ0,θ1)=m1i=1m(hθ(x(i))y(i))x(i)
对于上面的系列公式要解释的是,对于代价函数中的 ( h θ ( x ( i ) ) − y ( i ) ) 2 \left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2} (hθ(x(i))y(i))2h(x)与y是可以换位置的,那可能有人会问那么求偏导岂不是要加一个负号了。答案是:保持原来的偏导不变,因为调换了h与y求偏导时就变成了(y-h)了,但是有一点别忘记还要对h对w1求偏导,这样就又提出了一个负号,负负得正,所以还是原来的那个式子。这也就从侧面解释了代价函数中真实值减预测值可以、预测值减真实值也行!这是我刚学习这里时让我疑惑的地方。

#代价函数对w1求偏导
def partial_w1(true_y,xi):
    return (1/m)*(model(xi)-true_y)
#对代价函数w0求偏导
def partial_w0(true_y,xi):
    return (1/m)*(model(xi)-true_y)*xi
cost = []
for i in range(count):
    # 梯度下降count次
    #     print(str(w0)+" "+str(w1))
    temp=0
    part0 = 0
    part1 = 0
    for j in range(m):
        # 求解代价函数值
        temp += (1 / (2 * m)) * loss(y[j], model(j))
        part0 += partial_w0(y[j], x[j])
        part1 += partial_w1(y[j], x[j])
    if(count%10==0):
        cost.append(temp)
    # 更新参数w0与w1
    w0 -= a * part0
    w1 -= a * part1
print(len(cost))
print(str(w0)+" "+str(w1))
1000
2.0114619613824907 0.9364211186107142
import matplotlib.pyplot as plt
# 这两行代码使得 pyplot 画出的图形中可以显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 设置Y轴的刻度范围
# plt.ylim([0,100])
plt.plot(range(60), cost[0:60], '-', label='代价值')
# plt.xticks(range(count))  # 设置横坐标刻度
plt.xlabel('梯度下降次数') # 设置横坐标轴标题
plt.legend() # 显示图例,即每条线对应 label 中的内容
plt.show() # 显示图形

在这里插入图片描述

以下是向量矩阵实现,运算速度是非矢量方法的300倍左右

x=np.array(x)
y=np.array(y)
cost=np.zeros(count)
for i in range(count):
    pre_y=w0*x+w1
    cost[i]=np.sum((pre_y-y)**2)/(2*m)
    part0=np.sum(x.T*(pre_y-y))/m
    part1=np.sum(pre_y-y)/m
    w0-=a*part0
    w1-=a*part1
print(str(w0)+"    "+str(w1))
# print(cost)
2.000000130698869    0.9999992750204254
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

矩阵科学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值