一元线性回归与代价函数(损失函数)

本文深入解析了一元线性回归的概念及其在机器学习中的应用,详细介绍了如何通过梯度下降法求解最优参数,实现预测模型的构建。文章涵盖了回归分析的基本原理,包括代价函数、相关系数、决定系数等关键概念,以及如何利用Python进行实战操作。

转载自:线性回归与非线性回归:1.0一元线性回归与代价函数(损失函数)

  • 回归分析:用来建立方程模拟两个或者多个变量之间如何关联
  • 因变量:被预测的变量(结果/标签),输出
  • 自变量:被用来进行预测的变量(特征),输入
  • 一元线性回归:包含一个自变量与一个因变量,并且变量的关系用一条直线来模拟

一元线性回归

公式:\(h_\theta = \theta_0+\theta_1x\)
方程对应的图像是一条直线,称作回归线。其中\(\theta_1\)为回归线的斜率\(\theta_0\)为回归的截距
相关性:\[ \begin{cases} 正相关:\theta_1>0 \\ 不相关:\theta_1 = 0 \\ 负相关:\theta_1<0 \end{cases}\]

代价函数

一般使用最小二乘法,真实值\(y\),预测值\(h_\theta(x)\),则误差平方为\((y-h_\theta(x))^2\),找到合适的参数,使得误差平方平方和最小\[J(\theta_0 , \theta_1) = \frac{1}{2m}\sum_{i=1}^m(y-h_\theta(x))^2\]
其中共有m个样本点,乘以1/2是为了方便计算,如求导。

相关系数

定义:相关关系是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。

线性相关:在向量空间V的一组向量:\(A:\alpha_1,\alpha_2,\ldots\alpha_m\),如果存在不全为零的数\(k_1,k_2,\ldots k_m\),使\[k_1\alpha_1+k_2\alpha_2+\cdots k_m\alpha_m = O\]则称向量组A是线性相关的,否则\(k_1,k_2,\ldots k_m\)全为0,称其为线性无关的。

公式:\[r_{xy} = \frac{\sum (x_i - \overline x)(y_i - \overline y)}{\sqrt{\sum (x_i - \overline x)^2\sum(y_i - \overline y)^2}} = \frac{cov(x,y)}{\sqrt{var[x]var[y]}}\]

决定系数

定义:相关系数\(R^2\)是用来描述两个变量之间的线性关系的,但决定系数的适用范围更广,可以用于描述非线性或者有两个及两个以上自变量的相关关系。它可以用来评估模型的效果。
总平方和(SST):\(\sum_{i=1}^{n}(y_i - \overline y)^2\)
回归平方和(SSR):\(\sum_{i=1}^{n}(\hat y-\overline y)^2\)
残差平方和(SSE):\(\sum_{i=1}^{n}(y_i-\hat y)^2\)
\(y_i\)真实值\(\overline y\)真实值的平均值\(\hat y\)预测值
它们三者的关系是:\(SST=SSR+SSE\)
决定系数:\(R^2 = \frac{SSR}{SST} = 1-\frac{SSE}{SST}\)

用梯度下降法求解线性回归

一元线性回归方程:\(h_\theta = \theta_0+\theta_1x\)
参数:\(\theta_0\),\(\theta_1\)
代价函数:\(J(\theta_0 , \theta_1) = \frac{1}{2m}\sum_{i=1}^m(y-h_\theta(x))^2\)
目标:\(min J(\theta_0 , \theta_1)\)
梯度下降法:不断改变\(\theta_0\),\(\theta_1\),直到\(J(\theta_0 , \theta_1)\)达到一个全局最小或者局部最小\[repeat \ until \ convergence\{ \\ \theta_j:=\theta_j - \alpha\frac{\partial}{\partial \theta_j}J(\theta_0,\theta_1) \\ \} \ (for \ j=0 \ and \ j=1)\] \(\alpha\)为学习率,当学习率过大会造成不收敛也就是找不到一个全局最小值或者局部最小值,学习率过小会浪费大量的时间进行计算。
正确的做法:同步更新\[tempt0:=\theta_0 - \alpha\frac{\partial}{\partial \theta_0}J(\theta_0,\theta_1)\]\[tempt1:=\theta_1 - \alpha\frac{\partial}{\partial \theta_1}J(\theta_0,\theta_1)\]\[\theta_0:=tempt0\]\[\theta_1:=tempt1\]
使用梯度下降:\[repeat \ until \ convergence\{ \theta_0:=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i) \\ \theta_1:=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)*x_i\\ \}\]

实战

import numpy as np
import matplotlib.pyplot as plt
 
#载入数据
data = np.genfromtxt("data.csv",delimiter=",")#加载文件,分隔符为逗号
x_data = data[:,0]#存储第0列的所有数据
y_data = data[:,1]#存储第1列的所有数据
 
#学习率
lr = 0.0001
#截距
b = 0.0
#斜率
k = 0.0
#最大迭代次数
epochs = 50
 
#最小二乘法
def compute_error(b, k, x_data, y_data):
    totalError = 0
    for i in range(0,len(x_data)):
        totalError += (y_data[i] - (k * x_data[i] + b)) ** 2
    return totalError / float(len(x_data)) / 2.0
 
 
#梯度下降法求最小值
def gradient_descent_runner(x_data, y_data, b, k, lr, epochs):
    #计算总数据量
    m = len(x_data)
    #循环epochs次
    for i in range(epochs):
        b_grade = 0
        k_grade = 0
        #计算梯度总和在求平均
        for j in range(0, len(x_data)):
            b_grade += -(1/m) * (y_data[j] - (k * x_data[j] + b))
            k_grade += -(1/m) * (y_data[j] - (k * x_data[j] + b)) * x_data[j]
        #更新学习率
        b = b - (lr * b_grade)
        k = k - (lr * k_grade)
 
    return b,k 
 
 
print("Starting b = {0}, k = {1}, error = {2}".format(b, k, compute_error(b, k, x_data, y_data)))
print("Running...")
b,k = gradient_descent_runner(x_data, y_data, b, k, lr, epochs)
print("After {0} iterations b = {1}, k = {2}, error = {3}".format(epochs, b, k, compute_error(b, k, x_data, y_data)))
 
#画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, k*x_data+b, 'r')
plt.show()

转载于:https://www.cnblogs.com/xym4869/p/11309134.html

一元线性回归是一种基础的统计学方法,用于预测一个因变量(输出)一个自变量(输入)之间的线性关系。在构建一元线性回归模型时,损失函数(也称为代价函数)起到了至关重要的作用,它衡量了模型预测值实际值之间的差异程度。 ### 损失函数的构建原理 在一元线性回归中,我们通常使用**均方误差**(Mean Squared Error, MSE)作为损失函数。其数学表达式如下: $$ J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 $$ 其中: - $ J $ 是损失函数。 - $ \theta_0 $ 和 $ \theta_1 $ 是模型参数,分别代表截距和斜率。 - $ h_\theta(x^{(i)}) $ 是模型对第 $ i $ 个样本的预测值,定义为 $ h_\theta(x) = \theta_0 + \theta_1 x $。 - $ y^{(i)} $ 是第 $ i $ 个样本的真实值。 - $ m $ 是训练样本的数量。 损失函数的目标是最小化这个均方误差,即找到一组最优的参数 $ \theta_0 $ 和 $ \theta_1 $,使得模型的预测值尽可能接近真实值。这里的 $ \frac{1}{2} $ 是为了方便后续的数学运算(特别是在求导时简化系数),并不影响最终的结果。 ### 损失函数的优化 为了找到使损失函数最小的参数 $ \theta_0 $ 和 $ \theta_1 $,可以采用以下两种常见方法: #### 1. 解析解法(最小二乘法) 解析解法是通过数学推导直接求解出最优的参数值。对于一元线性回归,可以通过对损失函数分别对 $ \theta_0 $ 和 $ \theta_1 $ 求偏导数,并令偏导数等于零来求解最优解。具体步骤如下: 1. 对 $ \theta_0 $ 求偏导: $$ \frac{\partial J}{\partial \theta_0} = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) $$ 2. 对 $ \theta_1 $ 求偏导: $$ \frac{\partial J}{\partial \theta_1} = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x^{(i)} $$ 3. 令两个偏导数等于零,解出 $ \theta_0 $ 和 $ \theta_1 $ 的解析解。 这种方法适用于小规模数据集,因为它的时间复杂度较高,尤其是在数据量较大时不太适用。 #### 2. 梯度下降法 梯度下降法是一种迭代优化算法,通过逐步调整参数 $ \theta_0 $ 和 $ \theta_1 $ 来逐步减小损失函数的值。梯度下降的核心思想是沿着损失函数的负梯度方向更新参数,直到收敛到最小值点。 梯度下降的更新规则如下: $$ \theta_j := \theta_j - \alpha \cdot \frac{\partial J}{\partial \theta_j}, \quad j = 0, 1 $$ 其中: - $ \alpha $ 是学习率,控制每次更新的步长。 - $ \frac{\partial J}{\partial \theta_j} $ 是损失函数对参数 $ \theta_j $ 的偏导数。 具体到一元线性回归,梯度下降的更新公式为: $$ \theta_0 := \theta_0 - \alpha \cdot \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) $$ $$ \theta_1 := \theta_1 - \alpha \cdot \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x^{(i)} $$ 梯度下降法的优点是可以处理大规模数据集,且适用于更复杂的模型。 ### 代码示例 以下是一个使用 Python 实现一元线性回归的简单示例,展示了如何使用 `scipy.optimize.leastsq` 和 `sklearn.linear_model.LinearRegression` 来求解模型参数。 ```python import numpy as np from scipy.optimize import leastsq from sklearn.linear_model import LinearRegression # 生成一些模拟数据 np.random.seed(0) x = np.random.rand(100) * 10 y = 2 * x + 5 + np.random.randn(100) * 2 # 使用 scipy.optimize.leastsq 求解 def loss_func(w, x, y): w0, w1 = w y_hat = w0 + w1 * x loss = y_hat - y return loss w_init = np.random.randn(2) w_scipy = leastsq(loss_func, w_init, args=(x, y))[0] print("Scipy leastsq: intercept =", w_scipy[0], "slope =", w_scipy[1]) # 使用 sklearn.linear_model.LinearRegression 求解 model = LinearRegression() model.fit(x.reshape(-1, 1), y) print("Sklearn LinearRegression: intercept =", model.intercept_, "slope =", model.coef_[0]) ``` ### 总结 一元线性回归损失函数构建基于均方误差的原则,旨在最小化模型预测值真实值之间的差异。通过解析解法或梯度下降法,可以找到最优的模型参数,从而建立一个能够有效预测的线性模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值