自用笔记!!!

线性回归模型

线性回归模型定义:
假设给定数据集𝐷=𝒙1,𝑦1,𝒙2,𝑦2,…,𝒙𝑚,𝑦𝑚,𝐷 = 𝒙_1, 𝑦_1 , 𝒙_2, 𝑦_2 , … , 𝒙_𝑚, 𝑦_𝑚 ,D=x1,y1,x2,y2,,xm,ym其中𝒙𝑖=𝑥𝑖1;𝑥𝑖2;…;𝑥𝑖𝑑,𝑦𝑖∈R𝒙_𝑖 = 𝑥_{𝑖1}; 𝑥_{𝑖2}; … ; 𝑥_{𝑖𝑑} , 𝑦_𝑖 ∈ ℝxi=xi1;xi2;;xid,yiR,线性回归就是试图学的一个线性模型尽可能的准确的预测实际输出值。

通俗的讲就是求属性和结果之间的线性关系。线性回归模型的函数表达式可以用下面的式子来表达:
𝑓(𝑥)=𝑤1𝑥1+𝑤2𝑥2+⋯+𝑤𝑛𝑥𝑛+𝑏𝑓(𝑥) = 𝑤_1𝑥_1 + 𝑤_2𝑥_2 + ⋯ + 𝑤_𝑛𝑥_𝑛 + 𝑏f(x)=w1x1+w2x2++wnxn+b
当然也可以用向量的形式来表达:
𝑓𝒙=𝒘T𝒙+𝑏𝑓 𝒙 = 𝒘^T𝒙 + 𝑏fx=wTx+b
从上面的式子来,可以得出线性回归模型就是要求得一组最优的𝑤𝑖和𝑏来确定线性模型,使这个模型无限逼近现有的数据𝑥𝑖𝑥_𝑖xi和结果𝑓(𝑥𝑖)𝑓 (𝑥_𝑖)f(xi) 之间的关系。

误差函数

设定误差函数:
现在用一个公式计算输出和真实值间的误差:loss=(𝑓(𝑥)−𝑦)2=(𝑤𝑥−𝑦)2loss = (𝑓(𝑥) − 𝑦)^2 = (𝑤𝑥 − 𝑦)^2loss=(f(x)y)2=(wxy)2
当然数据是有很多的,要计算所有数据真实值和输出之间的误差和并计算出平均值,这个函数为均方误差函数,也是线性回归模型的损
失函数。
𝐽(𝑥)=12m∑i=1m(𝑓(𝑥𝑖)−𝑦𝑖)2𝐽(𝑥) =\frac{1}{2m} \sum_{i=1}^m(𝑓 (𝑥_𝑖) − 𝑦_𝑖)^ 2J(x)=2m1i=1m(f(xi)yi)2
注:分母那个2是为了与之后求导得出的2消掉。

最小二乘法

在这里插入图片描述
在这里插入图片描述

最小二乘法向量形式及求解

在这里插入图片描述
对其求解的最优解:
𝑓(𝑿)=𝑿𝒘𝑓(𝑿) = 𝑿𝒘f(X)=Xw
很显然𝒙和𝒘都是一个矩阵,利用最小二乘法对这个矩阵求最优的𝒘矩阵参数。
计算的步骤如下所示:
𝐽(𝑤)=12(f(X)−𝑌)2=12(𝑋𝑤−𝑌)2=12(𝑋𝑤−𝑌)⊤(𝑋𝑤−𝑌)=12(𝑤⊤𝑋⊤−𝑌⊤)(𝑋𝑤−𝑌)=12(𝑤⊤𝑋⊤𝑋𝑤−𝑌⊤𝑋𝑤−𝑤⊤𝑋⊤𝑌+𝑌⊤𝑌)𝐽(𝑤) = \frac{1}{2} (f(X) − 𝑌)^2 \\ = \frac{1}{2} (𝑋𝑤 − 𝑌)^2 \\ = \frac{1}{2} (𝑋𝑤 − 𝑌)^⊤(𝑋𝑤 − 𝑌) \\ = \frac{1}{2} (𝑤^⊤𝑋^⊤ − 𝑌^⊤) (𝑋𝑤 − 𝑌) \\ = \frac{1}{2} (𝑤^⊤𝑋^⊤𝑋𝑤 − 𝑌^⊤𝑋𝑤 − 𝑤^⊤𝑋^⊤𝑌 + 𝑌^⊤𝑌)J(w)=21(f(X)Y)2=21(XwY)2=21(XwY)(XwY)=21(wXY)(XwY)=21(wXXwYXwwXY+YY)

在这里插入图片描述
如果矩阵不存在可逆矩阵,该方法就无法实现,所以可以采用梯度下降的方法。

在这里插入图片描述
跟之前学感知机里面的随机梯度下降一样,步伐不能过大。(实质就是不停更新w,随着轮数的增大使其逼近最小值。)
梯度下降法参数更新的计算公式就如下所示:
w=w−a∗∂𝐽(𝑤)∂w w=w-a*\frac{∂𝐽(𝑤)}{∂w}w=wawJ(w)

在这里插入图片描述
实战代码:

#线性回归实战
#定义数据特征
x_data = [1,2,3]##每日学习时间

#定义数据标签
y_data = [2,4,6]##考试得分

#初始化参数w
w = 4

#定义线性回归模型
def forword(x):
    return x * w

#定义损失函数
def cost(xs,ys):
    costvalue=0
    for x,y in zip(xs,ys):
        y_pred = forword(x)
        costvalue += (y_pred - y)**2
    return costvalue / len(xs)

#定义梯度计算公式
def gradient(xs,ys):
    gradientvalue=0
    for x,y in zip(xs,ys):
        gradientvalue += 2* x * (x*w-y) #对w求导
    return gradientvalue / len(xs)

for epoch in range(100):
    #计算误差损失:
    cost_val = cost(x_data,y_data)

    gradient_val = gradient(x_data,y_data)#计算平均梯度
    w =w -0.01 * gradient_val
    print('训练轮次',epoch,"w=",w,"loss",cost_val)

print("100轮训练后w已经训练好了,此时我们用训练好的w进行推理.学习时间为4个小时的时候最终的得分为",forword(4))

实验结果:
在这里插入图片描述

更多推荐