03-Linear Regression

news2024/11/25 6:50:42

什么是回归算法

  • 回归算法是一种有监督算法
  • 回归算法是一种比较常用的机器学习算法,用来建立“解释”变量(自变量X)和观测值 (因变量Y)之间的关系; 从机器学习的角度来讲,用于构建一个**算法模型(函数)**来做属性 ( X ) (X) (X) 与标签 ( Y ) (Y) (Y) 之间的映射关系,在算法的学习过程中,试图寻找一个函数 h : R d − > R h: R^d->R h:Rd>R 使得参数之间的关系拟合性最好。
  • 回归算法中算法(函数)的最终结果是一个连续的数据值,输入值(属性值)是一个d维度的属性/数值向量

线性回归

给定由 d d d 个属性描述的示例 x = ( x 1 ; x 2 ; … ; x d ) \boldsymbol{x}=\left(x_1 ; x_2 ; \ldots ; x_d\right) x=(x1;x2;;xd), 其中 x i x_i xi x \boldsymbol{x} x 在第 i i i 个属性上的取值, 线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数, 即
f ( x ) = θ 1 x 1 + θ 2 x 2 + … + θ d x d + b f(\boldsymbol{x})=\theta_1 x_1+\theta_2 x_2+\ldots+\theta_d x_d+b f(x)=θ1x1+θ2x2++θdxd+b

一般用向量形式写成(为提高可读性, 我们通常用 θ 0 \theta_0 θ0代替b)
f ( x ) = θ T x f(\boldsymbol{x})=\boldsymbol{\theta}^{\mathrm{T}} \boldsymbol{x} f(x)=θTx

其中 θ T = ( θ 0 ; θ 1 ; θ 2 ; … ; θ d ; ) \boldsymbol{\theta^T}=\left(\theta_0;\theta_1 ; \theta_2 ; \ldots ; \theta_d;\right) θT=(θ0;θ1;θ2;;θd;), 当我们把 θ 0 \theta_0 θ0加入到 θ T \theta^T θT之后,我们也需要在特征矩阵上新开一个全为1的列, 用于与 θ 0 ( 即截距项 b ) \theta_0(即截距项b) θ0(即截距项b)结合。于是 x = ( 1 ; x 1 ; x 2 ; … ; x d ) \boldsymbol{x}=\left(1;x_1 ; x_2 ; \ldots ; x_d\right) x=(1;x1;x2;;xd)。当 θ \theta θ 学得之后, 模型就得以确定。

线性回归的目的是通过拟合一个线性模型来预测一个因变量(或称为目标变量)与一个或多个自变量(或称为特征)之间的关系。它的目标是找到最佳的超平面(也称为回归线),使得拟合的模型能够最好地捕捉因变量与自变量之间的线性关系。

具体来说,线性回归通过最小化实际观测值与回归线预测值之间的残差(误差)来确定最佳拟合线。这意味着它试图使训练集中的样本与回归线之间的残差最小化。

线性回归最终的要求是计算得出θ(包含截距项b)的值, 并选择最优的θ构成算法公式

线性模型形式简单、易于建模, 但却蕴含着机器学习中一些重要的基本思想。许多功能更为强大的非线性模型(nonlinear model)刻在线性模型的基础上通过引入层级结构或高维映射而得。此外, 由于 θ \theta θ直观表达了个属性在预测中的重要性, 因此线性模型有很好的可解释性(comprehensibility)。

线性回归:

  • 优点:结果易于理解, 计算上不复杂。
  • 缺点:对非线性的数据拟合不好。
  • 适用数据类型:数值型和标称型数据。

一元回归 y = a x + b y=ax+b y=ax+b
 房屋面积  ( m ∧ 2 )  租赁价格(1000  ¥ ) 10 0.8 15 1 20 1.8 30 2 50 3.2 60 3 60 3.1 70 3.5 \begin{array}{ll} \hline \text { 房屋面积 }\left(\mathbf{m}^{\wedge} 2\right) & \text { 租赁价格(1000 } ¥) \\ \hline 10 & 0.8 \\ 15 & 1 \\ 20 & 1.8 \\ 30 & 2 \\ 50 & 3.2 \\ 60 & 3 \\ 60 & 3.1 \\ 70 & 3.5 \end{array}  房屋面积 (m2)1015203050606070 租赁价格(1000 ¥)0.811.823.233.13.5
在这里插入图片描述

斜率 a 和截距 b 是由有监督学习的算法学到的参数,所以我们称之为学习参数

多元回归 h ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 h(x)=\theta_0+\theta_1x_1+\theta_2x_2 h(x)=θ0+θ1x1+θ2x2
 房屋面积   房间数量   租赁价格  10 1 0.8 15 1 1.0 20 1 1.8 30 1 2.0 50 2 3.2 60 1 3.0 60 2 3.1 70 2 3.5 … … … … … … . \begin{array}{lll} \text { 房屋面积 } & \text { 房间数量 } & \text { 租赁价格 } \\ \hline 10 & 1 & 0.8 \\ 15 & 1 & 1.0 \\ 20 & 1 & 1.8 \\ 30 & 1 & 2.0 \\ 50 & 2 & 3.2 \\ 60 & 1 & 3.0 \\ 60 & 2 & 3.1 \\ 70 & 2 & 3.5 \\ \ldots \ldots & \ldots \ldots & \ldots \ldots . \end{array}  房屋面积 1015203050606070…… 房间数量 11112122…… 租赁价格 0.81.01.82.03.23.03.13.5…….
在这里插入图片描述

h θ ( x ) = θ 0 + θ 1 x 1 + ⋯ + θ n x n = θ 0 1 + θ 1 x 1 + ⋯ + θ n x n = θ 0 x 0 + θ 1 x 1 + ⋯ + θ n x n = ∑ i = 0 n θ i x i = θ T x \begin{aligned} h_\theta(x)& \begin{aligned}=\theta_0+\theta_1x_1+\cdots+\theta_nx_n\end{aligned} \\ &=\theta_01+\theta_1x_1+\cdots+\theta_nx_n \\ &=\theta_0x_0+\theta_1x_1+\cdots+\theta_nx_n \\ &=\sum_{i=0}^n\theta_ix_i=\theta^Tx \\ \end{aligned} hθ(x)=θ0+θ1x1++θnxn=θ01+θ1x1++θnxn=θ0x0+θ1x1++θnxn=i=0nθixi=θTx

最终要求是计算出 θ \theta θ的值,并选择最优的 θ \theta θ值构成算法公式

  • 基本假设:我们认为数据中存在线性关系,也就是特征属性X和目标属性Y之间的关系是满足线性关系。
  • 在线性回归算法中,找出的模型对象是期望所有训练数据比较均匀的分布在直线或者平面的两侧。
  • 在线性回归中,最优模型也就是所有样本(训练数据)离模型的直线或者平面距离之和最小。

线性回归算法一般使用一个及以上的特征变量创建模型, 其中独立的特征变量只有一个时的线性回归就叫作一元回归

独立特征变量为两个及以上时的线性回归叫做多元回归。另外, 尽管独立特征变量只有一个, 但如果包含 x 2 、 x 3 x^2、x^3 x2x3这种特征变量的次方项的线性回归就叫做多项式回归 。表1-1列出了一元回归、多元回归、多项式回归的例子, 图1-2展示了与这些例子相应的图形。多项式回归对于特征变量 x i x_i xi来说不是线性的, 所以把它称之为“线性”回归可能让人觉得不太合适。

但是, 是否是线性回归并不是从特征变量上来看的。而是从学习参数(在这个例子中是 x 1 2 x_1^2 x12 x 1 x_1 x1的系数)的角度来看是线性的回归(我们可以把目标属性值与学习参数、特征变量的关系的看作 y = θ T X y=\theta^TX y=θTX向量化的形式;其中 θ \theta θ是参数向量, X是特征矩阵), 所以我们才统一称之为线性回归, 所以多项式回归也属于线性回归。

表1-1:各种线性回归的例子
 线性回归的种类   示  例   一元回归  y = w 0 + w 1 x 1  多元回归  y = w 0 + w 1 x 1 + w 2 x 2  多项式回归  y = w 0 + w 1 x 1 + w 2 x 1 2 \begin{array}{c|c} \hline \text { 线性回归的种类 } & \text { 示 } \text { 例 } \\ \hline \text { 一元回归 } & y=w_0+w_1 x_1 \\ \hline \text { 多元回归 } & y=w_0+w_1 x_1+w_2 x_2 \\ \hline \text { 多项式回归 } & y=w_0+w_1 x_1+w_2 x_1^2 \end{array}  线性回归的种类  一元回归  多元回归  多项式回归     y=w0+w1x1y=w0+w1x1+w2x2y=w0+w1x1+w2x12
图1-2:各种线性回归的例子

在这里插入图片描述

下面再看一下非线性回归的例子。图 1-3 是 y = e w 1 x 1 y=\mathrm{e}^{w_1 x_1} y=ew1x1 y = 1 / ( w 1 x 1 + 1 ) y=1 /\left(w_1 x_1+1\right) y=1/(w1x1+1) 的图形。这些函数中的学习参数 w 1 w_1 w1 和目标变量 y y y 之间的关系不是线性关系(它们无法用 y = θ T X y=\theta^TX y=θTX这种向量化的形式表示),所以被分类为非线性回归。

图1-3:非线性回归的例子

在这里插入图片描述
算法中根据训练数据计算使损失最小的参数的做法是有监督学习算法的共同之处

最小二乘

也就是说我们线性回归模型最优的时候是所有样本的预测值和实际值之间的差值最小化,由于预测值和实际值之间的差值存在正负性,所以要求平方后的值最小化。也就是可以得到如下的一个目标函数:
J ( θ ) = 1 2 ∑ i = 1 m ( ε ( i ) ) 2 = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(\varepsilon^{(i)}\right)^2=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2 J(θ)=21i=1m(ε(i))2=21i=1m(hθ(x(i))y(i))2

回归算法理性认识

  • 房价的预测
     房屋面积  ( m ∧ 2 )  租赁价格(1000  ¥ ) 10 0.8 15 1 20 1.8 30 2 50 3.2 60 3 60 3.1 70 3.5 \begin{array}{ll} \text { 房屋面积 }\left(\mathbf{m}^{\wedge} \mathbf{2}\right) & \text { 租赁价格(1000 } ¥) \\ 10 & 0.8 \\ 15 & 1 \\ 20 & 1.8 \\ 30 & 2 \\ 50 & 3.2 \\ 60 & 3 \\ 60 & 3.1 \\ 70 & 3.5 \end{array}  房屋面积 (m2)1015203050606070 租赁价格(1000 ¥)0.811.823.233.13.5

线性回归、最大似然估计及二乘法

y ( i ) = θ T x ( i ) + ε ( i ) y^{(i)}=\theta^T x^{(i)}+\varepsilon^{(i)} y(i)=θTx(i)+ε(i)

  • 误差 ε ( i ) ( 1 ≤ i ≤ n ) \varepsilon^{(\mathrm{i})}(1 \leq i \leq n) ε(i)(1in)独立同分布的,服从均值为 0 ,方差为某定值 σ 2 \sigma^2 σ2高斯分布
    • 原因:中心极限定理
  • 实际问题中,很多随机现象可以看做众多因素的独立影响的综合反应,并且这些随机现象往往都服从正态分布

似然函数

y ( i ) = θ T x ( i ) + ε ( i ) p ( ε ( i ) ) = 1 σ 2 π e ( − ( ε ( i ) ) 2 2 σ 2 ) p ( y ( i ) ∣ x ( i ) ; θ ) = 1 σ 2 π exp ⁡ ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) L ( θ ) = ∏ i = 1 m p ( y ( i ) ∣ x ( i ) ; θ )                                    = ∏ i = 1 m 1 σ 2 π exp ⁡ ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) \begin{gathered} y^{(i)}=\theta^T x^{(i)}+\varepsilon^{(i)}\\ p\left(\varepsilon^{(i)}\right)=\frac{1}{\sigma \sqrt{2 \pi}} e^{\left(-\frac{\left(\varepsilon^{(i)}\right)^2}{2 \sigma^2}\right)} \\ p\left(y^{(i)} \mid x^{(i)} ; \theta\right)=\frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{\left(y^{(i)}-\theta^T x^{(i)}\right)^2}{2 \sigma^2}\right) \\ L(\theta)=\prod_{i=1}^m p\left(y^{(i)} \mid x^{(i)} ; \theta\right) \\ \quad\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\prod_{i=1}^m \frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{\left(y^{(i)}-\theta^T x^{(i)}\right)^2}{2 \sigma^2}\right) \end{gathered} y(i)=θTx(i)+ε(i)p(ε(i))=σ2π 1e(2σ2(ε(i))2)p(y(i)x(i);θ)=σ2π 1exp(2σ2(y(i)θTx(i))2)L(θ)=i=1mp(y(i)x(i);θ)                                  =i=1mσ2π 1exp(2σ2(y(i)θTx(i))2)

对数似然、目标函数及最小二乘

ℓ ( θ ) = ln ⁡ L ( θ ) = ln ⁡ ∏ i = 1 m 1 σ 2 π exp ⁡ ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = ∑ i = 1 m ln ⁡ 1 σ 2 π exp ⁡ ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = m ln ⁡ 1 σ 2 π − 1 σ 2 ∙ 1 2 ∑ i = 1 m ( y ( i ) − θ T x ( i ) ) 2 l o s s ( y j , y ^ j ) = J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 \begin{aligned} &\ell\left(\theta\right)=\ln L\left(\theta\right) \\ &=\ln\prod_{i=1}^m\frac1{\sigma\sqrt{2\pi}}\exp\left(-\frac{\left(y^{(i)}-\theta^Tx^{(i)}\right)^2}{2\sigma^2}\right) \\ &=\sum_{i=1}^m\ln\frac1{\sigma\sqrt{2\pi}}\exp\left(-\frac{\left(y^{(i)}-\theta^Tx^{(i)}\right)^2}{2\sigma^2}\right) \\ &=m\ln\frac1{\sigma\sqrt{2\pi}}-\frac1{\sigma^2}\bullet\frac12\sum_{i=1}^m\left(y^{(i)}-\theta^Tx^{(i)}\right)^2 \\ \\ &loss(y_j,\widehat{y}_j)=J\big(\theta\big){=}\frac{1}{2}\sum_{i=1}^{m}\big(h_{\theta}\big(x^{(i)}\big){-}y^{(i)}\big)^2 \end{aligned} (θ)=lnL(θ)=lni=1mσ2π 1exp(2σ2(y(i)θTx(i))2)=i=1mlnσ2π 1exp(2σ2(y(i)θTx(i))2)=mlnσ2π 1σ2121i=1m(y(i)θTx(i))2loss(yj,y j)=J(θ)=21i=1m(hθ(x(i))y(i))2

θ \theta θ的求解过程——最小二乘法

J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 2 ( X θ − Y ) T ( X θ − Y ) → min ⁡ θ J ( θ ) ∇ θ J ( θ ) = ∇ θ ( 1 2 ( X θ − Y ) T ( X θ − Y ) ) = ∇ θ ( 1 2 ( θ T X T − Y T ) ( X θ − Y ) ) = ∇ θ ( 1 2 ( θ T X T X θ − θ T X T Y − Y T X θ + Y T Y ) ) = 1 2 ( 2 X T X θ − X T Y − ( Y T X ) T ) = X T X θ − X T Y θ = ( X T X ) − 1 X T Y \begin{aligned} & J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2=\frac{1}{2}(X \theta-Y)^T(X \theta-Y) \rightarrow \min _\theta J(\theta) \\ & \begin{aligned} \nabla_\theta J(\theta) & =\nabla_\theta\left(\frac{1}{2}(X \theta-Y)^T(X \theta-Y)\right)=\nabla_\theta\left(\frac{1}{2}\left(\theta^T X^T-Y^T\right)(X \theta-Y)\right) \\ & =\nabla_\theta\left(\frac{1}{2}\left(\theta^T X^T X \theta-\theta^T X^T Y-Y^T X \theta+Y^T Y\right)\right) \\ & =\frac{1}{2}\left(2 X^T X \theta-X^T Y-\left(Y^T X\right)^T\right) \\ & =X^T X \theta-X^T Y \\ \theta= & \left(X^T X\right)^{-1} X^T Y \end{aligned} \end{aligned} J(θ)=21i=1m(hθ(x(i))y(i))2=21(Y)T(Y)θminJ(θ)θJ(θ)θ==θ(21(Y)T(Y))=θ(21(θTXTYT)(Y))=θ(21(θTXTθTXTYYT+YTY))=21(2XTXTY(YTX)T)=XTXTY(XTX)1XTY

最小二乘法的参数最优解

  • 参数解析式
    θ = ( X T X ) − 1 X T Y \theta=\left(X^T X\right)^{-1} X^T Y θ=(XTX)1XTY
  • 最小二乘法的使用要求矩阵 X T X X^T X XTX可逆的;为了防止不可逆或者过拟合的问题存在,可以增加额外数据影响,导致最终的矩阵是可逆的:
    θ = ( X T X + λ I ) − 1 X T y \theta=\left(X^T X+\lambda I\right)^{-1} X^T y θ=(XTX+λI)1XTy
  • 最小二乘法直接求解的难点:矩阵逆的求解是一个难处

目标函数(loss / cost function)

表示误差和学习参数之间关系的函数叫作误差函数(或损失函数)

  • 0-1损失函数 J ( θ ) = { 1 , Y ≠ f ( X ) 0 , Y = f ( X ) J(\theta)=\left\{\begin{array}{l}1, Y \neq f(X) \\ 0, Y=f(X)\end{array}\right. J(θ)={1,Y=f(X)0,Y=f(X)
  • 感知器损失函数 J ( θ ) = { 1 , ∣ Y − f ( X ) ∣ > t 0 , ∣ Y − f ( X ) ∣ ≤ t J(\theta)=\left\{\begin{array}{l}1,|Y-f(X)|>t \\ 0,|Y-f(X)| \leq t\end{array}\right. J(θ)={1,Yf(X)>t0,Yf(X)t
  • 平方和损失函数 J ( θ ) = ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2 J(θ)=i=1m(hθ(x(i))y(i))2
  • 绝对值损失函数 J ( θ ) = ∑ i = 1 m ∣ h θ ( x ( i ) ) − y ( i ) ∣ J(\theta)=\sum_{i=1}^m\left|h_\theta\left(x^{(i)}\right)-y^{(i)}\right| J(θ)=i=1m hθ(x(i))y(i)
  • 对数损失函数 J ( θ ) = − ∑ i = 1 m ( y ( i ) log ⁡ h θ ( x ( i ) ) ) J(\theta)=-\sum_{i=1}^m\left(y^{(i)} \log h_\theta\left(x^{(i)}\right)\right) J(θ)=i=1m(y(i)loghθ(x(i)))

在线性回归中, 我们一般使用平方和损失函数, 即均方误差MSE

在这里插入图片描述

模型函数(将一个向量x映射为一个目标值y_hat)

y ^ = θ T ⋅ x \hat{y}=\theta^T\cdot x y^=θTx

线性回归中我们目前的目标函数是最小二乘法所对应的误差函数, 在目标函数中我们的未知数是θ, 而在模型函数中, 它其实已经构建了一个模型、已经训练出了模型, 同理我们就已经得出了模型的参数, 所以模型函数所要做的事情就是将我们的样本x映射为它所对应的目标值, 而模型函数中的x对应的就是待预测的新样本, 所以对于模型函数来说, 它所对应的未知数就是x。

多项式拓展–对特征进行升维

多项式拓展(Polynomial Expansion) 的根本目的是通过创建原始特征的高阶组合,来扩展特征空间,从而增强机器学习模型的表达能力。它可以用于线性模型和非线性模型,目的是引入更多的特征信息,以更好地捕获输入特征之间的非线性关系。

多项式拓展通过将原始特征进行组合,生成新的特征。例如,对于一个二维特征 ( x 1 , x 2 ) (x_1, x_2) (x1,x2),多项式拓展可以生成包括原始特征和其组合的新特征,如 ( 1 , x 1 , x 2 , x 1 2 , x 1 x 2 , x 2 2 ) (1, x_1, x_2, x_1^2, x_1x_2, x_2^2) (1,x1,x2,x12,x1x2,x22)。通过引入这些高阶特征,我们可以更好地拟合非线性问题,并提高模型的预测能力。

多项式拓展有几个重要的作用:

  1. 引入非线性关系:原始特征往往无法直接表示复杂的非线性关系。通过多项式拓展,我们可以引入原始特征之间的交叉项和高阶项,从而使模型能够更好地拟合非线性关系。

  2. 增强模型表达能力:多项式拓展增加了特征空间的维度,在高维空间中,模型更有可能找到更好的决策边界,提高模型的拟合能力。

  3. 解决欠拟合问题:当原始特征无法提供足够的信息来拟合数据时,多项式拓展可以通过引入更多的特征信息来解决欠拟合问题。

值得注意的是,多项式拓展会增加特征的数量,可能导致维度灾难(curse of dimensionality)计算复杂度增加。因此,在使用多项式拓展时,要谨慎选择合适的特征组合和拓展的阶数,以避免过度拟合问题。

总的来说,多项式拓展的根本目的是通过引入原始特征的高阶组合,增强模型的表达能力,以更好地拟合数据中的非线性关系。

对原本不遵循线性分布的数据强行进行线性回归也得不到好的结果。我们在拿到数据之后, 应首先对数据进行可视化, 如果发现特征空间中的样本不是线性分布的, 那么我们就使用多项式拓展来解决非线性问题。

正则化

正则化是防止过拟合的一种方法, 与线性回归等算法配合使用。通过向损失函数增加惩罚项的方式对模型施加制约, 有望提高模型的泛化能力。

概述

正则化是防止过拟合的方法, 用于机器学习模型的训练阶段。过拟合是模型在验证数据上产生的误差比在训练数据上产生的误差(训练误差)大得多的现象。过拟合的一个原因是因为机器学习模型过于复杂。正则化可以降低模型的复杂度, 有助于提高模型的泛化能力。

复杂模型过拟合的一个原因是学习参数 θ \theta θ​的值太大(或太小)。当学习参数过大, 模型可能会在训练数据上表现得非常好,但在新数据上的泛化能力却很差。这是因为模型过度适应了训练数据的噪声和细节,而忽略了数据中的真实模式。类似地,如果参数值过小,模型也可能无法捕获数据的真实模式,导致欠拟合。而使用正则化就能够抑制学习参数过大。

L1、L2正则

L2正则

我们原来的目标函数是
J ( θ ) = MSE ⁡ ( θ ) J(\boldsymbol{\theta})=\operatorname{MSE}(\boldsymbol{\theta}) J(θ)=MSE(θ)
为了防止模型的权重(参数)过于得大, 我们需要为参数注明它的约束条件, 比如两个参数的情况下, 我们可以为我们的目标函数MSE注明约束条件
θ 1 + θ 2 < = C \theta_1+\theta_2 <= C θ1+θ2<=C
我们可以将带约束条件的目标函数通过拉格朗日乘子法转化为目标函数与约束条件整合到一起的新的函数, 且这个新的函数没有约束条件, 只是这个整合后的目标函数的极值点发生了改变
J ( θ ) = MSE ⁡ ( θ ) + α ( 1 2 ∑ i = 1 n θ i 2 − C ) J(\boldsymbol{\theta})=\operatorname{MSE}(\boldsymbol{\theta})+\alpha (\frac{1}{2} \sum_{i=1}^{n} \theta_{i}^{2} - C) J(θ)=MSE(θ)+α(21i=1nθi2C)
因为这里的αC是个常数, 所以我们可以把它给去掉, 并且1/2也不影响极值点的求解, 所以我们也可以给去掉
J ( θ ) = MSE ⁡ ( θ ) + α ∑ i = 1 n θ i 2 J(\boldsymbol{\theta})=\operatorname{MSE}(\boldsymbol{\theta})+\alpha \sum_{i=1}^{n} \theta_{i}^{2} J(θ)=MSE(θ)+αi=1nθi2
这样就代表同时使MSE和特征权值都尽可能的小, 这里的 α ∑ i = 1 n θ i 2 \alpha \sum_{i=1}^{n} \theta_{i}^{2} αi=1nθi2就是正则化项/惩罚项, 是学习参数(也称为特征权值)的平方和的形式, 并且惩罚项中不包含截距。

另外, α ( α ⩾ 0 ) \alpha(\alpha \geqslant 0) α(α0) 是控制正则化强度的参数, α \alpha α 越大, 对学习参数的抑制越强, 惩罚力度也就越大, 特征权重(学习参数)就越小; α \alpha α 越小, 对学习参数的抑制就越弱, 训练数据过拟合的可能性就越大。

训练过程中使用了L2正则项的线性回归算法被称为岭回归(Ridge Regression)

L1正则

前面介绍了作为正则化方法的岭回归。岭回归的误差函数的惩罚项是学习参数的平方和的形 式,通过将该惩罚项改为其他形式,可以实现不同特点的正则化。除了岭回归以外,还有一种具有代表性的正则化方法——Lasso 回归, 即使用了L1正则项的线性回归算法。Lasso 回归的误差函数如下:
J ( θ ) = MSE ⁡ ( θ ) + α ∑ i = 1 n ∣ θ i ∣ J(\boldsymbol{\theta})=\operatorname{MSE}(\boldsymbol{\theta})+\alpha \sum_{i=1}^{n} |\theta_{i}| J(θ)=MSE(θ)+αi=1nθi
Lasso回归的惩罚项是各学习参数的绝对值之和, 这一点与岭回归不同

L1正则的极值点更容易落在坐标轴上, 也就是说它会使某些参数的值变为零, 这种情况下的解我们就称之为稀疏解, 它会含有很多无效的解, 这种无效解会去掉样本的一些特征, L1正则的产生稀疏解的特性可以用于特征选择(系数为零的特征就代表它的重要性低于其它特征)

经过多项式拓展后产生的新特征所代表的视角我们是不知道的, Lasso会没有用的特征的系数化为零, 如果我们把没有用的特征也学习的话, 那么就很容易发生过拟合。L1正则倾向于把某些特征的系数化为零, L2正则倾向于将某些特征的系数尽可能的小, 很少有特征的系数为零, 换句话说, L1正则项擅长将实际没有用处的特征的系数变为0来进行特征过滤, L2正则项擅长将不没有用处的特征的系数变得很小, 使其变得不重要。

L1、L2正则化与原始的线性回归模型的区别在于在后面加上了惩罚项

岭回归和 Lasso 回归计算学习参数时的情况分别如图 a 和图 b 所示
在这里插入图片描述

绿线是线性回归的误差函数,蓝线是惩罚项的约束函数。岭回归的惩罚项是学习参数的平方和, 所以其图形是 图a 所示的圆形;Lasso 回归的惩罚项是绝对值的和,所以其图形是图 b 所示的四边形。原来的函数(线性回归的误差函数)与约束函数的交点就是带有正则化项的误差函数的最优解。可以看出,在加入惩罚项后,图 a 的岭回归的学习参数得到了抑制。图 b 的 Lasso 回归的情况与岭回归相似,学习参数同样被抑制,但学习参数 w 2 w_2 w2变为了 0。

Lasso 回归计算的是函数与这种四边形的约束函数的交点,因此具有学习参数容易变为 0 的特点。利用这个特点,我们可以使用学习参数不为 0 的特征来构建模型,从而达到利用 Lasso 回归特征选择的效果。这样不仅能提高模型的泛化能力,还能使模型的解释变容易。

无论是多项式特征扩展, 还是L1正则化特征缩放, 本质上都是因为样本的特征处理的不够好

模型的欠拟合与过拟合

模型的复杂程度其实与样本特征数成正相关的, 特征越多, 模型就越复杂, 就越容易发生过拟合; 特征越少,模型可参考的信息就少, 模型就越简单, 就越容易发生欠拟合(也就是没有学到有效的特征)。

当因为的样本特征数少导致欠拟合时, 我们就可以使用多项式拓展来增多特征, 也就是特征升维, 这样我们就可能解决欠拟合的问题。

比如, 现在假设有一个特征x1, 它代表房屋的长度, 也有房间的宽度这一特征, 结合我们基于业务的理解, 我们可以组合一个新的特征房屋面积x1*x2, 这样我们的机器学习算法可参考的面就多了。

当然这只是一个例子, 实际上多项式拓展过程中, 是不考虑特征属性的, 直接根据现有的特征组合出新的一个或多个特征,这样我们就有可能解决欠拟合的问题, 这就是升维的过程

下面我们看一个例子:

在这里插入图片描述

如上图所示, 纵轴描绘的是用户随着时间的变化对某话题的感兴趣的程度的变化, 如果我们使用step function来建模的话, 我们可以看到右上角的模型基本上拟合每一个数据点, 这说明模型太复杂, 因太过于关注训练数据是否分正确, 这种情况下模型很容易发生过拟合。而对于左下角的模型, 它虽然简单, 但很多数据都没有拟合到, 可见其在训练数据上的性能也不会太好, 这种情况下我们的模型极易发生欠拟合。

最后我们再来看右下角的模型, 它虽然简单, 但它能很好地拟合训练数据, 因此我们说右下角的模型是最好的。对于一个机器学习模型的通用原则是:简单且准确。模型往往需要在简单和准确之间做个折中, 这种这种也称为偏差和方差的折中(bias-variance tradeoff)

线性回归的过拟合

目标函数: J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2 J(θ)=21i=1m(hθ(x(i))y(i))2

  • 为了防止数据过拟合,也就是 θ \theta θ 值在样本空间中不能过大,可以在目标函数之上增加一个平方和损失:
    J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ i = 1 n θ j 2 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{i=1}^n \theta_j^2 J(θ)=21i=1m(hθ(x(i))y(i))2+λi=1nθj2
  • 正则项(norm)/惩罚项: λ ∑ j = 1 n θ j 2 \lambda \sum_{j=1}^n \theta_j^2 \quad λj=1nθj2; 这里这个正则项叫做L2-norm

过拟合与正则项

  • L2-norm:
    J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ i = 1 n θ j 2 λ > 0 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{i=1}^n \theta_j^2 \quad \lambda>0 J(θ)=21i=1m(hθ(x(i))y(i))2+λi=1nθj2λ>0
  • L1-norm:

J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ θ j ∣ λ > 0 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{j=1}^n\left|\theta_j\right| \quad \lambda>0 J(θ)=21i=1m(hθ(x(i))y(i))2+λj=1nθjλ>0

Ridge回归

  • 使用 L 2 \mathrm{L} 2 L2 正则的线性回归模型就称为Ridge回归(岭回归)

J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ i = 1 n θ j 2 λ > 0 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{i=1}^n \theta_j^2 \quad \lambda>0 J(θ)=21i=1m(hθ(x(i))y(i))2+λi=1nθj2λ>0

LASSO回归

  • 使用L1正则的线性回归模型就称为LASSO回归(Least Absolute Shrinkage and Selection Operator)

J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n ∣ θ j ∣ λ > 0 J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda \sum_{j=1}^n\left|\theta_j\right| \quad \lambda>0 J(θ)=21i=1m(hθ(x(i))y(i))2+λj=1nθjλ>0

Ridge(L2-norm)和 LASSO(L1-norm)比较

  • 在 L2-norm 中,由于对于各个维度的参数缩放是在一个圆内缩放的,不可能导致有维度参数变为0的情况,那么也就不会产生稀疏解;实际应用中,数据的维度中是存在噪音冗余的,稀疏的解可以找到有用的维度并且减少冗余,提高后续算法预测的准确性和鲁棒性(减少了 overfitting)(L1-norm 可以达到最终解的稀疏性的要求)。

  • Ridge 模型具有较高的准确性、鲁棒性以及稳定性(冗余特征已经被删除了);LASSO 模型具有较高的求解速度。

  • 如果既要考虑稳定性也考虑求解的速度,就使用 Elastic Net。

在这里插入图片描述

Elasitc Net

  • 同时使用 L 1 L 1 L1 正则和 L 2 L 2 L2 正则的线性回归模型就称为Elasitc Net算法(弹性网络算法)
    J ( θ ) = 1 2 ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ( p ∑ j = 1 n ∣ θ j ∣ + ( 1 − p ) ∑ j = 1 n θ j 2 ) J(\theta)=\frac{1}{2} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2+\lambda\left(p \sum_{j=1}^n\left|\theta_j\right|+(1-p) \sum_{j=1}^n \theta_j^2\right) J(θ)=21i=1m(hθ(x(i))y(i))2+λ(pj=1nθj+(1p)j=1nθj2)
    { λ > 0 p ∈ [ 0 , 1 ] \left\{\begin{array}{l} \lambda>0 \\ p \in[0,1] \end{array}\right. {λ>0p[0,1]

模型效果判断

  • MSE:误差平方和,越趋近于 0 表示模型越拟合训练数据。
  • RMSE:MSE的平方根,作用同MSE
  • R 2 R^2 R2 :取值范围(负无穷, 1 ],值越大表示模型越拟合训练数据;最优解是 1 ; 当模型预测为随机值的时候,有可能为负;若预测值恒为样本期望, R 2 R^2 R2 为 0
  • TSS:总平方和TSS(Total Sum of Squares),表示样本之间的差异情况,是伪方差的 m m m
  • RSS:残差平方和RSS(Residual Sum of Squares),表示预测值和样本值之间的差异情况,是MSE的m倍

机器学习调参

  • 在实际工作中,对于各种算法模型(线性回归)来讲,我们需要获取 θ 、 λ 、 p \theta 、 \lambda 、 p θλp的值; θ \theta θ 的求解其实就是算法模型通过学习训练所得到的参数,一般不需要开发人员参与(算法已经实现),主要需要求解的是超参数 λ \lambda λ p p p 的值,这个过程就叫做调参(超参)
  • 交叉验证:将训练数据分为多份,其中一份进行数据验证并获取最优的超参数: λ \lambda λ 和p;比如:十折交叉验证、五折交叉验证(scikit-learn中默认)等
  • 我们将模型训练过程中经学习得到的参数称为模型参数, 比如线性回归模型中的θ, 而在训练之前我们人为设定的参数就称为超参数, 比如模型正则化时的λ和p(出现在Elastic Net中), 我们经常提到的调参, 其实调整的就是超参数, 因为训练前设置的超参数不同, 那么训练过程得到的模型参数也就不同, 不同的模型参数就对应不同的模型

在这里插入图片描述

线性回归总结

  • 算法模型:线性回归(Linear)、岭回归(Ridge)、LASSO回归、Elastic Net

  • 正则化:L1-norm、L2-norm

  • 损失函数/目标函数: J ( θ ) = ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 → min ⁡ θ J ( θ ) J(\theta)=\sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2 \rightarrow \min _\theta J(\theta) J(θ)=i=1m(hθ(x(i))y(i))2minθJ(θ)

  • θ \theta θ 求解方式:最小二乘法(直接计算,目标函数是平方和损失函数)、梯度下降(BGD\SGD\MBGD)

梯度下降寻找最优解的方式后续会单独来说

拓展

  • 【链接】拉格朗日乘子法–将带约束优化问题转化为无约束优化问题

接下来我们编程实现一个简单的线性回归算法:

import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score


class LinearRegression:
    def __init__(self):
        self.coef_ = None
        self._theta = None
        self.intercept_ = None

    def fit(self, X_train, y_train):
        assert len(X_train) == len(y), \
            'the size of X_train must be equal to the size of y_train'
        X_b = np.column_stack((np.ones((X_train.shape[0], 1)), X_train))
        self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T.dot(y_train))
        self.coef_ = self._theta[1:]
        self.intercept_ = self._theta[0]

        return self

    def predict(self, X_predict):
        y_predict = np.array(X_predict).dot(self.coef_) + np.array(self.intercept_)
        return y_predict

    def score(self, X_test, y_test):
        # mse
        MSE = np.sum((self.predict(X_test) - y_test) ** 2) / len(X_test)
        # r^2
        r2_square = 1 - MSE / np.var(y)
        # mae
        MAE = np.sum(np.absolute(self.predict(X_test) - y_test)) / len(X_test)

        return MSE, r2_square, MAE

    def save(self):
        """

        :return:
        """
        # self.theta0
        # self.theta


if __name__ == '__main__':
    X = np.array([10, 15, 20, 30, 50, 60, 60, 70]).reshape((-1, 1))
    y = np.array([0.8, 1.0, 1.8, 2.0, 3.2, 3.0, 3.1, 3.5])
    linear = LinearRegression()
    linear.fit(X, y)
    x_test = [[55]]
    y_test_hat = linear.predict(x_test)

    mse, r2_s, mae = linear.score(X_test=X, y_test=y)
    print(mse, r2_s, mae)
    y_predict = linear.predict(X)
    print(mean_squared_error(y, y_predict), r2_score(y, y_predict), mean_absolute_error(y, y_predict))
    # print(y_test_hat)
    # print(linear.coef_)  # 查看回归系数
    # print(linear.intercept_)  # 查看截距

接下来, 我们可以尝试使用sklearn为我们封装好的线性回归算法来预测波士顿的房价

# -*- coding:utf-8 -*-

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
import warnings


warnings.filterwarnings('ignore')

# 加载数据
data = pd.read_csv('../datas/boston_housing.data', sep='\s+', header=None)

# 获取特征属性X和目标属性y
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

# 训练测试数据集分离
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

### 特征工程
# 多项式扩展
"""
PolynomialFeatures  ### 多项式扩展
degree=2  ### 扩展的阶数
interaction_only: bool  ### 是否只保留交互项
include_bias: ### 是否需要偏置项(截距)
"""
poly = PolynomialFeatures(degree=3, interaction_only=False)
poly.fit(X_train)
X_train_poly = poly.transform(X_train)
X_test_poly = poly.transform(X_test)

# 训练模型
# lasso = Lasso(alpha=10**5, max_iter=10000)  # alpha代表惩罚力度λ
# lasso.fit(X_train_poly, y_train)
ridge = Ridge(alpha=10**11, max_iter=10000)  # alpha代表惩罚力度λ
ridge.fit(X_train_poly, y_train)
print(ridge.coef_)

# 评估模型
# print('训练数据集的误差指标:', lasso.score(X_train_poly, y_train))
# print('测试数据集的误差指标:', lasso.score(X_test_poly, y_test))

print('训练数据集的误差指标:', ridge.score(X_train_poly, y_train))
print('测试数据集的误差指标:', ridge.score(X_test_poly, y_test))

# 可视化
plt.plot(range(len(X_train_poly)), y_train, c='r', label='y_true')
# plt.plot(range(len(X_train_poly)), lasso.predict(X_train_poly), c='g', label='y_predict')
plt.plot(range(len(X_train_poly)), ridge.predict(X_train_poly), c='g', label='y_predict')
plt.legend()
plt.show()

plt.plot(range(len(X_test)), y_test, c='r', label='y_true')
plt.plot(range(len(X_test)), ridge.predict(X_test_poly), c='g', label='y_predict')
# plt.plot(range(len(X_test)), lasso.predict(X_test_poly), c='g', label='y_predict')
plt.legend()
plt.show()

可视化结果如下:
在这里插入图片描述

参考文献

【1】:机器学习实战,【美】Peter Harrington

【2】:图解机器学习算法, 秋藤申野

【3】:机器学习, 周志华

【4】:百面机器学习, 葫芦娃

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

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

相关文章

Docker in Docker原理与实战探索

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)

MongoDB 的下载 下载地址&#xff1a;https://www.mongodb.com/try/download/community 这里需要对 MongoDB 的版本号说明一下&#xff1a; MongoDB 版本号的命名规则是 x.y.z&#xff0c;当其中的 y 是奇数时表示当前的版本为开发版&#xff0c;当其中的 y 是偶数时表示当前的…

OpenHarmony实战开发-使用一次开发多端部署实现一多设置典型页面

介绍 本示例展示了设置应用的典型页面&#xff0c;其在小窗口和大窗口有不同的显示效果&#xff0c;体现一次开发、多端部署的能力。 1.本示例使用一次开发多端部署中介绍的自适应布局能力和响应式布局能力进行多设备&#xff08;或多窗口尺寸&#xff09;适配&#xff0c;保…

IDEA一键备份MySQL数据库(mysqldump版)

问题 又到了搬MySQL数据库的时刻&#xff0c;这次我不想使用命令行备份&#xff0c;这次我想使用IDEA一键备份MySQL数据库。 解决 假设安装好mysqldump命令后&#xff0c;让IDEA使用mysqldump一键备份指定的数据库。具体IDEA配置如下&#xff1a; 这是IDEA上面的数据库到处…

语音芯片 SOP8、SOP16、SOP24脚在性能上有哪些不同呢?

随着语音识别技术的不断发展&#xff0c;人们对语音芯片的需求也越来越高。 其中&#xff0c;SOP8、SOP16和SOP24脚语音芯片是目前市面上应用比较广泛的芯片类型。这些芯片在性能上有什么区别&#xff1f;下面我们来具体分析一下。 首先&#xff0c;SOP8、SOP16、SOP24脚语音芯…

基于单片机20v数字电压表仿真系统设计

**单片机设计介绍&#xff0c;基于单片机20v数字电压表仿真系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机20V数字电压表仿真系统设计的主要目标是实现一个能够准确测量和显示20V直流电压的仿真系统。以下是该设计的主…

Oracle数据库常见 问题 或 报错 集合

【报错】字段长度不足 一般字段长度不够时报错&#xff1a; Cause: java.sql.SQLException: ORA-12899: value too large for colum “列名” 【报错】修改字段长度&#xff0c;提示资源正忙 以pl/sql为例&#xff1a; ctrl选中表&#xff0c;在列选项卡下修改字段长度&#x…

Mac反编译APK

文章目录 第一种方式: brew installapktool 使用说明dex2jar 使用说明 第二种方式: 下载安装包apktool 使用说明 (根据官方介绍没有操作成功,后续成功再更新这里)dex2jar 使用说明 安装 JD-GUI 查看jar包中的class文件JD-GUI 使用说明 第一种方式: brew install 安装过程可能很…

【测试篇】测试分类

文章目录 测试分类的框架按照测试对象划分(一) 可靠性测试(二) 容错性测试(三) 安装卸载测试(四) 内存泄露测试(五) 弱网测试(六) 文档测试 按是否查看代码(一) 黑盒测试(二) 白盒测试(三) 灰盒测试 按开发阶段划分(一) 单元测试(二) 集成测试(三) 系统测试(四) 回归测试(五) 冒…

IoT数采平台1:开篇

IoT数采平台1&#xff1a;开篇IoT数采平台2&#xff1a;文档IoT数采平台3&#xff1a;功能IoT数采平台4&#xff1a;测试 【功能概述】 开箱即用; 向下接入不同设备(PLC / 采集网关 / OPC / TCP设备 / UDP设备 / HTTP接入),向上通过MQTT发布消息; 数采底层基于NET CORE,既支持P…

3.恒定乘积自动做市商算法及代码

中心化交易所的安全风险 在中心化交易所中注册账户时&#xff0c;是由交易所生成一个地址&#xff0c;用户可以向地址充币&#xff0c;充到地址之后交易所就会根据用户充币的数量显示在管理界面中。但是充币的地址是掌管在交易所之中的&#xff0c;资产的控制权还是在交易所。…

乐观锁解决超卖问题

3.6 乐观锁解决超卖问题 修改代码方案一、 VoucherOrderServiceImpl 在扣减库存时&#xff0c;改为&#xff1a; boolean success seckillVoucherService.update().setSql("stock stock -1") //set stock stock -1.eq("voucher_id", voucherId).eq(&q…

【计算机考研】哪些学校性价比特别高

今年性价比高的学校&#xff0c;明年大批人卷进去&#xff0c;分数能低到哪里去&#xff1f; 我不会算命&#xff0c;我只说我看到的趋势&#xff1a; 1 去年爆冷的学校&#xff0c;今年一定不会爆冷&#xff0c;因为大多数人在第一层。就像底层的股民们&#xff0c;股票涨了就…

【面试经典150 | 动态规划】最小路径和

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划方法二&#xff1a;空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题…

vue-quill-editor 富文本编辑器(可上传视频图片),组件挂载的方式实现

1.安装 npm install vue-quill-editor --save npm install quill-image-drop-module --save npm install quill-image-resize-module --save2.在组件下面新增组件 QlEditor (1)index.vue <template><div><div idquillEditorQiniu><!-- 基于element…

邀请函 | 第89届CMEF即将开幕,我们上海见!

2024年4月11日~14日&#xff0c;第89届中国国际医疗器械&#xff08;春季&#xff09;博览会&#xff08;简称&#xff1a;CMEF&#xff09;将在上海国家会展中心举行&#xff0c;届时飞凌嵌入式将隆重亮相&#xff0c;展出适用于IVD、医疗影像、生命体征监测等医疗设备的嵌入式…

划重点!实物黄金和现货黄金的区别

有人说虽然现货黄金不是实物黄金&#xff0c;但却胜于实物黄金&#xff0c;我们认为如果从投资的便利性&#xff0c;以及潜的获利空间这两个主要的方面来说&#xff0c;上述的观点是相当正确的。但投资者在正式参与之前&#xff0c;最好还是认真了解一下实物黄金和现货黄金的主…

上位机图像处理和嵌入式模块部署(qmacvisual亮度检测)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;在机器视觉当中&#xff0c;对于光源的处理要非常小心。这里面不仅包括了选择什么样的光源&#xff0c;还取决于怎样使用…

软件设计不是CRUD(17):低耦合模块设计理论——总结

本文将已经介绍的低耦合设计理论梳理成一张思维导图&#xff0c;便于各位读者下载浏览。感兴趣但未阅读VIP文章的读者&#xff0c;可以解锁相关详细内容。&#xff08;第9篇——第16篇&#xff09; &#xff08;可直接保存到本地后&#xff0c;放大阅读&#xff09; 从后文开…

UE4_破碎插件的蓝图节点_Apply Radius Damage

一、知识点 Apply Radius Damage:破碎组件所带的蓝图节点。 二、使用方法&#xff1a; 1、设置——插件&#xff0c;搜索destruction&#xff0c;找到 Apex Destruction&#xff0c;勾选已启用。重启虚幻编辑器。 2、这样右键操作就有创建可破坏的网格体菜单&#xff0c;将do…