【机器学习】机器学习之多变量线性回归-Multiple_Variable_Soln

引言

扩展数据结构和之前开发的例程,以支持多个特征。有几个例程被更新,使得实验看起来有些冗长,但实际上只是对之前的例程进行了小的调整,因此快速回顾是可行的

文章目录

  • 引言
  • 一、多变量线性回归
    • 1.1 目标
    • 1.2 工具
  • 二、问题陈述
    • 2.1 包含示例的矩阵X
    • 2.2 参数向量w, b
  • 三、多变量模型预测
    • 3.1 逐个元素进行单个预测
    • 3.2 单个预测向量
  • 四、使用多变量计算成本
  • 五、带有多个变量的梯度下降
    • 5.1 使用多个变量计算梯度
    • 5.2 带有多个变量的梯度下降
  • 总结

一、多变量线性回归

1.1 目标

  1. 扩展我们的回归模型例程以支持多个特征
  2. 扩展数据结构以支持多个特征
  3. 重写预测、成本和梯度例程以支持多个特征
  4. 利用NumPy的np.dot来向量化它们的实现,以提高速度和简化性

1.2 工具

在本实验中,我们将使用以下工具:

  • NumPy,一个流行的科学计算库
  • Matplotlib,一个流行的数据绘图库
import copy, math
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('./deeplearning.mplstyle')
np.set_printoptions(precision=2)  # 减少NumPy数组的显示精度

二、问题陈述

使用房屋价格预测的启发示例。训练数据集包含三个具有四个特征(面积、卧室数量、楼层数和房屋年龄)的示例,如下表所示。请注意,与之前的实验不同,面积是以平方英尺(sqft)为单位,而不是1000平方英尺

面积(平方英尺)卧室数量楼层数房屋年龄价格(千元美元)
21045145460
14163240232
8522135178

使用这些值构建一个线性回归模型,以便然后预测其他房屋的价格。例如,一个面积为1200平方英尺、3个卧室、1个楼层、40年历史的房屋。

#创建X_train和y_train变量
X_train = np.array([[2104, 5, 1, 45], [1416, 3, 2, 40], [852, 2, 1, 35]])
y_train = np.array([460, 232, 178])

2.1 包含示例的矩阵X

类似于上面的表格,示例存储在NumPy矩阵X_train中。矩阵的每一行代表一个示例。当有𝑚个训练示例(在我们的例子中𝑚是三个),并且有𝑛个特征(在我们的例子中有四个),矩阵𝐗的维度为(𝑚, 𝑛)(m行,n列)。
𝐗=𝑥(0)0𝑥(1)0⋯𝑥(𝑚−1)0𝑥(0)1𝑥(1)1𝑥(𝑚−1)1⋯⋯⋯𝑥(0)𝑛−1𝑥(1)𝑛−1𝑥(𝑚−1)𝑛−1
矩阵解释:
𝐱(𝑖)是包含示例i的向量。𝐱(𝑖)=(𝑥(𝑖)0,𝑥(𝑖)1,⋯,𝑥(𝑖)𝑛−1)
𝑥(𝑖)𝑗是示例i中的元素j。方括号内的上标表示示例编号,而下标表示元素。
显示输入数据。

# 数据存储在NumPy数组/矩阵中
print(f"X形状: {X_train.shape}, X类型: {type(X_train)})")
print(X_train)
print(f"y形状: {y_train.shape}, y类型: {type(y_train)})")
print(y_train)

输出结果:
在这里插入图片描述

2.2 参数向量w, b

𝐰是一个具有𝑛个元素的向量。

  • 每个元素都包含与一个特征相关的参数。
  • 在我们的数据集中,n是4。
  • 理论上,我们将其绘制为列向量
    𝐰=𝑤0𝑤1⋯𝑤𝑛−1

𝑏是一个标量参数。
为了演示,𝐰 和 𝑏 将加载一些初始选定的值,这些值接近最优值。𝐰 是一个1-D NumPy向量

b_init = 785.1811367994083
w_init = np.array([ 0.39133535, 18.75376741, -53.36032453, -26.42131618])
print(f"w_init形状: {w_init.shape},

输出结果:
在这里插入图片描述

三、多变量模型预测

具有多个变量的模型的预测由线性模型给出:
𝑓𝐰,𝑏(𝐱)=𝑤0𝑥0+𝑤1𝑥1+…+𝑤𝑛−1𝑥𝑛−1+𝑏(1)或者用向量表示法:𝑓𝐰,𝑏(𝐱)=𝐰⋅𝐱+𝑏(2)
其中 ⋅ 是向量点积
为了演示点积,我们将使用(1)和(2)来实现预测。

3.1 逐个元素进行单个预测

我们之前的预测是将一个特征值乘以一个参数,然后加上偏置参数。将我们之前预测的实现扩展到多个特征,可以通过遍历每个元素,执行其参数的乘法,然后在最后加上偏置参数来实现(1)上述。

def predict_single_loop(x, w, b): """使用线性回归进行单个预测参数:x (ndarray): 形状为 (n,) 的多个特征示例w (ndarray): 形状为 (n,) 的模型参数    b (标量):  模型参数     返回:p (标量):  预测"""n = x.shape[0]p = 0for i in range(n):p_i = x[i] * w[i]  p = p + p_i         p = p + b                return p
# 从我们的训练数据中获取一行
x_vec = X_train[0,:]
print(f"x_vec 形状 {x_vec.shape}, x_vec 值: {x_vec}")# 进行预测
f_wb = predict_single_loop(x_vec, w_init, b_init)
print(f"f_wb 形状 {f_wb.shape}, 预测: {f_wb}")

输出结果:
在这里插入图片描述

注意 x v e c x_vec xvec的形状。它是一个具有4个元素的1-D NumPy向量,形状为(4,)。结果 f w b f_wb fwb是一个标量。

3.2 单个预测向量

注意方程(1)可以使用向量点积(2)来实现。我们可以利用向量运算来加速预测。
回顾Python/NumPy实验室,NumPy的np.dot()可以用来执行向量点积。

def predict(x, w, b): """使用线性回归进行单个预测参数:x (ndarray): 形状为 (n,) 的多个特征示例w (ndarray): 形状为 (n,) 的模型参数   b (标量): 模型参数 返回:p (标量): 预测"""p = np.dot(x, w) + b     return p    
# 从我们的训练数据中获取一行
x_vec = X_train[0,:]
print(f"x_vec 形状 {x_vec.shape}, x_vec 值: {x_vec}")
# 进行预测
f_wb = predict(x_vec,w_init, b_init)
print(f"f_wb 形状 {f_wb.shape}, 预测: {f_wb}")

输出结果:
在这里插入图片描述

结果和形状与之前使用循环的版本相同。从现在开始,np.dot将被用于这些操作。预测现在是一个单一的语句。大多数例程将直接实现它,而不是调用一个单独的预测例程

四、使用多变量计算成本

多变量成本函数的方程是:
J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 (3) J(\mathbf{w},b) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} (f_{\mathbf{w},b}(\mathbf{x}^{(i)}) - y^{(i)})^2 \tag{3} J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2(3)

其中:
f w , b ( x ( i ) ) = w ⋅ x ( i ) + b (4) f_{\mathbf{w},b}(\mathbf{x}^{(i)}) = \mathbf{w} \cdot \mathbf{x}^{(i)} + b \tag{4} fw,b(x(i))=wx(i)+b(4)
与之前的实验室相比,𝐰和 x ( i ) \mathbf{x}^{(i)} x(i)是向量而不是标量,支持多个特征。
下面是方程(3)和(4)的实现。请注意,这使用了本课程中的一种标准模式,其中使用一个for循环遍历所有m个示例。

def compute_cost(X, y, w, b): """计算成本参数:X (ndarray (m,n)): 数据,m个示例具有n个特征y (ndarray (m,)): 目标值w (ndarray (n,)): 模型参数  b (标量): 模型参数返回:成本 (标量): 成本"""m = X.shape[0]成本 = 0.0for i in range(m):                                f_wb_i = np.dot(X[i], w) + b           #(n,)(n,) = 标量 (见 np.dot)成本 = 成本 + (f_wb_i - y[i])**2       #标量成本 = 成本 / (2 * m)                      #标量    return 成本
# 使用我们预先选择的优化参数计算并显示成本。
成本 = compute_cost(X_train, y_train, w_init, b_init)
print(f'在最佳w处的成本 : {成本}')

输出结果:
在这里插入图片描述

预期结果:最佳w处的成本 : 1.5578904045996674e-12

五、带有多个变量的梯度下降

对于多个变量的梯度下降:
重复,直到收敛:
repeat until convergence: { w j = w j − α ∂ J ( w , b ) ∂ w j for j = 0..n-1 b = b − α ∂ J ( w , b ) ∂ b } \begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline\; & w_j = w_j - \alpha \frac{\partial J(\mathbf{w},b)}{\partial w_j} \tag{5} \; & \text{for j = 0..n-1}\newline &b\ \ = b - \alpha \frac{\partial J(\mathbf{w},b)}{\partial b} \newline \rbrace \end{align*} repeat} until convergence:{wj=wjαwjJ(w,b)b  =bαbJ(w,b)for j = 0..n-1(5)

其中,n 是特征的数量,参数 𝑤𝑗 和 𝑏 同时更新,其中
∂ J ( w , b ) ∂ w j = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x j ( i ) ∂ J ( w , b ) ∂ b = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) \begin{align} \frac{\partial J(\mathbf{w},b)}{\partial w_j} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\mathbf{w},b}(\mathbf{x}^{(i)}) - y^{(i)})x_{j}^{(i)} \tag{6} \\ \frac{\partial J(\mathbf{w},b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\mathbf{w},b}(\mathbf{x}^{(i)}) - y^{(i)}) \tag{7} \end{align} wjJ(w,b)bJ(w,b)=m1i=0m1(fw,b(x(i))y(i))xj(i)=m1i=0m1(fw,b(x(i))y(i))(6)(7)

  • 𝑚 是数据集中的训练示例数量
  • f w , b ( x ( i ) ) f_{\mathbf{w},b}(\mathbf{x}^{(i)}) fw,b(x(i))是模型的预测,而 y ( i ) y^{(i)} y(i)是目标值

5.1 使用多个变量计算梯度

下面是计算方程(6)和(7)的实现。有多种实现方式。在这个版本中,有一个
外循环遍历所有m个示例。
∂ J ( w , b ) ∂ b \frac{\partial J(\mathbf{w},b)}{\partial b} bJ(w,b)对于示例可以直接计算并累加在第二个循环中,遍历所有n个特征:
∂ J ( w , b ) ∂ w j \frac{\partial J(\mathbf{w},b)}{\partial w_j} wjJ(w,b)为每个 w j w_j wj计算。

def compute_gradient(X, y, w, b): """计算线性回归的梯度参数:X (ndarray (m,n)): 数据,m个示例具有n个特征y (ndarray (m,)): 目标值w (ndarray (n,)): 模型参数  b (标量): 模型参数返回:dj_dw (ndarray (n,)): 成本关于参数w的梯度。 dj_db (标量): 成本关于参数b的梯度。 """m,n = X.shape           #(示例数量, 特征数量)dj_dw = np.zeros((n,))dj_db = 0.for i in range(m):                             err = (np.dot(X[i], w) + b) - y[i]   for j in range(n):                         dj_dw[j] = dj_dw[j] + err * X[i, j]    dj_db = dj_db + err                        dj_dw = dj_dw / m                                dj_db = dj_db / m                                return dj_db, dj_dw
# 计算和显示梯度
tmp_dj_db, tmp_dj_dw = compute_gradient(X_train, y_train, w_init, b_init)
print(f'初始w,b处的dj_db: {tmp_dj_db}')
print(f'初始w,b处的dj_dw: \n {tmp_dj_dw}')

输出结果:
在这里插入图片描述

预期结果:
初始w,b处的dj_db: -1.6739251122999121e-06
初始w,b处的dj_dw: [-2.73e-03 -6.27e-06 -2.22e-06 -6.92e-05]

5.2 带有多个变量的梯度下降

下面的例行程序实现了上面的方程(5)。

def gradient_descent(X, y, w_in, b_in, cost_function, gradient_function, alpha, num_iters): """执行批量梯度下降以学习theta。通过采取num_iters个梯度步骤并使用学习率alpha来更新theta。参数:X (ndarray (m,n))   : 数据,m个示例具有n个特征y (ndarray (m,))    : 目标值w_in (ndarray (n,)) : 初始模型参数  b_in (标量)       : 初始模型参数cost_function       : 计算成本的函数gradient_function   : 计算梯度的函数alpha (float)       : 学习率num_iters (int)     : 运行梯度下降的迭代次数返回:w (ndarray (n,)) : 参数的更新值b (标量)       : 参数的更新值"""# 一个数组来存储每次迭代的成本J和w,主要用于后续的绘图J_history = []w = copy.deepcopy(w_in)  # 在函数内部避免修改全局wb = b_infor i in range(num_iters):# 计算梯度并更新参数dj_db,dj_dw = gradient_function(X, y, w, b)   ##None# 使用w, b, alpha和梯度更新参数w = w - alpha * dj_dw               ##Noneb = b - alpha * dj_db               ##None# 每迭代一次就保存成本Jif i<100000:      # 防止资源耗尽J_history.append(cost_function(X, y, w, b))# 每迭代10次打印一次成本,或者如果迭代次数小于10,则打印所有迭代if i% math.ceil(num_iters / 10) == 0:print(f"迭代 {i:4d}: 成本 {J_history[-1]:8.2f}   ")return w, b, J_history #返回最终的w,b和J历史,用于绘图

在下一个单元格中,您将测试该实现:

# 初始化参数
initial_w = np.zeros_like(w_init)
initial_b = 0.
# 一些梯度下降设置
iterations = 1000
alpha = 5.0e-7
# 运行梯度下降
w_final, b_final, J_hist = gradient_descent(X_train, y_train, initial_w, initial_b,compute_cost, compute_gradient, alpha, iterations)
print(f"通过梯度下降找到的b,w: {b_final:0.2f},{w_final} ")
m, _ = X_train.shape
for i in range(m):print(f"预测: {np.dot(X_train[i], w_final) + b_final:0.2f}, 目标值: {y_train[i]}")

输出结果:
在这里插入图片描述

预期结果:
通过梯度下降找到的b,w: -0.00, [ 0.2 0. -0.01 -0.07]
预测: 426.19, 目标值: 460
预测: 286.17, 目标值: 232
预测: 171.47, 目标值: 178

# 绘制成本与迭代次数的关系图
fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True, figsize=(12, 4))
ax1.plot(J_hist)
ax2.plot(100 + np.arange(len(J_hist[100:])), J_hist[100:])
ax1.set_title("Cost vs. iteration");  ax2.set_title("Cost vs. iteration (tail)")
ax1.set_ylabel('Cost')             ;  ax2.set_ylabel('Cost') 
ax1.set_xlabel('iteration step')   ;  ax2.set_xlabel('iteration step') 
plt.show()

输出结果:
在这里插入图片描述

成本仍在下降,我们的预测并不十分准确,后续继续优化

总结

  1. 重新开发了线性回归的例程,现在支持多个变量
  2. 利用NumPy的np.dot来向量化实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3269492.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【因数之和】python求解方法

输入两个整数A和B&#xff0c;求A的B次方的因子和&#xff0c;结果对1000000007取模。 def mod_exp(base, exp, mod):result 1while exp > 0:if exp % 2 1:result (result * base) % modbase (base * base) % modexp // 2return resultdef sum_of_factors(n):total 0…

【无标题】shell脚本的基本命令+编写shell脚本

shell脚本 一.shell基础 1.shell概念 2.shell脚本 3.shell脚本编写注意事项 二.编写shell脚本 1.编写一个helloworld脚本&#xff0c;运行脚本 [rootshell ~]# vim helloworld.sh #!/bin/bash //声明 echo "hello world!" ls -lh /etc/ 运行脚本(四种方式)&…

c/c++的内存管理(超详细)

一、c/c的内存分布 这是操作系统中对于内存的划分&#xff1a; 我们重点掌握以下几个区域即可&#xff1a; 1.栈 (调用函数会建立栈帧) 2.堆(动态开辟的空间) 3.数据段(静态区)&#xff1a;存放静态变量以及全局变量 4.代码段 (常量区) 先来看看一个题目&#xff1a; int…

[物联网专题] RS485继电器输出之Modbus控制流程和时间优化分析

在工控领域&#xff0c;往往需要大量的输入信号和输出控制信号&#xff0c;以接收各种传感信号和产生输出控制动作。由于PLC的输出触点数量有限&#xff0c;或者因为更多输出触点的PLC价格昂贵&#xff0c;性价比并不高。为了解决这个矛盾&#xff0c;基于MODBUS协议的继电器IO…

数据结构:基础概念

一、相关概念 概念 相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构 集合&#xff1a;所有数据在同一个集合中&#xff0c;关系平等。 线性&#xff1a;数据和数据之间是一对一的关系 树&#xff1a; 一对多 图&#xff1a;多对多 物理结构(在内存当中的存储关系)…

AC695x BLE OTA调试

SDK版本&#xff1a;AC695N_soundbox_sdk_release_3.1.0AC695x SDK支持BLE OTA升级&#xff0c;使用杰理公版APP升级即可。SDK需要做一些调整&#xff0c;板级文件需要增加如下配置&#xff0c;使能OTA升级 #define TCFG_APP_BT_EN 1#define APP_UPDATE_EN …

Three.js动效(第09辑):令人瞠目结舌的交互效果,沉浸式体验

three.js能够实现各种3D动态效果&#xff0c;不禁有小伙伴问了&#xff0c;实现这些效果到底有什么意思&#xff0c;其实最大的意义就是给用户沉浸式的体验&#xff0c;瞬间专注用户注意力。 Three.js能够带来以下沉浸式体验&#xff1a; 3D虚拟现实体验&#xff1a; 使用Th…

MATLAB-bode图编程

num[1 1];den [2 1];tf(num,den)bode(tf(num,den));hold on

PHP8.3.9安装记录,Phpmyadmin访问提示缺少mysqli

ubuntu 22.0.4 腾讯云主机 下载好依赖 sudo apt update sudo apt install -y build-essential libxml2-dev libssl-dev libcurl4-openssl-dev pkg-config libbz2-dev libreadline-dev libicu-dev libsqlite3-dev libwebp-dev 下载php8.3.9安装包 nullhttps://www.php.net/d…

Bert文本分类和命名实体的模型架构剖析

文章目录 介绍Bert模型架构损失计算方式BertForSequenceClassificationBertForTokenClassification Bert 输出结果剖析例子 参考资料 介绍 文本分类&#xff1a;给一句文本分类&#xff1b; 实体识别&#xff1a;从一句文本中&#xff0c;识别出其中的实体&#xff1b; 做命名…

由于误操作原因丢失了照片?6 款 Android 照片恢复应用程序可能有帮助

由于意外删除&#xff0c;软件故障&#xff0c;系统崩溃&#xff0c;恢复出厂设置或任何其他原因&#xff0c;您可能会丢失Android手机中的照片。无论如何&#xff0c;您仍然有很大的机会借助Android照片恢复应用程序恢复照片。有很多应用程序提供恢复支持&#xff0c;但并非所…

zeal 开发者离线文档工具

zeal是一款程序开发者不可或缺的离线文档查看器 下载地址 官网地址&#xff1a; windows版csdn下载&#xff1a;https://zealdocs.org/download.html#windows windows版官网下载&#xff1a;https://zealdocs.org/download.html#windows 下载压缩版&#xff0c;解压即用相对…

Matlab类阿克曼车机器人运动学演示

v1是后驱动轮轮速&#xff0c; v2是转向角变化速度&#xff0c; 实际上我们只需要关注XQ&#xff0c; YQ和Phi的变化率。 通过这三项和时间步长&#xff0c; 我们就可以计算出变化量&#xff0c; 再结合初始值就能推断出每个时刻的值。 % 清理当前运行环境 % 清除所有变量 cle…

搭建自己的金融数据源和量化分析平台(三):读取深交所股票列表

这里放出深交所爬虫模块的代码&#xff1a; # -*- coding: utf-8 -*- # 深圳交易所爬虫 import osimport pandas as pd import requests#读取最新深交所股票列表 def get_stock_list():cache_file_path "./sotck_file.xlsx"url "https://www.szse.cn/api/rep…

Passing output of 3DCNN layer to LSTM layer

题意&#xff1a;将3DCNN&#xff08;三维卷积神经网络&#xff09;层的输出传递给LSTM&#xff08;长短期记忆网络&#xff09;层 问题背景&#xff1a; Whilst trying to learn Recurrent Neural Networks(RNNs) am trying to train an Automatic Lip Reading Model using 3…

Linux基础I/O之文件描述符fd 重定向(下)

目录 四、文件描述符 4.1 文件描述符的内核本质 4.2 文件描述符的分配规则 五、重定向 四、文件描述符 在回忆起上述知识后&#xff0c;那么文件描述符到底是什么呢&#xff1f; 我们不难注意到&#xff0c;刚刚的open接口系统调用接口其实是有返回值的&#xff08;一个int…

FTP(File Transfer Protocal,文件传输协议)

文章目录 引言FTP管理工具FTP客户端FTP连接模式控制连接数据连接FTP命令/响应FTP命令FTP响应FTPSSFTP引言 FTP(File Transfer Protocal,文件传输协议)用于建立两台主机间的数据文件传输下载。使用客户/服务器(Client/Server)架构,基于TCP协议,服务端口为21。 FTP链接…

17.延迟队列

介绍 延迟队列&#xff0c;队列内部是有序的&#xff0c;延迟队列中的元素是希望在指定时间到了以后或之前取出和处理。 死信队列中&#xff0c;消息TTL过期的情况其实就是延迟队列。 使用场景 1.订单在十分钟内未支付则自动取消。 2.新创建的店铺&#xff0c;如果十天内没…

行锁表锁都是渣渣,元数据锁才是隐藏大佬

什么是元数据锁&#xff1f; 英文名叫Metadata Lock&#xff0c;缩写为MDL&#xff0c;顾名思义&#xff0c;它是针对元数据的一种锁&#xff0c;锁的是元数据。 那什么是元数据&#xff1f; 一张表有100条记录&#xff0c;这里的记录我们可以称之为表数据&#xff0c;一张表…

深入了解:MinIO 企业对象存储的可观察性

可观测性是指收集信息&#xff08;跟踪、日志、指标&#xff09;&#xff0c;以提高性能、可靠性和可用性为目标。很少有人能确定其中一个事件的根本原因。通常情况下&#xff0c;当我们将这些信息关联起来形成叙述时&#xff0c;我们就会有更好的理解。从一开始&#xff0c;Mi…