李沐《动手学深度学习v2》学习笔记(二):线性回归和实现
李沐《动手学深度学习v2》学习笔记(二):线性回归和实现
目录:
- 李沐《动手学深度学习v2》学习笔记(二):线性回归和实现
- 一、线性回归概述
- 二、构建线性模型和模型优化
- 1.最小二乘法(LSM)
- 2.梯度下降
- 2.1 批量梯度下降(BGD)
- 2.2 随机梯度下降(SGD)
- 2.3 小批量随机梯度下降(MBGD)
- 3.正则化
- 三、手动构建线性回归模型
- 1.制作人工数据集
- 2.实现小批量随机抽样
- 3.初始化模型
- 4.定义损失函数和优化算法
- 5.训练过程
- 四、利用PyTorch函数简洁实现线性回归
- 1.PyTorch数据集处理模块
- 2.实现流程
一、线性回归概述
什么是回归问题?
- 有监督学习分为两类,即分类和回归问题,预测某一事物属于哪一类别,属于分类问题,如:猫狗分类;而当需要预测的内容是一个连续的值,属于回归问题,如:预测房价
什么是线性回归?
- 线性回归是回归问题的一种,当输出值与输入值之间满足线性关系时,即满足方程:h(x)=w1x1+w2x2+...+wnxn+w0(b)h(x)=w_1x_1+w_2x_2+...+w_nx_n+w_0(b)h(x)=w1x1+w2x2+...+wnxn+w0(b),称为线性回归
- 在二维平面中,它表现为一条直线,在多维空间中,它表现为一个超平面
- 在构建这个超平面时,我们需要使预测值与真实值之间的误差最小化
符号约定:
符号 | 含义 |
---|---|
mmm | 训练集中样本的数量 |
nnn | 特征的数量 |
xxx | 样本的特征变量/输入变量 |
yyy | 样本的目标变量/输出变量 |
(x,y)(x,y)(x,y) | 训练集中的样本:(输入变量,输出变量)(输入变量,输出变量)(输入变量,输出变量) |
(x(i),y(i))(x^{(i)},y^{(i)})(x(i),y(i)) | 代表第 iii 个观察样本的特征和输出 |
hhh | 代表学习算法的解决方案或函数,也称为假设(hypothesis) |
y^=h(x){\hat y}=h(x)y^=h(x) | 代表预测值 |
例如:
x(2)=[162.2318118],y(2)=37000,x2(2)=31,x3(2)=8x^{(2)}=\left[\begin{matrix}162.2\\31\\8\\118\end{matrix}\right],y^{(2)}=37000,x^{(2)}_2=31,x^{(2)}_3=8x(2)=⎣⎢⎢⎡162.2318118⎦⎥⎥⎤,y(2)=37000,x2(2)=31,x3(2)=8
线性模型可以看作是一个单层神经网络:
二、构建线性模型和模型优化
构建线性模型的核心问题是找到:h(x)=w1x1+w2x2+...+wnxn+w0(b)h(x)=w_1x_1+w_2x_2+...+w_nx_n+w_0(b)h(x)=w1x1+w2x2+...+wnxn+w0(b) 中的 w(w1,w2,...,wn){\bf w}(w_1,w_2,...,w_n)w(w1,w2,...,wn) 和 w0(b)w_0(b)w0(b)
为了方便计算,可以设 x0=1x_0=1x0=1,则方程变为:h(x)=w0x0+w1x1+w2x2+...+wnxn=wTx=⟨w,x⟩h(x)=w_0x_0+w_1x_1+w_2x_2+...+w_nx_n={\bf w}^T{\bf x}=\langle {\bf w},{\bf x}\rangleh(x)=w0x0+w1x1+w2x2+...+wnxn=wTx=⟨w,x⟩
wiw_iwi 的取值越大,线性模型越复杂
损失函数(Loss Function):
对学习结果的度量,度量单样本预测的错误程度,损失函数值越小,模型就越好
损失函数名称 | 损失函数定义 |
---|---|
0-1损失函数 | Loss(y(i),h(x(i)))={1,h(x(i))≠y(i)0,h(x(i))=y(i)Loss(y^{(i)},h(x^{(i)}))=\begin{cases} 1, & h(x^{(i)}) \neq y^{(i)} \\ 0, & h(x^{(i)}) = y^{(i)} \end{cases}Loss(y(i),h(x(i)))={1,0,h(x(i))=y(i)h(x(i))=y(i) |
平方损失函数 | Loss(y(i),h(x(i)))=(y(i)−h(x(i)))2Loss(y^{(i)},h(x^{(i)}))=(y^{(i)}-h(x^{(i)}))^2Loss(y(i),h(x(i)))=(y(i)−h(x(i)))2 |
绝对损失函数 | Loss(y(i),h(x(i)))=∣y(i)−h(x(i))∣Loss(y^{(i)},h(x^{(i)}))=\mid y^{(i)}-h(x^{(i)})\midLoss(y(i),h(x(i)))=∣y(i)−h(x(i))∣ |
对数损失函数/对数似然损失函数 | Loss(y(i),P(y(i)∣xi))=−logP((y(i)∣x(i)))Loss(y^{(i)},P(y^{(i)}\mid x_i))=-logP((y^{(i)}\mid x^{(i)}))Loss(y(i),P(y(i)∣xi))=−logP((y(i)∣x(i))) |
代价函数: 度量对所有样本集预测值的平均误差,常用的代价函数包括均方误差、均方根误差、平均绝对误差等
代价函数常常采用均方误差 MSE\text{MSE}MSE: MSE=1m∑i=1m(y(i)−y(i)^)2\text{MSE}={1 \over m}\sum_{i=1}^m(y^{(i)}-\hat {y^{(i)}})^2MSE=m1∑i=1m(y(i)−y(i)^)2,为方便计算,常定义为:J(w)=12m∑i=1m(y(i)−y(i)^)2J({\bf w})={1 \over 2m}\sum_{i=1}^m(y^{(i)}-\hat {y^{(i)}})^2J(w)=2m1∑i=1m(y(i)−y(i)^)2
目标:要找到一组 w(w0,w1,w2,...,wn){\bf w}(w_0,w_1,w_2,...,w_n)w(w0,w1,w2,...,wn),使得 MSE\text{MSE}MSE 具有最小值:minw(1m∑i=1m(y(i)−y(i)^)2)min_{w}({1 \over m}\sum_{i=1}^m(y^{(i)}-\hat {y^{(i)}})^2)minw(m1∑i=1m(y(i)−y(i)^)2),那么,该如何寻找这一组 w{\bf w}w 呢?
1.最小二乘法(LSM)
很显然,代价函数 J(w)=12m∑i=1m(y(i)^−y(i))2J({\bf w})={1 \over 2m}\sum_{i=1}^m(\hat {y^{(i)}}-y^{(i)})^2J(w)=2m1∑i=1m(y(i)^−y(i))2 是一个二次函数,即它是一个凸函数,具有最小值
以二维 w(w0,w1){\bf w}(w_0,w_1)w(w0,w1) 为例,由不同的 (w0,w1)(w_0,w_1)(w0,w1) 可以得到不同的代价值,且代价函数可以找到最小值,如图所示:
如果想要找到最小值,我们只需对代价函数求偏导,并令偏导数为 000(最小值点),对凸函数来说是可以找到解析解的:
令∂J(w0,w1)∂w0=1m∑i=1m(w0+w1x(i)−y(i))=0令 \ \frac{\partial J(w_0,w_1)}{\partial w_0}={1 \over m}\sum_{i=1}^m(w_0+w_1x^{(i)}-y^{(i)})=0令 ∂w0∂J(w0,w1)=m1i=1∑m(w0+w1x(i)−y(i))=0
令∂J(w0,w1)∂w1=1m∑i=1mx(i)(w0+w1x(i)−y(i))=0令 \ \frac{\partial J(w_0,w_1)}{\partial w_1}={1 \over m}\sum_{i=1}^mx^{(i)}(w_0+w_1x^{(i)}-y^{(i)})=0令 ∂w1∂J(w0,w1)=m1i=1∑mx(i)(w0+w1x(i)−y(i))=0
解得:w0=1m∑i=1m(y(i)−w1x(i)),w1=∑i=1my(i)(x(i)−x‾)∑i=1n(x(i))2−1m(∑i=1mx(i))2解得:w_0={1 \over m}\sum_{i=1}^m(y^{(i)}-w_1x^{(i)}),w_1={\sum_{i=1}^my^{(i)}(x^{(i)}-\overline{x}) \over \sum_{i=1}^n(x^{(i)})^2-{1 \over m}(\sum_{i=1}^mx^{(i)})^2}解得:w0=m1i=1∑m(y(i)−w1x(i)),w1=∑i=1n(x(i))2−m1(∑i=1mx(i))2∑i=1my(i)(x(i)−x)
2.梯度下降
梯度: 它是一个矢量,对一元函数来说,梯度就是函数的导数;对多元函数来说,多元函数 f(x)f(x)f(x) 在某一点处的梯度表示 f(x)f(x)f(x) 在该点处的最大方向导数,其方向为具有最大增长率的方向,那么梯度的反方向就是函数值下降率最大的方向
梯度下降的目标仍然是希望找到代价函数 J(w0,w1,...,wn)J(w_0,w_1,...,w_n)J(w0,w1,...,wn) 的最小值,比 LSM\text{LSM}LSM 更好的是,梯度下降法可以应用于更一般的函数,而不只是凸函数
利用梯度下降,我们可以在代价函数的某一点处开始,根据梯度的反方向,逐渐修改 (w0,w1,...,wn)(w_0,w_1,...,w_n)(w0,w1,...,wn),来使代价函数值逐渐减小
梯度下降的数学定义:
w=(w0,w1,...,wn)w=(w_0,w_1,...,w_n)w=(w0,w1,...,wn),里面第 iii 个元素用 wiw_iwi 来表示,则:
wi=wi−α∂∂wiJ(w0,w1,...,wn),for i=0 to i=n⏟不断重复,直到收敛\underbrace{{w_i}=w_i-\alpha\frac{\partial }{\partial w_i}J(w_0,w_1,...,w_n),\text{for i=0 to i=n}}_{\rm \text{不断重复,直到收敛}}不断重复,直到收敛wi=wi−α∂wi∂J(w0,w1,...,wn),for i=0 to i=n
- wi{w_i}wi:表示对 www 中的第 iii 个自变量进行更新,在一个循环内,所有对 wiw_iwi 的更新必须是同步的
注:wiw_iwi 值不是立刻更新,而是当计算完所有 wiw_iwi 的更新值后再同时统一赋值,或者说计算和更新的过程都是同步的 - α\alphaα:表示学习率,它反映了每次更新 wiw_iwi 值的跨度率
- ∂∂wiJ(w0,w1,...,wn)\frac{\partial }{\partial w_i}J(w_0,w_1,...,w_n)∂wi∂J(w0,w1,...,wn):表示代价函数对 www 中的 wiw_iwi 进行偏微分
- α∂∂wiJ(w0,w1,...,wn)\alpha\frac{\partial }{\partial w_i}J(w_0,w_1,...,w_n)α∂wi∂J(w0,w1,...,wn):表示每次更新的步长
- 因为梯度下降需要确定在代价函数中的某一个点处开始执行,因此需要给定一初始值,通常取 w0,w1,...,wn=0w_0,w_1,...,w_n=0w0,w1,...,wn=0 开始
上述公式表明:
- 如果代价函数对 wiw_iwi 的偏微分小于零,表示沿着 wiw_iwi 的正方向会使代价函数变小,因此我们可以选择增大 wiw_iwi 的值,具体增大 −α∂∂wiJ(w0,w1,...,wn)-\alpha\frac{\partial }{\partial w_i}J(w_0,w_1,...,w_n)−α∂wi∂J(w0,w1,...,wn);
- 如果代价函数对 ωi\omega_iωi 的偏微分大于零,表示沿着 ωi\omega_iωi 的正方向会使代价函数变大,因此我们可以选择减小 wiw_iwi 的值,具体减小 α∂∂wiJ(w0,w1,...,wn)\alpha\frac{\partial }{\partial w_i}J(w_0,w_1,...,w_n)α∂wi∂J(w0,w1,...,wn)
- 如果代价函数对 wiw_iwi 的偏微分等于零,则修正项为零,则不需要修改 wiw_iwi 的值
- 现在我们讨论学习率 α\alphaα:如果 α\alphaα 太高可能导致无法找到合适解(左图),如果 α\alphaα 太低可能导致学习速度过于缓慢(右图)
梯度下降法具有三种模式,即批量梯度下降、随机梯度下降和小批量梯度下降
2.1 批量梯度下降(BGD)
批量梯度下降在计算代价函数的梯度时,考虑了所有的训练样本,代价函数:J(w)=12m∑j=1m(y(j)^−y(j))2J({\bf w})={1 \over 2m}\sum_{j=1}^m(\hat {y^{(j)}}-y^{(j)})^2J(w)=2m1∑j=1m(y(j)^−y(j))2,mmm 为样本个数,因此 wiw_iwi 为:
wi=wi−α1m∑j=1mxi(j)(y(j)^−y(j))=wi−α1m∑j=1mxi(j)(⟨w,x⟩−y(j)){w_i}=w_i-\alpha{1 \over m}\sum_{j=1}^mx^{(j)}_i\left(\hat {y^{(j)}}-y^{(j)}\right)=w_i-\alpha{1 \over m}\sum_{j=1}^mx^{(j)}_i\left(\langle {\bf w},{\bf x}\rangle-y^{(j)}\right)wi=wi−αm1j=1∑mxi(j)(y(j)^−y(j))=wi−αm1j=1∑mxi(j)(⟨w,x⟩−y(j))
特点:
- 计算梯度的每一步都基于完整训练集
- 训练集规模庞大时算法速度很慢
- 特征数量多时,比标准方程快得多
- 适合样本数规模适中,特征规模很大的数据集
2.2 随机梯度下降(SGD)
随机梯度下降每一次更新 ω\omegaω 时,随机选择一个训练样本来计算代价函数的梯度,设选择了第 jjj 个训练样本:
wi=wi−α1mxi(j)(y(j)^−y(j))=wi−αxi(j)(⟨w,x⟩−y(j)){w_i}=w_i-\alpha{1 \over m}x^{(j)}_i\left(\hat {y^{(j)}}-y^{(j)}\right)=w_i-\alpha x^{(j)}_i\left(\langle {\bf w},{\bf x}\rangle-y^{(j)}\right)wi=wi−αm1xi(j)(y(j)^−y(j))=wi−αxi(j)(⟨w,x⟩−y(j))
特点:
- 计算速度更快
- 成本函数的下降变得不规则,但总体是下降的
- 最终会接近最小值(还会反弹)
批量梯度下降(左图),随机梯度下降(右图):
2.3 小批量随机梯度下降(MBGD)
小批量梯度下降结合了(一)(二)各自的优点,既不使用所有样本,也不使用单个样本,而是随机选择小批量样本
每次计算代价函数时使用 bbb 个样本,其中 kkk 表示第 k(k<m)k(k<m)k(k<m) 个样本:
wi=wi−α1b∑j=1bxi(k)(y(k)^−y(k))=wi−α1b∑j=1bxi(k)(⟨w,x⟩−y(k)){w_i}=w_i-\alpha{1 \over b}\sum_{j=1}^bx_i^{(k)}\left(\hat {y^{(k)}}-y^{(k)}\right)=w_i-\alpha{1 \over b}\sum_{j=1}^bx_i^{(k)}\left(\langle {\bf w},{\bf x}\rangle-y^{(k)}\right)wi=wi−αb1j=1∑bxi(k)(y(k)^−y(k))=wi−αb1j=1∑bxi(k)(⟨w,x⟩−y(k))
- b=1b=1b=1(随机梯度下降,SGD)
- b=mb=mb=m(批量梯度下降,BGD)
- b=batch_sizeb=\text{\tt batch\_size}b=batch_size,通常是 2\tt 22 的指数倍,常见的有 32,64,128\tt 32,64,12832,64,128 等(小批量梯度下降,MBGD)
其性能介于随机和批量之间,其中,选择的批量数不能太小,这样会导致每次计算量太小,不适合并行来最大利用计算资源,批量数也不能太大,这样会导致内存消耗增加,浪费计算
梯度下降存在的缺陷:
- 缺陷1:可能只找到局部最优解
解决方法:多次实验,并随机设置初始点(超参数),线性回归的 MSE\text{MSE}MSE 代价函数只有一个最小值 - 缺陷2:对属性尺度敏感,即在属性尺度大的维度上下降得更快,尺度小的维度上下降缓慢
解决方法:属性缩放
属性缩放:
(一)归一化(最大-最小规范化):
x′=x−xminxmax−xminx'={x-x_{min} \over x_{max}-x_{min}}x′=xmax−xminx−xmin
将数据映射到 [0,1][0,1][0,1] 区间内,数据归一化的目的是使得各特征对目标变量的影响一致,会将特征数据进行伸缩变化,所以数据归一化是会改变特征数据分布的
(二)Z-Score 标准化:
x′=x−μσx'={x-\mu \over \sigma}x′=σx−μ
其中σ2=1m∑i=1m(x(i))2,μ=1m∑i=1mx(i)其中 \ \sigma^2={1 \over m}\sum_{i=1}^m(x^{(i)})^2,\mu={1 \over m}\sum_{i=1}^mx^{(i)}其中 σ2=m1i=1∑m(x(i))2,μ=m1i=1∑mx(i)
处理后的数据均值为 000,方差为 111,数据标准化为了不同特征之间具备可比性,经过标准化变换之后的特征数据分布没有发生改变
3.正则化
当特征不足或者现有特征与样本标签的相关性不强时,模型容易出现欠拟合,通过挖掘组合特征等新的特征,往往能够取得更好的效果
简单模型的学习能力较差,通过增加模型的复杂度可以使模型拥有更强的拟合能力,如:在线性模型中添加高次项,使得线性模型变为曲线,又比如在神经网络模型中增加网络层数或神经元个数等,但模型过于复杂容易出现过拟合
而正则化就是是用来防止过拟合的,在经验风险上加上与模型复杂度有关的正则化项或惩罚项,但当模型出现欠拟合现象时,则需要有针对性地减小正则化系数
线性回归模型的两种正则化项:
3.1 岭回归(Ridge Regression)——L2L_2L2范数正则化
J(w)=12m∑i=1m(⟨w,x⟩−y(i))2+12λ∑j=1nwj2,(λ>0)J({\bf w})={1 \over 2m}\sum_{i=1}^m\left(\langle{\bf w},{\bf x}\rangle-y^{(i)}\right)^2+{1 \over 2}\lambda\sum_{j=1}^nw_j^2,(\lambda >0)J(w)=2m1i=1∑m(⟨w,x⟩−y(i))2+21λj=1∑nwj2,(λ>0)
wiw_iwi 的取值越大,线性模型越复杂,其中 ∑j=1nwj2\sum_{j=1}^nw_j^2∑j=1nwj2 正是度量了线性模型的复杂度,为使代价函数 J(w)J({\bf w})J(w) 更小,应使 λ∑j=1nwj2\lambda\sum_{j=1}^nw_j^2λ∑j=1nwj2 尽量小,使 w(w0,w1,w2,...,wn){\bf w}(w_0,w_1,w_2,...,w_n)w(w0,w1,w2,...,wn) 中的元素尽量小(接近零)
∂∂wiJ(w)=1m∑j=1mxi(j)(⟨w,x⟩−y(j))+λwi,(λ>0)\frac{\partial }{\partial w_i}J({\bf w})={1 \over m}\sum_{j=1}^mx^{(j)}_i\left(\langle {\bf w},{\bf x}\rangle-y^{(j)}\right)+\lambda w_i,(\lambda>0)∂wi∂J(w)=m1j=1∑mxi(j)(⟨w,x⟩−y(j))+λwi,(λ>0)
3.2 套索回归(Lasso Regression)——L1L_1L1范数正则化
J(w)=12m∑i=1m(⟨w,x⟩−y(i))2+λ∑j=1n∣wj∣,(λ>0)J({\bf w})={1 \over 2m}\sum_{i=1}^m\left(\langle {\bf w},{\bf x}\rangle-y^{(i)}\right)^2+\lambda\sum_{j=1}^n\mid w_j\mid,(\lambda >0)J(w)=2m1i=1∑m(⟨w,x⟩−y(i))2+λj=1∑n∣wj∣,(λ>0)
在套索回归中,通过 ∑j=1n∣wj∣\sum_{j=1}^n\mid w_j\mid∑j=1n∣wj∣ L1L_1L1 范数度量了线性模型的复杂度,为使代价函数 J(w)J({\bf w})J(w) 更小,应使 λ∑j=1n∣wj∣\lambda\sum_{j=1}^n\mid w_j\midλ∑j=1n∣wj∣ 尽量小,使 w(w0,w1,w2,...,wn){\bf w}(w_0,w_1,w_2,...,w_n)w(w0,w1,w2,...,wn) 中的元素尽量小(接近零)
注:Lasso\text{Lasso}Lasso 回归的代价函数 J(w)J({\bf w})J(w) 不是连续可导的(带绝对值),无法直接应用梯度下降
三、手动构建线性回归模型
导入所需的库:
%matplotlib inline
import random # 用于随机梯度下降、随机初始化权重
import torch
1.制作人工数据集
首先,构造一个带有噪声的线性模型(人造数据集),我们使用线性模型参数 w=[2−3.4]T{\bf w}=\left[\begin{matrix}2&-3.4\end{matrix}\right]^Tw=[2−3.4]T,b(w0)=4.2b(w_0)=4.2b(w0)=4.2 和噪声项 ϵ\epsilonϵ 生成数据集及其标签:y=xw+b+ϵ{\bf y}={\bf xw}+b+ϵy=xw+b+ϵ
def synthetic_data(w, b, num_examples): """生成 y = xw + b + 噪声"""X = torch.normal(0, 1, (num_examples, len(w))) # 生成服从 μ=0,σ=1 正态分布的随机值y = torch.matmul(X, w) + by += torch.normal(0, 0.01, y.shape)return X, y.reshape((-1, 1))true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)print('features:', features[0:10], '\n','labels:', labels[0:10]) # 查看生成的结果
分析调用 features, labels = synthetic_data(true_w, true_b, 1000)
:
传入参数:w=[2−3.4],b(w0)=4.2{\bf w}=\left[\begin{matrix}2&-3.4\end{matrix}\right],b(w_0)=4.2w=[2−3.4],b(w0)=4.2,num_examples=1000(样本数){\tt num\_examples=1000}(样本数)num_examples=1000(样本数)
-
X = torch.normal(0, 1, (num_examples, len(w)))
生成了服从 μ=0,σ=1\mu=0,\sigma=1μ=0,σ=1 正态分布的随机值张量,作为样本的输入:
X=[x1(1)x2(1)x1(2)x2(2)⋮⋮x1(1000)x2(1000)]1000×2,num_examples=1000,len(w)=2{\bf X} =\left[\begin{matrix}x_1^{(1)}&x_2^{(1)}\\x_1^{(2)}&x_2^{(2)}\\\vdots&\vdots\\x_1^{(1000)}&x_2^{(1000)}\end{matrix}\right]_{1000×2},{\tt num\_examples=1000},{\tt len(w)=2}X=⎣⎢⎢⎢⎢⎡x1(1)x1(2)⋮x1(1000)x2(1)x2(2)⋮x2(1000)⎦⎥⎥⎥⎥⎤1000×2,num_examples=1000,len(w)=2 -
y = torch.matmul(X, w) + b
形成与 XXX 具有线性关系的因变量 y{\bf y}y,作为样本的输出,即:
y=⟨X,w⟩+b=[x1(1)x2(1)x1(2)x2(2)⋮⋮x1(1000)x2(1000)][2−3.4]+b=[2x1(1)−3.4x2(1)+b2x1(2)−3.4x2(2)+b⋮2x1(1000)−3.4x2(1000)+b]1000×1=[y(1)y(2)⋮y(1000)]1000×1{\bf y} =\langle{\bf X},{\bf w}\rangle+b =\left[\begin{matrix}x_1^{(1)}&x_2^{(1)}\\x_1^{(2)}&x_2^{(2)}\\\vdots&\vdots\\x_1^{(1000)}&x_2^{(1000)}\end{matrix}\right]\left[\begin{matrix}2\\-3.4\end{matrix}\right]+b =\left[\begin{matrix}2x_1^{(1)}-3.4x_2^{(1)}+b\\2x_1^{(2)}-3.4x_2^{(2)}+b\\\vdots\\2x_1^{(1000)}-3.4x_2^{(1000)}+b\end{matrix}\right]_{1000×1}=\left[\begin{matrix}y^{(1)}\\y^{(2)}\\\vdots\\y^{(1000)}\end{matrix}\right]_{1000×1}y=⟨X,w⟩+b=⎣⎢⎢⎢⎢⎡x1(1)x1(2)⋮x1(1000)x2(1)x2(2)⋮x2(1000)⎦⎥⎥⎥⎥⎤[2−3.4]+b=⎣⎢⎢⎢⎢⎡2x1(1)−3.4x2(1)+b2x1(2)−3.4x2(2)+b⋮2x1(1000)−3.4x2(1000)+b⎦⎥⎥⎥⎥⎤1000×1=⎣⎢⎢⎢⎡y(1)y(2)⋮y(1000)⎦⎥⎥⎥⎤1000×1
注意:返回的是 shape=(1000)\tt shape=(1000)shape=(1000) 的张量,需要进行 reshape(−1,1)\tt reshape(-1, 1)reshape(−1,1) -
y += torch.normal(0, 0.01, y.shape)
分别为 y{\bf y}y 中的每一项加入了 μ=0,σ=0.01\mu=0,\sigma=0.01μ=0,σ=0.01 的高斯白噪声
查看前十个数据集,每个样本包含一个二维 features\tt featuresfeatures:x(x1,x2){\bf x(x_1,x_2)}x(x1,x2) 和一个输出值 labels\tt labelslabels:
# 绘制散点图,进一步观察数据集,散点大小为 20,边界为黑色边界
plt.scatter(features[:, 0], labels, label = 'x1', s=20, edgecolor="black")
plt.scatter(features[:, 1], labels, label = 'x2', s=20, edgecolor="black")
"""
注意,有些版本需要从计算图上分离出来,并将tensor转换为numpy数组,才能绘图plt.scatter(features[:, 0].detach().numpy(), labels.detach().numpy(), label = 'x1')
plt.scatter(features[:, 1].detach().numpy(), labels.detach().numpy(), label = 'x2')
"""
plt.legend()
2.实现小批量随机抽样
def data_iter(batch_size, features, labels):num_examples = len(features)indices = list(range(num_examples))random.shuffle(indices)for i in range(0, num_examples, batch_size):batch_indices = torch.tensor(indices[i:min(i + batch_size, num_examples)])print('indices[{:},{:}]'.format(i, i + batch_size))yield features[batch_indices], labels[batch_indices]batch_size = 10 # 定义批量数大小
for X, y in data_iter(batch_size, features, labels):print(X, '\n', y)
batch_size = 10
定义批量数大小为 101010,则可以以 101010 个样本为一组,分成 100100100 组,再随机抽样
分析调用 data_iter(batch_size, features, labels)
:
传入参数 batch_size=10\tt batch\_size=10batch_size=10,即每次小批量梯度下降的批量数为 101010,features:(1000,2)\tt features:(1000,2)features:(1000,2),labels:(1000,1)\tt labels:(1000,1)labels:(1000,1)
num_examples = len(features)
统计样本数,样本数为 100010001000indices = list(range(num_examples))
生成从 000 到 999999999 的顺序整数列表random.shuffle(indices)
将数组indices
顺序随机打乱for i in range(0, num_examples, batch_size):
从 000 到 999999999 每隔 101010 步取一个 iii- 在
batch_indices = torch.tensor(indices[i:min(i + batch_size, num_examples)])
中:
indices[i:i + batch_size]
表示每次从乱序数组中取 101010 个作为一个小批量;
min(i + batch_size, num_examples)
是为了防止取数时超出乱序数组的右边界(这里似乎没必要);
torch.tensor
将每次得到的 101010 个随机数作为张量,如:tensor([96,731,147,654,2,341,455,214,203,81])\tt tensor([96, 731, 147, 654, 2, 341, 455, 214, 203, 81])tensor([96,731,147,654,2,341,455,214,203,81]) features[batch_indices], labels[batch_indices]
,用张量在features
和labels
中可以分别取到 101010 个样本yield
是 Python 的迭代器,是一种函数的返回值,每当函数运行到yield
关键字时,都会返回一组数据,保留函数运行节点并退出函数运行,在下次调用时,将从上一保留的节点继续运行函数,可以多次调用该函数,得到不同的返回值
利用 for
循环,会多次调用 data_iter()
函数,根据迭代器依次返回 100100100 组小批量样本,每个小批量为 101010,这里仅展示一组
3.初始化模型
def linreg(X, w, b): """线性回归模型"""return torch.matmul(X, w) + b# 给定模型的超参数(初始值)
w = torch.normal(0, 0.01, size=(2, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
4.定义损失函数和优化算法
损失函数:
def squared_loss(y_hat, y): """使用均方误差损失函数"""return (y_hat - y.reshape(y_hat.shape))**2 / 2
参数:y_hat\tt y\_haty_hat、y\tt yy 分别代表预测值 y^\hat yy^ 和真实值 yyy
y.reshape(y_hat.shape)
:虽然 y^\hat yy^ 和 yyy 可能都只是一个元素,但为了统一起见,将 yyy 统一形状- 这里不进行求和,即不考虑 1m∑i=1m{1 \over m}\sum_{i=1}^mm1∑i=1m
优化算法:
def sgd(params, lr): """小批量随机梯度下降"""with torch.no_grad():for param in params:param -= lr * param.gradparam.grad.zero_()
参数:params\tt paramsparams 代表一个包含 w{\bf w}w 和 bbb 的列表(即需要更新的参数),lr\tt lrlr 代表学习率
for param in params:
这里的运算将不放入计算图param -= lr * param.grad
即代表 wi=wi−∂∂wiJ(w1,w2,b)w_i = w_i-\frac{\partial }{\partial w_i}J(w_1,w_2,b)wi=wi−∂wi∂J(w1,w2,b)param.grad.zero_()
梯度清零,这样下一次计算梯度的时候就不会和上一次计算相关了
5.训练过程
lr = 0.03 # 学习率为 0.03
num_epochs = 3 # 训练次数为 3
net = linreg # net 引用 linreg
loss = squared_loss # loss 引用 squared_lossfor epoch in range(num_epochs): # 训练轮次for X, y in data_iter(batch_size, features, labels): # 当所有样本走完一次后,作为一次训练完成l = loss(net(X, w, b), y) # 计算小批量的损失(l.sum() / batch_size).backward() # 计算梯度sgd([w, b], lr) # 梯度下降,更新参数with torch.no_grad():train_l = loss(net(features, w, b), labels) # 每个 epoch 打印一次损失值print('epoch {:}, loss {:f}'.format(epoch + 1, float(train_l.mean())))
主函数解释:
net(X, w, b)
返回值为:
return=[x1(1)x2(1)x1(2)x2(2)⋮⋮x1(10)x2(10)][w1w2]+b=[w1x1(1)+w2x2(1)+bw1x1(2)+w2x2(2)+b⋮w1x1(10)+w2x2(10)+b]=[y^(1)y^(2)⋮y^(10)]{\tt return} =\left[\begin{matrix}x_1^{(1)}&x_2^{(1)}\\x_1^{(2)}&x_2^{(2)}\\\vdots&\vdots\\x_1^{(10)}&x_2^{(10)}\end{matrix}\right] \left[\begin{matrix}w_1\\w_2\end{matrix}\right]+b =\left[\begin{matrix}w_1x_1^{(1)}+w_2x_2^{(1)}+b\\w_1x_1^{(2)}+w_2x_2^{(2)}+b\\\vdots\\w_1x_1^{(10)}+w_2x_2^{(10)}+b\end{matrix}\right] =\left[\begin{matrix}\hat y^{(1)}\\\hat y^{(2)}\\\vdots\\\hat y^{(10)}\end{matrix}\right]return=⎣⎢⎢⎢⎢⎡x1(1)x1(2)⋮x1(10)x2(1)x2(2)⋮x2(10)⎦⎥⎥⎥⎥⎤[w1w2]+b=⎣⎢⎢⎢⎢⎡w1x1(1)+w2x2(1)+bw1x1(2)+w2x2(2)+b⋮w1x1(10)+w2x2(10)+b⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎡y^(1)y^(2)⋮y^(10)⎦⎥⎥⎥⎤
l = loss(net(X, w, b), y)
的返回值为:
return=12([y^(1)y^(2)⋮y^(10)]−[y(1)y(2)⋮y(10)])2=[loss(1)loss(2)⋮loss(10)]{\tt return} ={1 \over 2}\left(\left[\begin{matrix}\hat y^{(1)}\\\hat y^{(2)}\\\vdots\\\hat y^{(10)}\end{matrix}\right]- \left[\begin{matrix}y^{(1)}\\y^{(2)}\\\vdots\\y^{(10)}\end{matrix}\right]\right)^2 =\left[\begin{matrix}loss^{(1)}\\loss^{(2)}\\\vdots\\loss^{(10)}\end{matrix}\right]return=21⎝⎜⎜⎜⎛⎣⎢⎢⎢⎡y^(1)y^(2)⋮y^(10)⎦⎥⎥⎥⎤−⎣⎢⎢⎢⎡y(1)y(2)⋮y(10)⎦⎥⎥⎥⎤⎠⎟⎟⎟⎞2=⎣⎢⎢⎢⎡loss(1)loss(2)⋮loss(10)⎦⎥⎥⎥⎤
由于 J(w)=12×10∑j=110(y(j)^−y(j))2J({\bf w})={1 \over 2×10}\sum_{j=1}^{10}(\hat {y^{(j)}}-y^{(j)})^2J(w)=2×101∑j=110(y(j)^−y(j))2,而这里是样本各自的损失,因此下一步需要先求和,除以 batch_size\tt batch\_sizebatch_size,再求梯度
(l.sum() / batch_size).backward()
进行的操作是:
J(w)=([loss(1)loss(2)⋮loss(10)].sum())1batch_size=12×10∑j=110(y(j)^−y(j))2J({\bf w})=\left(\left[\begin{matrix}loss^{(1)}\\loss^{(2)}\\\vdots\\loss^{(10)}\end{matrix}\right]{\tt .sum()}\right){1 \over {\tt batch\_size}}={1 \over 2×10}\sum_{j=1}^{10}(\hat {y^{(j)}}-y^{(j)})^2J(w)=⎝⎜⎜⎜⎛⎣⎢⎢⎢⎡loss(1)loss(2)⋮loss(10)⎦⎥⎥⎥⎤.sum()⎠⎟⎟⎟⎞batch_size1=2×101j=1∑10(y(j)^−y(j))2
J(w).backward()⟹∂J(w)∂wi=[∂J(w)∂w1∂J(w)∂w2∂J(w)∂b]J({\bf w}){\tt .backward()}\implies\frac{\partial J({\bf w})}{\partial w_i} =\left[\begin{matrix}\frac{\partial J({\bf w})}{\partial w_1}\\\frac{\partial J({\bf w})}{\partial w_2}\\\frac{\partial J({\bf w})}{\partial b}\end{matrix}\right]J(w).backward()⟹∂wi∂J(w)=⎣⎢⎡∂w1∂J(w)∂w2∂J(w)∂b∂J(w)⎦⎥⎤
sgd([w, b], lr)
则实现了参数的更新
训练效果:
print('w的估计误差: {:}'.format(true_w - w.reshape(true_w.shape)))
print('b的估计误差: {:}'.format(true_b - b))
发现 w1w_1w1、w2w_2w2 误差分别为 −0.0002-0.0002−0.0002、0.00020.00020.0002,bbb 的误差为 0.00020.00020.0002,误差较小
四、利用PyTorch函数简洁实现线性回归
1.PyTorch数据集处理模块
导入所需的库:
import torch.utils as data # 包含一些数据处理的模块
train_ids = data.TensorDataset(tuple) 将 数据data 和 标签label 张量进行打包,打包后通过
DataLoader()
函数获取数据
data=[x1(1)x2(1)⋯xn(1)x1(2)x2(2)⋯xn(2)⋮⋮⋱⋮x1(i)x2(i)⋯xn(i)]i×n,label=[y(1)y(2)⋮y(i)]{\tt data}= \left[\begin{matrix}x_1^{(1)}&x_2^{(1)}&\cdots&x_n^{(1)}\\ x_1^{(2)}&x_2^{(2)}&\cdots&x_n^{(2)}\\ \vdots&\vdots&\ddots&\vdots\\ x_1^{(i)}&x_2^{(i)}&\cdots&x_n^{(i)}\end{matrix}\right]_{i×n}, {\tt label}= \left[\begin{matrix}y^{(1)}\\y^{(2)}\\\vdots\\y^{(i)}\end{matrix}\right]data=⎣⎢⎢⎢⎢⎡x1(1)x1(2)⋮x1(i)x2(1)x2(2)⋮x2(i)⋯⋯⋱⋯xn(1)xn(2)⋮xn(i)⎦⎥⎥⎥⎥⎤i×n,label=⎣⎢⎢⎢⎡y(1)y(2)⋮y(i)⎦⎥⎥⎥⎤
在维度上,data{\tt data}data 的样本数 iii 必须与 label{\tt label}label 的个数对应
data_iter = data.DataLoader(dataset=train_ids, batch_size, shuffle=False) 可以每次随机读取时取batch_size
个小批量数据
train_ids
从TensorDataset()
函数中返回的对象
batch_size
每次获取数据样本时的批量数
shuffle
决定是否打乱数据集,default=False
next(iter(data_iter)) 访问下一个批量
例如:
import torch.utils.data as data
import torchtrain_data = torch.tensor([[1, 1, 1],[2, 2, 2],[3, 3, 3],[4, 4, 4],[5, 5, 5],[6, 6, 6]])
train_label = torch.tensor([100, 200, 300, 400, 500, 600])# 打包数据集
train_ids = data.TensorDataset(train_data, train_label)
# 返回的对象可通过切片来查看
print(train_ids[0:3])
print('=' * 100)
# 也可循环读取数据
for train_data, train_label in train_ids:print(train_data, train_label)
print('=' * 100)# DataLoader 获取数据
data_iter = data.DataLoader(dataset = train_ids, batch_size = 2, shuffle = True)
# 通过调用 next(iter()) 可以获取下一个批量
next(iter(data_iter))
2.实现流程
导入所需的库:
import numpy as np
import torch
import torch.utils as data # 包含一些数据处理的模块
仍然以相同的方法生成一个人工数据集:
def synthetic_data(w, b, num_examples): """生成 y = xw + b + 噪声"""X = torch.normal(0, 1, (num_examples, len(w))) # 生成服从 μ=0,σ=1 正态分布的随机值y = torch.matmul(X, w) + by += torch.normal(0, 0.01, y.shape)return X, y.reshape((-1, 1))true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
通过 torch.utils.data\tt torch.utils.datatorch.utils.data 模块处理数据集
def load_array(data_arrays, batch_size, shuffle=True): """构造一个PyTorch数据迭代器"""dataset = data.TensorDataset(*data_arrays) # *data_arrays 解包return data.DataLoader(dataset, batch_size, shuffle = shuffle)batch_size = 10
data_iter = load_array((features, labels), batch_size)
下面我们将使用 PyTorch 的神经网络 (Neural Network-NN) 库:torch.nn\tt torch.nntorch.nn,我们以后再着重介绍这个库
# 导入相关库
import torch.nn as nn
# nn.Linear() 指的是线性层(全连接层),两个参数分别是输入节点个数和输出节点个数
# nn.Sequential() 是一个容器,可以将一系列操作进行打包,方便复用
net = nn.Sequential(nn.Linear(2, 1))# 初始化模型参数,weight 表示权重,bias 表示偏差
# net[0] 表示容器中的第一个操作
net[0].weight.data.normal_(0, 0.01) # 使用正态分布 normal_() 原地替换
net[0].bias.data.fill_(0) # 用全零原地替换 fill_(0)
定义代价函数,使用均方误差代价函数,定义优化算法:
loss = nn.MSELoss() # 均方误差代价函数# 优化算法使用批量梯度下降,学习率为 0.03
# net.parameters() 获取容器中的所有参数
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
开始训练模型:
num_epochs = 3 # 训练次数为 3
for epoch in range(num_epochs):for X, y in data_iter:l = loss(net(X), y)trainer.zero_grad()l.backward()trainer.step()l = loss(net(features), labels)print('epoch {}, loss {l:f}'.format(epoch + 1))
查看误差:
w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)
参考资料:
[1]Search 动手学深度学习课程
[2]机器学习-第二章:回归.pdf,黄海广
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- AS(Android Studio)编辑区颜色的设置
先来个设置效果图,看看是不是你们想要设置的地方的哈(其他颜色的网上的太多了,我这里贴一丢丢其他视图的颜色,都可以去这个general里试试) 1、当前编辑文件Tab中的文字颜色和背景颜色 2、当前行的行数字颜色 其他行的…...
2024/4/28 21:10:31 - 设计模式---工厂模式
1.工厂模式(Factory pattern) 工厂模式顾名思义就是生产产品的工厂,用于生产接口方法. 举个例子: 发动机工厂 制造发动机 不同的厂家 根据这个发动机 做出来的不同的车 发动机工厂: 接口类 发动机: 方法 厂家: 开发者 车: 实现的功能 …...
2024/4/28 22:13:23 - Linux之认识与分析登录档(二)
温故: 知新: 前面的内容中已经讲到过我们的系统都是systemd所管理的,因此由systemd所启动的服务中,在系统的启动或者结束的过程中发生的问题讯息或者是正常的讯息都会由systemd-journal.service记录下来,不过因为syste…...
2024/4/28 17:46:14 - Java基础知识
JAVA基础01:注释 Java中三种注释(书写注释是一种好的习惯) 单行注释 (//)多行注释 (/* 文字 */)文档注释 public class HelloWord {public static void main(String[] args) {//输出一个Hello,Word!System.out.println("Hello,Word&q…...
2024/4/20 14:08:50 - origin使用python进行方程拟合--案例
origin使用python进行方程拟合–案例 1.1 软件版本要求 origin2020a以上python 3.8以上 1.2 说明 本文主要是为方便实验室数据拟合。由于origin在实验的使用率远高于python等编程语言,因此通过本文给出在origin中使用python脚本完成一个简单函数的拟合。案例中拟…...
2024/4/28 8:10:50 - Android Keyguard 亮灭屏流程分析
文章目录概述Keyguard 关键文件Power 灭屏超时灭屏Power 亮屏FAQ亮屏慢概述 Keyguard 锁屏的加载是在灭屏的时候加载,当屏幕点亮时,用户可以第一时间看到锁屏界面。 PowerManagerService(PMS) 中定义了四种屏幕状态:…...
2024/4/28 8:17:10 - 一段程序说明不同调用约定的区别
x86 程序的调用约定很多,常用调用约定由:cdecl, stdcall, fastcall。 x86-64 程序的调用约定只有两种:Microsoft x64 calling convention, System V AMD64 ABI。 x86 程序的调用约定 编译方法 64位平台编译32位汇编的方法如下 gcc -m32 -…...
2024/4/28 14:46:08 - CSS3.0学习笔记+总结(1)
属性 1.盒子阴影 box-shadow:水平偏移 垂直偏移 模糊程度 模糊大小 颜色 inset(盒子内) ps:这里注意水平偏移和垂直偏移可以给负数,其他属性值不可以。 2、文本阴影 text-shadow:水平偏移 垂直偏移 模糊程度 颜色 ps…...
2024/4/28 4:36:37 - webpack实战五--补充内容(less篇)
前面的导入引用操作一样,只是我们使用less的时候,需要安装新的loader,也就是less、less-loader,命令如下: npm i -D less less-loader less和less-loader都需要安装,但需要注意的是,在使用时&am…...
2024/4/28 21:55:57 - AIOT+互联网金寨茶产业区块链试点项目 Api接口文档
Api接口文档 1.1接口文档说明 接口基准地址: http://teaapi.wtycms.cn/服务端已开启 CORS 跨域支持 API 认证统一使用 Token 认证 需要授权的 API ,必须在请求头中传递token字段提供 token 令牌 1.2登录验证接口 请求路径:login 请求参…...
2024/4/28 1:00:54 - 如何加密Shell脚本
如何在Linux环境中加密shell脚本?shell脚本包含密码,不希望其他具有执行权限的人查看shell脚本并获取密码。可以安装使用shc工具,普通用户无法读取shc创建的加密Shell脚本。SHC是指:Shell脚本编译器(Shell Script Compiler)。 环境…...
2024/4/28 15:04:43 - MFC之进度条CProgressCtrl
转自https://www.cnblogs.com/huhu0013/p/4434031.html 一、成员函数简介 1、create() 针对不是通过资源文件上拖拉进度条控件生成的进度条,需要用此函数创建一个。 2、SetRange() 设置进度条的起始值和终止值。 3、SetPos() 设置进度条的当前位置。 4、OffSetPos() 移动进度条…...
2024/4/20 9:07:02 - 计组-#3存储系统-3.2存储器的层次化结构
一张图解释...
2024/4/23 21:16:10 - 【大话设计模式】之 策略+工程模式
对比【工厂模式】和【策略模式】 工厂 一个属于创建型的设计模式,主要用来针对不同类型创建不同对象,达到类解耦。策略 一个类的行为或算法可以在运行时更改。属于行为型的设计模式,主要用来针对不同情况执行不同算法,达到行为解…...
2024/4/27 0:19:26 - 矩阵树定理
矩阵树定理是一个计数定理,常用于解决无向联通图的生成树计数问题。 若连通图G的邻接矩阵为A,将A的对角线(i,i)元素依次换为节点i的度,其余元素(i,j) (j!i) 取Aij的相反数,所得矩阵记为M,则M的每个代数余子式相等&…...
2024/4/27 4:39:19 - centos6如何添加阿里云centos和epel源
1.背景:centos6正常情况下添加这两个源在生成缓存和装包的时候会报错,因为源已经被移走了,报错信息和原因如下: root7ea0ba50d2c1 yum.repos.d]# yum makecache fast Loaded plugins: fastestmirror, ovl Loading mirror speeds from cache…...
2024/4/25 20:38:15 - Ant的使用简介
Ant的使用简介 1、Ant简介 ApacheAnt是一个基于Java的构建工具。是一个将软件编译、测试、部署等步骤想结合并加以自动化的一个工具,大多用于Java环境中的软件开发。目前主要的Java ide都带有Ant,产品如Eclipse、NetBeans和IntelliJ IDEA。 理论上&…...
2024/4/20 2:07:22 - python绘制TSP官方实例
git: https://github.com/cugcuiyc/tsp-plotter 适配GA-EAX获得的最优解: TSP官方实例: 需要以上两个文件,即可自动生成所有最优解对应的图片:...
2024/4/25 13:11:54 - 友盟登陆
1:去友盟下载jar和相关文件2:导入工程3:配置信息 注意代码这里配置的回调地址需要和微博开放平台授权回调页保持一致 PlatformConfig.setWeixin("wxa7a60fb129dce8a2", "595ec15ae27a4d208292605d53de74cf"); 清单文件配置:友盟的appkey等和微信的回调…...
2024/4/15 5:17:49 - 26.C语言 数据结构二 : 栈
先进后出 后进先出 #include <stdio.h> #include <stdlib.h>#define SIZE 10typedef struct Student{int id;char *name; }Data;//定义栈结构 typedef struct stack{Data data[SIZE];//栈数据int top; //栈顶}SeqStack;SeqStack *init(){SeqStack *p;if(p …...
2024/4/27 2:40:23
最新文章
- Kafka报错ERROR Exiting Kafka due to fatal exception during startup
报错: ERROR Exiting Kafka due to fatal exception during startup. (kafka.Kafka$) kafka.common.InconsistentClusterIdException: The Cluster ID FSzSO50oTLCRhRnRylihcg doesnt match stored clusterId Some(0oSLohwtQZWbIi73YUMs8g) in meta.properties. Th…...
2024/4/28 22:50:51 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 贪心算法|1005.K次取反后最大化的数组和
力扣题目链接 class Solution { static bool cmp(int a, int b) {return abs(a) > abs(b); } public:int largestSumAfterKNegations(vector<int>& A, int K) {sort(A.begin(), A.end(), cmp); // 第一步for (int i 0; i < A.size(); i) { // 第二步if…...
2024/4/27 8:53:09 - c++类的继承方式
在 C 中,类的继承方式有三种:公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。这些继承方式决定了派生类对基类成员的访问权限。 …...
2024/4/28 2:41:43 - CSS使用JS变量
1. CSS变量 CSS 变量(也称为自定义属性)允许我们在 CSS 中定义可重复使用的值,并将其应用于不同的选择器。为了创建一个 CSS 变量,我们需要使用 -- 前缀,然后可以像常规属性一样使用它。 :root {--primary-color: bl…...
2024/4/25 22:56:55 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/28 13:52:11 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/28 3:28:32 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/28 13:51:37 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/28 15:57:13 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/28 1:22:35 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57