机器学习之线性回归原理详解、公式推导(手推)、简单实例

article/2025/8/24 19:45:50

目录

  • 1. 原理详解
    • 1.1. 线性回归
    • 1.2. 回归系数
  • 2. 公式推导
    • 2.1. 单元线性回归
    • 2.2. 多元线性回归
  • 3. 简单实例
    • 3.1. 实例1:一元线性回归
    • 实例2: 多元线性回归
    • 3.3. 实例3:房价预测

1. 原理详解

1.1. 线性回归

  假设一个空间中有一堆散点,线性回归的目的就是希望用一条直线,最大程度地“概括”这些散点。它不要求经过每一个散点,但是希望能考虑到每个散点的特点。按照西瓜书的例子就是,好瓜的评判标准y可以由 x i x_i xi表示,也就是说, f g o o d ( x ) = w 1 x 色泽 + w 1 x 根蒂 + w 1 x 敲声 + b f_{good}(x)=w_1x_{色泽}+w_1x_{根蒂}+w_1x_{敲声}+b fgood(x)=w1x色泽+w1x根蒂+w1x敲声+b
  那么我们不难发现,线性回归需要考虑的几个问题:

  • 确定系数 w i w_i wi以及偏置 b b b
  • 如何确定 f g o o d ( x ) f_{good}(x) fgood(x)能很好地概括瓜的特点

1.2. 回归系数

  关于这点,我们需要确定,我们算出来的回归系数一定是当前最优的结果,怎么确定呢?

  • 均方误差(西瓜书)
  • R^2(用于模型评估)

均方误差(MSE)

  这个其实就是残差平方和的平均值。
M S E = ∑ i = 0 n y i − f ( x i ) n MSE=\frac{\sum_{i=0}^ny_i-f(x_i)}{n} MSE=ni=0nyif(xi)

R^2

R 2 = S S R S S T = S S T − S S E S S T = 1 − S S E S S T R^2=\frac{SSR}{SST}=\frac{SST-SSE}{SST}=1-\frac{SSE}{SST} R2=SSTSSR=SSTSSTSSE=1SSTSSE

  其中,SST是总偏差平方和
S S T = ∑ i = 0 n ( y i − y ˉ ) 2 SST=\sum_{i=0}^n(y_i-\bar y)^2 SST=i=0n(yiyˉ)2
  SSR是回归平方和
S S R = ∑ i = 0 n ( f ( x i ) − y ˉ ) 2 SSR=\sum_{i=0}^n(f(x_i)-\bar y)^2 SSR=i=0n(f(xi)yˉ)2
  SSE是残差平方和
S S E = ∑ i = 0 n ( y i − f ( x i ) ) 2 SSE=\sum_{i=0}^n(y_i-f(x_i))^2 SSE=i=0n(yif(xi))2

2. 公式推导

2.1. 单元线性回归

这里我们跟西瓜书一样采取均方误差。

在这里插入图片描述

计算得w与b。

2.2. 多元线性回归

多元线性回归涉及到矩阵运算。

在这里插入图片描述

若X为m * n的矩阵,则 X T X X^TX XTX为n * n的方阵。 X T X X^TX XTX的意义在于保持其为可逆矩阵,因为若它不可逆,则导致其行列式为0,就会导致w趋向无穷。

3. 简单实例

3.1. 实例1:一元线性回归

计算这个二元线性回归

indexxy
162
281
3100
4142
5180

我们这里采用几种解法

  1. 西瓜书内的公式
  2. 最小二乘估计w, b
  3. linalg直接解
# -*- coding:utf-8 -*-
# 2022.09.05
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3Ddef task1_vis(x, y, w, b):fig = plt.figure()ax = fig.add_subplot(1, 1, 1)ax.scatter(x, y)x = np.linspace(0, 20, 100)y = w * x + bax.plot(x, y)# plt.title('Pizza price plotted against diameter')ax.set_xlabel('x', fontdict={'size': 10, 'color': 'black'})ax.set_ylabel('y', fontdict={'size': 10, 'color': 'black'})plt.show()def task1_way1(x, y):w = np.dot(y, (x - x.mean())).sum() / (sum(np.square(x)) - np.square(sum(x)) / x.shape[0])b = sum(y - np.multiply(w, x)) / x.shape[0]print("方法一:\t\tw:{}\tb:{}".format(w, b))def task1_way2(x, y):x_bar = x.mean()y_bar = y.mean()# 计算协方差cov = np.multiply((x - x_bar).transpose(), (y - y_bar)).sum() / (x.shape[0] - 1)var = np.var(x, ddof=1)w = cov / var# w = (y_bar - w * x_bar) / (x.shape[0])b = y_bar - w * x_barprint("方法二:\t\tw:{}\tb:{}".format(w, b))def task1_way3(x, y):from numpy.linalg import lstsqx = np.vstack([x, [1 for i in range(x.shape[0])]])w = lstsq(x.T, y.reshape(-1, 1))[0][0][0]b = lstsq(x.T, y.reshape(-1, 1))[0][1][0]print("方法三:\t\tw:{}\tb:{}".format(w, b))return w, bdef task1():x = np.array([6, 8, 10, 14, 18])y = np.array([7, 9, 13, 17.5, 18])task1_way1(x, y)task1_way2(x, y)w, b = task1_way3(x, y)task1_vis(x, y, w, b)if __name__ == '__main__':task1()

运行结果如下
在这里插入图片描述
在这里插入图片描述

实例2: 多元线性回归

# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3Ddef task2():from numpy.linalg import invX = np.array([[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0]])X[:, 2] = X[:, 1] * X[:, 1]Y = np.array([[7], [9], [13], [17.5], [18]])beita = np.dot(inv(np.dot(np.transpose(X), X)), np.dot(np.transpose(X), Y))print(beita)from numpy.linalg import lstsqprint(lstsq(X, Y)[0])if __name__ == '__main__':# task1()task2()

3.3. 实例3:房价预测

在这里插入图片描述

# -*- coding:utf-8 -*-
# 2022.09.05
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3Ddef task1_vis(x, y, w, b):fig = plt.figure()ax = fig.add_subplot(1, 1, 1)ax.scatter(x, y)y = w * x + bax.plot(x, y, 'r')# plt.title('Pizza price plotted against diameter')ax.set_xlabel('x', fontdict={'size': 10, 'color': 'black'})ax.set_ylabel('y', fontdict={'size': 10, 'color': 'black'})plt.show()def task1_way1(x, y):w = np.dot(y, (x - x.mean())).sum() / (sum(np.square(x)) - np.square(sum(x)) / x.shape[0])b = sum(y - np.multiply(w, x)) / x.shape[0]print("方法一:\t\tw:{}\tb:{}".format(w, b))return w, bdef task1_way2(x, y):x_bar = x.mean()y_bar = y.mean()# 计算协方差cov = np.multiply((x - x_bar).transpose(), (y - y_bar)).sum() / (x.shape[0] - 1)var = np.var(x, ddof=1)w = cov / var# w = (y_bar - w * x_bar) / (x.shape[0])b = y_bar - w * x_barprint("方法二:\t\tw:{}\tb:{}".format(w, b))def task1_way3(x, y):from numpy.linalg import lstsqx = np.vstack([x, [1 for i in range(x.shape[0])]])w = lstsq(x.T, y.reshape(-1, 1))[0][0][0]b = lstsq(x.T, y.reshape(-1, 1))[0][1][0]print("方法三:\t\tw:{}\tb:{}".format(w, b))return w, bdef task1():x = np.array([6, 8, 10, 14, 18])y = np.array([7, 9, 13, 17.5, 18])task1_way1(x, y)task1_way2(x, y)w, b = task1_way3(x, y)task1_vis(x, y, w, b)def task2():from numpy.linalg import invX = np.array([[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0]])X[:, 2] = X[:, 1] * X[:, 1]Y = np.array([[7], [9], [13], [17.5], [18]])beita = np.dot(inv(np.dot(np.transpose(X), X)), np.dot(np.transpose(X), Y))print(beita)from numpy.linalg import lstsqprint(lstsq(X, Y)[0])def task3():x_train = np.array([77.36, 116.74, 116.7, 100.68, 116.1, 115.81, 104.24, 106.73, 115.86])y_train = np.array([470, 730, 760, 680, 700, 720, 700, 690, 730])x_test = np.array([56.6, 78.4, 58, 123.5, 56.8, 77, 150.6])w, b = task1_way1(x_train, y_train)y_pre = x_test * w + bprint(y_pre)task1_vis(x_train, y_train, w, b)if __name__ == '__main__':# task1()# task2()task3()

http://chatgpt.dhexx.cn/article/ypf3NH5y.shtml

相关文章

统计学——线性回归公式推导

假设我们有n个点,(x1,y1), (x2,y2), ... ,(xn,yn),如下图所示: 我们要求这几个点的线性回归方程,假设方程为ymxb,如下图所示: 我们的目的是使误差的平方和最小 即求: 的最小值。

计算线性回归、指数回归公式

最近要计算线性回归、指数回归的公式。就整理下吧,以便帮助他人,少走弯路。 发现网上线性回归的资料还算详细,但是指数回归资料很少,还会误导人。 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互…

Python实现线性回归(公式推导+源代码)

写这篇文章之前,首先要对自己做一个小小的反思,很多时候在学习新技术的时候,看到出了什么什么框架,在这个框架上什么什么方法可以直接拿过来用,这样的好处就是我们可以减少写代码量,几个函数就可以帮我们解…

线性回归方程推导

理论推导 机器学习所针对的问题有两种:一种是回归,一种是分类。回归是解决连续数据的预测问题,而分类是解决离散数据的预测问题。线性回归是一个典型的回归问题。其实我们在中学时期就接触过,叫最小二乘法。 线性回归试图学得一个…

线性回归相关知识及公式推导

转自https://www.cnblogs.com/GuoJiaSheng/p/3928160.html 在现实生活中普遍存在着变量之间的关系,有确定的和非确定的。确定关系指的是变量之间可以使用函数关系式表示,还有一种是属于非确定的(相关),比如人的身高和…

线性模型(二)-- 线性回归公式推导

我们在初中学习线性方程的时候就已经接触过回归的相关概念,在这里简单介绍一下机器学习中的“回归”,机器学习的目的有两个:回归和分类,回归是解决连续数据的预测问题,而分类是为了解决离散数据的预测问题。线性回归是…

一元线性回归公式推导

一元线性回归公式推导 平均损失函数: 对w,b求偏导: 可求解(先求b,再求w): 或: 这两个式子中的w是等价de,可由第一个w分子分母同除n,再由下式得到第二个w: 参考文献: https://zhidao.baidu.com/q…

线性回归模型公式推导

线性回归公式推导 线性模型一、线性回归(一)一元线性回归1. 由最小二乘法得出损失函数2. 证明损失函数 E ( w , b ) E(w,b) E(w,b)是关于 w w w和 b b b的凸函数3. 对损失函数求关于b和w的一阶偏导数4. 令一阶偏导数为0解出 w w w和 b b b (二…

线性回归--公式推导

线性回归 -- LIner regression 线性回归&#xff08;Linear regression&#xff09;是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析 —维基百科 线性回归--理论推导 <1> 数据: 本次推导使用的数据为--银行贷款数据。 &…

线性回归原理及算法

今天给大家的介绍一下线性模型&#xff0c;线性回归模型虽说模型简单&#xff0c;但距今为止依旧在机器学习算法中占据一定的地位&#xff0c;不仅如此&#xff0c;而且在实际的业务应用中也是屡试不爽的机器学习算法。 线性回归模型公式&#xff1a;YXwb &#xff08;一个X变量…

机器学习之线性回归

线性回归是最简单的一个函数拟合过程&#xff0c;一元线性回归公式为yaxb。 我们做拟合&#xff0c;首先需要定义一个损失函数。一般常用的损失函数有&#xff1a;0-1损失函数和绝对值损失函数 0-1损失是指&#xff0c;预测值和目标值不相等为1&#xff0c;否则为0&#xff1a;…

在线Cron表达式生成器,定时任务表达式生成器

近期项目需要在后台管理系统的页面上生成定时任务表达式存入定时任务系统的数据库中&#xff0c;就是那种根据后台管理员指定的时分秒年月日生成一个定时任务表达式。 一时间有点不好下手。我可以根据后台管理员指定的时分秒年月日手动写一个定时任务表达式&#xff0c;也可以…

在线QuartzCron定时任务表达式在线生成

在线QuartzCron定时任务表达式在线生成 在线QuartzCron定时任务表达式在线生成 Quartz是一个完全由java编写的开源作业调度框架,Quartz最主要的功能就是调度器(完成定时任务)。本工具可以在线生成QuartzCron表达式 Quartz是一个完全由java编写的开源作业调度框架,Quartz最主要…

Android Studio修改应用名称及应用图标

一、修改应用名称 找到src/main/AndroidManifest.xml文件&#xff1a; android:label后面配置的就是应用名称配置路径或应用名称。 方式1&#xff1a;android:label"xxx应用"&#xff08;应用名称显示xxx应用&#xff09; 方式2&#xff1a;android:label"st…

Android修改应用程序图标和名字

Android修改应用程序图标和名字 对于一个APP应用程序来说&#xff0c;最鲜明的就是APP的图标和名字了。 修改应用图标 在res/drawable中保存一个jpg或者png的图片文件。(png支持透明度) 例&#xff1a;在drawable中保存icon.jpg文件修改AndroidManifest.xml中application的a…

flutter 修改app名字和图标(安卓)

安卓 修改名字: 找到flutter项目下面的android>app>src>main>AndroidManifest.xml 修改里面的android:label"改成你要的名字" 修改图标: 找到android>app>src>main>res里面的mipmap-xx文件夹修改里面的图标 一件生成多种格式的图标: http…

android studio修改app图标

一、修改图标文件 1.找到项目下的多个mipmap-目录&#xff08;如下图&#xff09;&#xff0c;将要修改的图片在每个目录中都放入一份 2.再找到mipmap-anydpi-v26目录&#xff08;如下图&#xff09;&#xff0c;修改目录中两个文件的内容&#xff0c;使其指向我们上一步放入的…

如何修改安卓应用图标和程序名称

安卓修改大师可以在没有源代码的情况下&#xff0c;直接反编译已经打包的APK安装包&#xff0c;通过修改SMALI代码实现添加和去除部分功能&#xff0c;也可以通过修改应用图标和应用程序名称实现个性化应用&#xff0c;甚至可以通过修改应用程序配置参数&#xff08;内置统计参…

修改app图标

修改app图标 1.准备三个尺寸的.png图片 &#xff08;注&#xff1a;一定要是.png后缀的图片&#xff09;,分别命名为xx.png, xx2x.png, xx3x.png; 2.在项目中找到项目->Resource->AppLogo,把三个尺寸的图片拉入项目中&#xff0c;选择Copy items if needed、Create gr…

如何修改软件名称及图标,非常详细

所需工具 MT管理器&#xff1a;下载 理论&#xff1a; 补充android:versionName"2.4"是版本号 实战&#xff1a; 修改图标 wzry.png就是刚刚复制进来的图片名称 图标修改完成 下面开始修改名称&#xff1a;