定义与公式

线性回归(Linear regression)是利用回归方程(函数)一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。

通用公式:h(w)=w1x1+w2x2+w3x3...+b=wTx+bh(w)=w_1x_1+w_2x_2+w_3x_3...+b=w^Tx+bh(w)=w1x1+w2x2+w3x3...+b=wTx+b

线性回归当中主要有两种模型,一种是线性关系,另一种是非线性关系。

线性回归的损失和优化

1.损失最小二乘法
2.优化正规方程梯度下降法
3.正规方程 -- 一蹴而就利用矩阵的逆,转置进行一步求解只是适合样本和特征比较少的情况
4.梯度下降法 -- 循序渐进举例:山  -- 可微分的函数山底 -- 函数的最小值梯度的概念单变量 -- 切线多变量 -- 向量梯度下降法中关注的两个参数α  -- 就是步长步长太小 -- 下山太慢步长太大 -- 容易跳过极小值点为什么梯度要加一个负号梯度方向是上升最快方向,负号就是下降最快方向
5.梯度下降法和正规方程对比:梯度下降               正规方程需要选择学习率          不需要需要迭代求解            一次运算得出特征数量较大可以使用     需要计算方程,时间复杂度高O(n3)
6.选择:小规模数据:LinearRegression(不能解决拟合问题)岭回归大规模数据:SGDRegressor

1 损失函数

J(θ)=(hw(x1)−y1)2+(hw(x2)−y2)2+...+(hw(xn)−yn)2J(\theta)=(h_w(x_1)-y_1)^2+(h_w(x_2)-y_2)^2+...+(h_w(x_n)-y_n)^2J(θ)=(hw(x1)y1)2+(hw(x2)y2)2+...+(hw(xn)yn)2

=∑i=1n(hw(xi)−yi)2=\sum_{i=1}^{n}(h_w(x_i)-y_i)^2=i=1n(hw(xi)yi)2

  • yi为第i个训练样本的真实值
  • h(xi)为第i个训练样本特征值组合预测函数
  • 又称最小二乘法

2 优化算法

如何去求模型当中的W,使得损失最小?(目的是找到最小损失对应的W值)

线性回归经常使用的两种优化算法

2.1 正规方程

w=(XTX)−1XTyw=(X^TX)^{-1}X^Tyw=(XTX)1XTy

理解:X为特征值矩阵,y为目标值矩阵。直接求到最好的结果

缺点:当特征过多过复杂时,求解速度太慢并且得不到结果

正规方程式的推导

J(θ)=(hw(x1)−y1)2+(hw(x2)−y2)2+...+(hw(xn)−yn)2J(\theta)=(h_w(x_1)-y_1)^2+(h_w(x_2)-y_2)^2+...+(h_w(x_n)-y_n)^2J(θ)=(hw(x1)y1)2+(hw(x2)y2)2+...+(hw(xn)yn)2

=∑i=1n(hw(xi)−yi)2=\sum_{i=1}^{n}(h_w(x_i)-y_i)^2=i=1n(hw(xi)yi)2

=(Xw−y)2=(Xw-y)^2=(Xwy)2

其中y是真实值矩阵,X是特征值矩阵,w是权重矩阵

对其求解关于w的最小值,起止y,X 均已知二次函数直接求导,导数为零的位置,即为最小值。

求导:
在这里插入图片描述
注:式(1)到式(2)推导过程中, X是一个m行n列的矩阵,并不能保证其有逆矩阵,但是右乘XT把其变成一个方阵,保证其有逆矩阵。

式(5)到式(6)推导过程中,和上类似。

2.2 梯度下降(Gradient Descent)

1 全梯度下降算法(FG)在进行计算的时候,计算所有样本的误差平均值,作为我的目标函数
2 随机梯度下降算法(SG)每次只选择一个样本进行考核
3 小批量梯度下降算法(mini-bantch)选择一部分样本进行考核
4 随机平均梯度下降算法(SAG)会给每个样本都维持一个平均值,后期计算的时候,参考这个平均值
  • 1. 单变量函数的梯度下降

假设有一个单变量的函数 :J(θ) = θ2

函数的微分:▽J(θ) = 2θ

初始化,起点为: θ0 = 1

学习率:α = 0.4

进行梯度下降的迭代计算过程:
在这里插入图片描述
经过四次的运算,也就是走了四步,基本就抵达了函数的最低点,也就是山底

  • 2.多变量函数的梯度下降

假设有一个目标函数 :J(θ)=θ12+θ22J(θ) = θ_1^2 + θ_2^2J(θ)=θ12+θ22

现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是 (0,0)点。但是接下 来,我们会从梯度下降算法开始一步步计算到这个最小值! 我们假设初始的起点为: θ0θ^0θ0 = (1, 3)

初始的学习率为:α = 0.1

函数的梯度为:▽J(θ) =< 2θ1 ,2θ2>

进行多次迭代:
在这里插入图片描述
梯度下降公式
在这里插入图片描述
α在梯度下降算法中被称作为学习率或者步长

梯度前加一个负号,就意味着朝着梯度相反的方向前进

  • 梯度下降和正规方程的对比
梯度下降正规方程
需要选择学习率不需要
需要迭代求解一次运算得出
特征数量较大可以使用需要计算方程,时间复杂度高O(n3)

选择:

  • 小规模数据:

    • LinearRegression(不能解决拟合问题)
    • 岭回归
  • 大规模数据:SGDRegressor

  • 全梯度下降算法(Full gradient descent),

  • 随机梯度下降算法(Stochastic gradient descent),

  • 随机平均梯度下降算法(Stochastic average gradient descent)

  • 小批量梯度下降算法(Mini-batch gradient descent)

全梯度下降算法(FG)
计算训练集所有样本误差,对其求和再取平均值作为目标函数。

权重向量沿其梯度相反的方向移动,从而使当前目标函数减少得最多。

因为在执行每次更新时,我们需要在整个数据集上计算所有的梯度,所以批梯度下降法的速度会很慢,同时,批梯度下降法无法处理超出内存容量限制的数据集。

批梯度下降法同样也不能在线更新模型,即在运行的过程中,不能增加新的样本。

其是在整个训练数据集上计算损失函数关于参数θ的梯度:
在这里插入图片描述
随机梯度下降算法(SG)

由于FG每迭代更新一次权重都需要计算所有样本误差,而实际问题中经常有上亿的训练样本,故效率偏低,且容易陷入局部最优解,因此提出了随机梯度下降算法。

其每轮计算的目标函数不再是全体样本误差,而仅是单个样本误差,即每次只代入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,直到损失函数值停止下降或损失函数值小于某个可以容忍的阈值。

此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解。其迭代形式为
在这里插入图片描述
每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。

其中,x(i)表示一条训练样本的特征值,y(i)表示一条训练样本的标签值

但是由于,SG每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。

小批量梯度下降算法(mini-bantch)

小批量梯度下降算法是FG和SG的折中方案,在一定程度上兼顾了以上两种方法的优点。

每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FG迭代更新权重。

被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理。

特别的,若batch_size=1,则变成了SG;若batch_size=n,则变成了FG.其迭代形式为
在这里插入图片描述
随机平均梯度下降算法(SAG)

在SG方法中,虽然避开了运算成本大的问题,但对于大数据训练而言,SG效果常不尽如人意,因为每一轮梯度更新都完全与上一轮的数据和梯度无关。

随机平均梯度算法克服了这个问题,在内存中为每一个样本都维护一个旧的梯度,随机选择第i个样本来更新此样本的梯度,其他样本的梯度保持不变,然后求得所有梯度的平均值,进而更新了参数。

如此,每一轮更新仅需计算一个样本的梯度,计算成本等同于SG,但收敛速度快得多。

四种梯度比较

(1**)FG方法由于它每轮更新都要使用全体数据集,故花费的时间成本最多,内存存储最大。**

(2)SAG在训练初期表现不佳,优化速度较慢。这是因为我们常将初始梯度设为0,而SAG每轮梯度更新都结合了上一轮梯度值。

(3)综合考虑迭代次数和运行时间,SG表现性能都很好,能在训练初期快速摆脱初始梯度值,快速将平均损失函数降到很低。但要注意,在使用SG方法时要慎重选择步长,否则容易错过最优解。

(4)mini-batch结合了SG的“胆大”和FG的“心细”,它的表现也正好居于SG和FG二者之间。在目前的机器学习领域,mini-batch是使用最多的梯度下降算法,正是因为它避开了FG运算效率低成本大和SG收敛效果不稳定的缺点。

模拟梯度下降法

import numpy as np
import matplotlib.pyplot as pltplot_x = np.linspace(-1,6,141)plot_y = (plot_x-2.5)**2-1plt.plot(plot_x,plot_y)
plt.show()

在这里插入图片描述

#求导函数
def dJ(theta):return 2*(theta-2.5)def J(theta):return (theta-2.5)**2-1eta=0.1  #学习率
epsilon=1e-8theta=0
theta_history=[theta]
while True:gradient=dJ(theta)last_theta=thetatheta=theta-eta*gradienttheta_history.append(theta)if abs(J(theta)-J(last_theta))<epsilon :break
print('最小值点的x坐标:',theta)
print('最小值点的y坐标:',J(theta))
plt.plot(plot_x,J(plot_x))
plt.plot(np.array(theta_history),J(np.array(theta_history)),color='r',marker='+') 

在这里插入图片描述

LinearRegression 和 SGDRegressor

class sklearn.linear_model.LinearRegression(*, fit_intercept=True,normalize='deprecated', copy_X=True, n_jobs=None, positive=False)
  • 通过正规方程优化
  • fit_intercept:默认True,是否计算模型的截距,为False时,则数据中心化处理
    normalize:默认False,是否中心化,若fit_intercept参数设置False时,normalize参数无需设置;若normalize设置为True时,则输入的样本数据将(X-X均值)/||X||;若设置normalize=False时,在训练模型前, 可以使用sklearn.preprocessing.StandardScaler进行标准化处理。
    copy_X:默认True,否则X会被改写
    n_jobs:默认为1,表示使用CPU的个数。当-1时,代表使用全部CPU
  • coef_:回归系数
  • intercept_:偏置
  • predict(x):预测数据
  • score(X, y, sample_weight=None),其结果等于 1−((y_true−y_pred)∗2).sum()/(y_true−y_true.mean())∗2).sum())1-((y \_true - y \_pred) *2).sum() / (y \_true - y \_true.mean()) * 2).sum())1((y_truey_pred)2).sum()/(y_truey_true.mean())2).sum())
class sklearn.linear_model.SGDRegressor(loss='squared_error', *, penalty='l2',alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000, tol=0.001, shuffle=True, verbose=0, epsilon=0.1, random_state=None, learning_rate='invscaling', eta0=0.01, power_t=0.25, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, warm_start=False, average=False)
  • SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型。
  • loss:损失类型
    • loss=”squared_error”: 普通最小二乘法
  • fit_intercept:是否计算偏置
  • learning_rate : string, optional
    • 学习率填充
    • ’constant’: eta = eta0
    • ’optimal’: eta = 1.0 / (alpha * (t + t0)) [default]
    • ‘invscaling’: eta = eta0 / pow(t, power_t)
      • power_t=0.25:存在父类当中
    • 对于一个常数值的学习率来说,可以使用learning_rate=’constant’ ,并使用eta0来指定学习率。
    • eta0 : double,当learning_rate为’constant’或者’invscaling’时的初始学习率。默认值为0.0。如果learning_rate='optimal’则这个参数没有用。
  • SGDRegressor.coef_:回归系数
  • SGDRegressor.intercept_:偏置

SGD的优点是:
高效
容易实现(有许多机会进行代码调优)
SGD的缺点是:
SGD需要许多超参数:比如正则项参数、迭代数。
SGD对于特征归一化(feature scaling)是敏感的。

from sklearn.linear_model import LinearRegressionx = [[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]# 实例化API
estimator = LinearRegression()
# 使用fit方法进行训练
estimator.fit(x,y)print(estimator.coef_)
print(estimator.predict([[100, 80]]))

线性回归模型评估

线性回归模型评估
通过几个参数验证回归模型
SSE(和方差、误差平方和):The sum of squares due to error
MSE(均方差、方差):Mean squared error 1m∑i=1m(yi−y^i)2\frac{1}{m} \displaystyle \sum_{i=1}^{m}(y_i-\hat y_i)^2m1i=1m(yiy^i)2
RMSE(均方根、标准差):Root mean squared error 1m∑i=1m(yi−y^i)2=MSE\sqrt{\frac{1}{m} \displaystyle \sum_{i=1}^{m}(y_i-\hat y_i)^2}=\sqrt{MSE}m1i=1m(yiy^i)2=MSE

MAE(平均绝对误差) 1m∑i=1m∣yi−y^i∣\frac{1}{m} \displaystyle \sum_{i=1}^{m} \lvert y_i-\hat y_i \rvertm1i=1myiy^i

R-square(确定系数) Coefficient of determination
在这里插入图片描述
公式变形

在这里插入图片描述

其实“确定系数”是通过数据的变化来表征一个拟合的好坏。“确定系数”的正常取值范围为[0,1],越接近1,表明方程的变量对y的解释能力越强,这个模型对数据拟合的也较好

R2R^2R2 越大越好,当自己的预测模型不犯任何错误时:R2=1R^2= 1R2=1 ,如果 R2R^2R2 < 0,说明学习到的模型还不如基准模型。
#注:很可能数据不存在任何线性关系

from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差
from sklearn.metrics import r2_score#R square
#调用
mean_squared_error(y_test,y_predict)
mean_absolute_error(y_test,y_predict)
r2_score(y_test,y_predict)
# 简单线性回归(一元线性回归)
# (1)数据示例
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus']=Falserng = np.random.RandomState(1)  
xtrain = 10 * rng.rand(30)
ytrain = 8 + 4 * xtrain + rng.rand(30)
# np.random.RandomState → 随机数种子,对于一个随机数发生器,只要该种子(seed)相同,产生的随机数序列就是相同的
# 生成随机数据x与y
# 样本关系:y = 8 + 4*xfig = plt.figure(figsize =(12,3))
ax1 = fig.add_subplot(1,2,1)
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
plt.grid()
plt.title('样本数据散点图')
# 生成散点图model = LinearRegression()
model.fit(xtrain[:,np.newaxis],ytrain)
# x[:,np.newaxis] → 将数组变成(n,1)形状print('权重为:',model.coef_)
print('偏置为:',model.intercept_)xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])
# 创建测试数据xtest,并根据拟合曲线求出ytest
# model.predict → 预测ax2 = fig.add_subplot(1,2,2)
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')
plt.plot(xtest,ytest,color = 'r')
plt.grid()
plt.title('线性回归拟合')
# 绘制散点图、线性回归拟合直线# 权重为: [4.00448414]
# 偏置为: 8.447659499431026

在这里插入图片描述

# 简单线性回归(一元线性回归)
# (2)误差rng = np.random.RandomState(8)
xtrain = 10 * rng.rand(15)
ytrain = 8 + 4 * xtrain + rng.rand(15) * 30
model.fit(xtrain[:,np.newaxis],ytrain)
xtest = np.linspace(0,10,1000)
ytest = model.predict(xtest[:,np.newaxis])
# 创建样本数据并进行拟合plt.plot(xtest,ytest,color = 'r',linestyle = '--')  # 拟合直线
plt.scatter(xtrain,ytrain,marker = '.',color = 'k')  # 样本数据散点图
ytest2 = model.predict(xtrain[:,np.newaxis])  # 样本数据x在拟合直线上的y值
plt.scatter(xtrain,ytest2,marker = 'x',color = 'g')   # ytest2散点图
plt.plot([xtrain,xtrain],[ytrain,ytest2],color = 'gray')  # 误差线
plt.grid()
plt.title('误差')
# 绘制图表

在这里插入图片描述

多项式回归

numpy.polyfit 实现一元多项式

numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)

【polyfit】多项式曲线拟合
【polyval】多项式曲线求值
【poly1d】得到多项式系数,按照阶数从高到低排列

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressionx = np.random.uniform(-3, 3, size=100) #从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开
X = x.reshape(-1, 1) # n行1列
y = 0.5 + x**2 + x + 2 + np.random.normal(0, 1, size=100)  #一元二次方程并添加噪音coef2 = np.polyfit(x,y, 2) # n表示阶数
poly_fit2 = np.poly1d(coef2)plt.scatter(x, y)
plt.plot(np.sort(x),poly_fit2(x)[np.argsort(x)], color='r',label="二阶拟合")print(poly_fit2)

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus']=Falsex = np.array([-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10])
y = np.array(2*(x**4) + x**2 + 9*x + 2) #假设因变量y刚好符合该公式
#y = np.array([300,500,0,-10,0,20,200,300,1000,800,4000,5000,10000,9000,22000])# coef 为系数,poly_fit 拟合函数
coef1 = np.polyfit(x,y, 1)
poly_fit1 = np.poly1d(coef1)
plt.plot(x, poly_fit1(x), 'g',label="一阶拟合")
print(poly_fit1)coef2 = np.polyfit(x,y, 2)
poly_fit2 = np.poly1d(coef2)
plt.plot(x, poly_fit2(x), 'b',label="二阶拟合")
print(poly_fit2)coef3 = np.polyfit(x,y, 3)
poly_fit3 = np.poly1d(coef3)
plt.plot(x, poly_fit3(x), 'y',label="三阶拟合")
print(poly_fit3)coef4 = np.polyfit(x,y, 4)
poly_fit4 = np.poly1d(coef4)
plt.plot(x, poly_fit4(x), 'k',label="四阶拟合")
print(poly_fit4)coef5 = np.polyfit(x,y, 5)
poly_fit5 = np.poly1d(coef5)
plt.plot(x, poly_fit5(x), 'r:',label="五阶拟合")
print(poly_fit5)plt.scatter(x, y, color='black')
plt.legend(loc=2)
plt.show()

在这里插入图片描述

sklearn中的多项式回归

多项式回归可以看作是对数据进行预处理,给数据添加新的特征,所以调用的库在preprocessing中:

class sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True, order='C')

使用 sklearn.preprocessing.PolynomialFeatures 这个类可以进行特征的构造,构造的方式就是特征与特征相乘(自己与自己,自己与其他人),这种方式叫做使用多项式的方式。
例如:有 a、b 两个特征,那么它的 2 次多项式的次数为 [1,a,b,a2,ab,b2][1,a,b,a^2,ab,b^2][1,a,b,a2,ab,b2]
PolynomialFeatures 这个类有 3 个参数:
degree:控制多项式的次数;
interaction_only:默认为 False,如果指定为 True,那么就不会有特征自己和自己结合的项,组合的特征中没有 a2a^2a2b2b^2b2
include_bias:默认为 True 。如果为 True 的话,那么结果中就会有 0 次幂项,即全为 1 这一列。

sklearn中一元多项式回归

import numpy as np
from sklearn.preprocessing import PolynomialFeaturesnp.random.seed(1)
x = np.random.uniform(-3, 3, size=100) #从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开
X = x.reshape(-1, 1) # n行1列
y = 0.5 + x**2 + x + 2 + np.random.normal(0, 1, size=100)
# 这个degree表示我们使用多少次幂的多项式
poly = PolynomialFeatures(degree=2)    
poly.fit(X)
X2 = poly.transform(X)
# X2.shape
# 输出:(100, 3)X2[:5,:]
#array([[ 1.        , -0.49786797,  0.24787252],
#       [ 1.        ,  1.32194696,  1.74754377],
#       [ 1.        , -2.99931375,  8.99588298],
#       [ 1.        , -1.18600456,  1.40660683],
#       [ 1.        , -2.11946466,  4.49213042]])

X2的结果第一列常数项,可以看作是加入了一列x的0次方;第二列一次项系数(原来的样本X特征),第三列二次项系数(X平方前的特征)。

特征准备好之后进行训练:

reg = LinearRegression()
reg.fit(X2, y)
y_predict = reg.predict(X2)
plt.scatter(x, y)
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
plt.show()print(reg.coef_)
print(reg.intercept_)

在这里插入图片描述

sklearn中多元多项式回归

import numpy as np
from sklearn.preprocessing import PolynomialFeaturesX = np.arange(1, 11).reshape(5, 2)    # 5行2列 10个元素的矩阵
poly = PolynomialFeatures()
poly.fit(X)
# 将X转换成最多包含X二次幂的数据集
X2 = poly.transform(X)
# 5行6列print(X2.shape)
print(X2)>>>
(5, 6)
[[  1.   1.   2.   1.   2.   4.][  1.   3.   4.   9.  12.  16.][  1.   5.   6.  25.  30.  36.][  1.   7.   8.  49.  56.  64.][  1.   9.  10.  81.  90. 100.]]

可以看出当数据维度是2维的,经过多项式预处理生成了6维数据。

第一列很显然是0次项系数;第二列和第三列就是原本的X矩阵;第四列是第二列(原X的第一列)平方的结果;第五列是第二、三两列相乘的结果;第六列是第三列(原X的第二列)平方的结果。

由此可以猜想一下如果数据是3维的时候是什么情况:

poly = PolynomialFeatures(degree=3)
poly.fit(X)
x3 = poly.transform(X)
x3.shape  #(5, 10)
x3 #输出
array([[   1.,    1.,    2.,    1.,    2.,    4.,    1.,    2.,    4.,    8.],[   1.,    3.,    4.,    9.,   12.,   16.,   27.,   36.,   48.,    64.],[   1.,    5.,    6.,   25.,   30.,   36.,  125.,  150.,  180.,    216.],[   1.,    7.,    8.,   49.,   56.,   64.,  343.,  392.,  448.,    512.],[   1.,    9.,   10.,   81.,   90.,  100.,  729.,  810.,  900.,    1000.]])

PolynomiaFeatures,将所有的可能组合,升维的方式呈指数型增长。这也会带来一定的问题。

Pipeline

在具体编程实践时,可以使用sklearn中的pipeline对操作进行整合。

首先我们回顾多项式回归的过程:

  • 将原始数据通过PolynomialFeatures生成相应的多项式特征
  • 多项式数据可能还要进行特征归一化处理
  • 将数据送给线性回归

Pipeline就是将这些步骤都放在一起。参数传入一个列表,列表中的每个元素是管道中的一个步骤。每个元素是一个元组,元组的第一个元素是名字(字符串),第二个元素是实例化。

import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScalernp.random.seed(1)
x = np.random.uniform(-3, 3, size=100) 
X = x.reshape(-1, 1) # n行1列
y = 0.5 + x**2 + x + 2 + np.random.normal(0, 1, size=100)poly_reg = Pipeline([('poly', PolynomialFeatures(degree=2)),('std_scale', StandardScaler()),('lin_reg', LinearRegression())
])  
poly_reg.fit(X, y)
y_predict = poly_reg.predict(X)plt.scatter(x, y)
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
plt.show()

在这里插入图片描述
其实多项式回归在算法并没有什么新的地方,完全是使用线性回归的思路,关键在于为数据添加新的特征,而这些新的特征是原有的特征的多项式组合采用这样的方式就能解决非线性问题。

这样的思路跟PCA这种降维思想刚好相反,多项式回归则是升维,添加了新的特征之后,使得更好地拟合高维数据。
欠拟合

偏差与方差

偏差和方差的定义如下:

  • 偏差(bias):偏差衡量了模型的预测值与实际值之间的偏离关系。例如某模型的准确度为96%,则说明是低偏差;反之,如果准确度只有70%,则说明是高偏差。
  • 方差(variance):方差描述的是训练数据在不同迭代阶段的训练模型中,预测值的变化波动情况(或称之为离散情况)。从数学角度看,可以理解为每个预测值与预测均值差的平方和的再求平均数。通常在模型训练中,初始阶段模型复杂度不高,为低方差;随着训练量加大,模型逐步拟合训练数据,复杂度开始变高,此时方差会逐渐变高。

对应四种情况:

  • 低偏差,低方差:这是训练的理想模型,此时蓝色点集基本落在靶心范围内,且数据离散程度小,基本在靶心范围内;
  • 低偏差,高方差:这是深度学习面临的最大问题,过拟合了。也就是模型太贴合训练数据了,导致其泛化(或通用)能力差,若遇到测试集,则准确度下降的厉害;
  • 高偏差,低方差:这往往是训练的初始阶段;
  • 高偏差,高方差:这是训练最糟糕的情况,准确度差,数据的离散程度也差。

模型误差:

模型误差 = 偏差 + 方差 + 不可避免的误差(噪音)。一般来说,随着模型复杂度的增加,方差会逐渐增大,偏差会逐渐减小。

偏差方差产生的原因:

一个模型有偏差,主要的原因可能是对问题本身的假设是不正确的,或者欠拟合。如:针对非线性的问题使用线性回归;或者采用的特征和问题完全没有关系,如用学生姓名预测考试成绩,就会导致高偏差。

方差表现为数据的一点点扰动就会较大地影响模型。即模型没有完全学习到问题的本质,而学习到很多噪音。通常原因可能是使用的模型太复杂,如:使用高阶多项式回归,也就是过拟合。

有一些算法天生就是高方差的算法,如kNN算法。非参数学习算法通常都是高方差,因为不对数据进行任何假设。

有一些算法天生就是高偏差算法,如线性回归。参数学习算法通常都是高偏差算法,因为对数据有迹象。

偏差与方差的平衡:

偏差和方差通常是矛盾的。降低偏差,会提高方差;降低方差,会提高偏差。

这就需要在偏差和方差之间保持一个平衡。

以多项式回归模型为例,我们可以选择不同的多项式的次数,来观察多项式次数对模型偏差&方差的影响:
在这里插入图片描述

我们要知道偏差和方差是无法完全避免的,只能尽量减少其影响。

  1. 在避免偏差时,需尽量选择正确的模型,一个非线性问题而我们一直用线性模型去解决,那无论如何,高偏差是无法避免的。
  2. 有了正确的模型,我们还要慎重选择数据集的大小,通常数据集越大越好,但大到数据集已经对整体所有数据有了一定的代表性后,再多的数据已经不能提升模型了,反而会带来计算量的增加。而训练数据太小一定是不好的,这会带来过拟合,模型复杂度太高,方差很大,不同数据集训练出来的模型变化非常大。
  3. 最后,要选择合适的模型复杂度,复杂度高的模型通常对训练数据有很好的拟合能力。

其实在机器学习领域,主要的挑战来自方差。处理高方差的手段有:

  • 降低模型复杂度
  • 减少数据维度;降噪
  • 增加样本数
  • 使用验证集

欠拟合和过拟合

欠拟合在训练集上表现不好,在测试集上表现不好解决方法:继续学习1.添加其他特征项2.添加多项式特征
过拟合在训练集上表现好,在测试集上表现不好解决方法:1.重新清洗数据集2.增大数据的训练量3.正则化4.减少特征维度
正则化通过限制高次项的系数进行防止过拟合L1正则化理解:直接把高次项前面的系数变为0Lasso回归L2正则化理解:把高次项前面的系数变成特别小的值岭回归

正则化线性模型

在学习的时候,数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时候尽量减少这个特征的影响(甚至删除某个特征的影响),这就是正则化

注:调整时候,算法并不知道某个特征影响,而是去调整参数得出优化的结果

岭回归和LASSO回归都是解决模型训练过程中的过拟合问题
1.Ridge Regression 岭回归就是把系数添加平方项然后限制系数值的大小α值越小,系数值越大,α越大,系数值越小
2.Lasso 回归对系数值进行绝对值处理由于绝对值在顶点处不可导,所以进行计算的过程中产生很多0,最后得到结果为:稀疏矩阵
3.Elastic Net 弹性网络是前两个内容的综合设置了一个r,如果r=0--岭回归;r=1--Lasso回归

1 Ridge Regression (岭回归,又名 Tikhonov regularization)

岭回归是线性回归的正则化版本,即在原来的线性回归的 cost function 中添加正则项(regularization term):
在这里插入图片描述

以达到在拟合数据的同时,使模型权重尽可能小的目的,岭回归代价函数:

在这里插入图片描述

  • α=0:岭回归退化为线性回归
  1. α :引入的新的超参数,平衡新的损失函数中两部分的关系;是代数式的系数,代表在模型正则化下新的损失函数中,让每一个 θiθ_iθi 都尽可能的小,这个小的程度占整个优化损失函数程度的多少;
  • 如果 α = 0:表示目标函数中没有加入模型正则化;
  • 如果 α = +∞ :目标函数的另一部分 MSE 占整个目标函数的比重非常的小,主要的优化任务就是让每一个θiθ_iθi 都尽可能的小;

2 Lasso Regression(Lasso 回归)

Lasso 回归是线性回归的另一种正则化版本,正则项为权值向量的ℓ1范数。

Lasso回归的代价函数 :
在这里插入图片描述
【注意 】

  • Lasso Regression 的代价函数在 θi=0处是不可导的.
  • 解决方法:在θi=0处用一个次梯度向量(subgradient vector)代替梯度,如下式
  • Lasso Regression 的次梯度向量


Lasso Regression 有一个很重要的性质是:倾向于完全消除不重要的权重。

例如:当α 取值相对较大时,高阶多项式退化为二次甚至是线性:高阶多项式特征的权重被置为0。

也就是说,Lasso Regression 能够自动进行特征选择,并输出一个稀疏模型(只有少数特征的权重是非零的)。

3 Elastic Net (弹性网络)

弹性网络在岭回归和Lasso回归中进行了折中,通过 混合比(mix ratio) r 进行控制:

  • r=0:弹性网络变为岭回归
  • r=1:弹性网络便为Lasso回归

弹性网络的代价函数 :
在这里插入图片描述
一般来说,我们应避免使用朴素线性回归,而应对模型进行一定的正则化处理,那如何选择正则化方法呢?

小结:

  • 常用:岭回归

  • 假设只有少部分特征是有用的:

    • 弹性网络
    • Lasso
    • 一般来说,弹性网络的使用更为广泛。因为在特征维度高于训练样本数,或者特征是强相关的情况下,Lasso回归的表现不太稳定。
  • api:

    • from sklearn.linear_model import Ridge, ElasticNet, Lasso
      

岭回归API

class sklearn.linear_model.Ridge(alpha=1.0, *, fit_intercept=True, normalize='deprecated', copy_X=True, max_iter=None, tol=0.001, solver='auto', positive=False, random_state=None)
  • 具有l2正则化的线性回归
  • alpha:正则化力度,也叫 λ,float类型,默认为1.0。正则化改善了问题的条件并减少了估计的方差。
  • solver:求解方法,str类型,默认为auto。可选参数为:auto、svd、cholesky、lsqr、sparse_cg、sag
    • auto根据数据类型自动选择求解器。
    • sag:如果数据集、特征都比较大,选择该随机梯度下降优化。当n_samples和n_feature都很大时,通常比其他求解器更快。注意,sag快速收敛仅在具有近似相同尺度的特征上被保证。您可以使用sklearn.preprocessing的缩放器预处理数据。
    • svd使用X的奇异值分解来计算Ridge系数。对于奇异矩阵比cholesky更稳定
    • cholesky使用标准的scipy.linalg.solve函数来获得闭合形式的解。
    • sparse_cg使用在scipy.sparse.linalg.cg中找到的共轭梯度求解器。作为迭代算法,这个求解器比大规模数据(设置tol和max_iter的可能性)的cholesky更合适。
    • lsqr使用专用的正则化最小二乘常数scipy.sparse.linalg.lsqr。它是最快的,但可能在旧的scipy版本不可用。它是使用迭代过程。
  • normalize:数据是否进行标准化
    • normalize=False:可以在fit之前调用preprocessing.StandardScaler标准化数据
  • Ridge.coef_:回归权重
  • Ridge.intercept_:回归偏置
    Ridge方法相当于SGDRegressor(penalty=‘l2’, loss=“squared_error”),只不过SGDRegressor实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG)
class sklearn.linear_model.RidgeCV(alphas=(0.1, 1.0, 10.0), *, fit_intercept=True, normalize='deprecated', scoring=None, cv=None, gcv_mode=None, store_cv_values=False, alpha_per_target=False)

参数:

  • alphas

类型: numpy array of shape [n_alphas]
说明:α值的数组。正则化的力度,必须是正浮点数。正则化提升了问题的条件,减少了估计器的方差。较大的值指定了更强的正则化。在其他模型,比如LogisticRegression 或者LinearSVC,α对应C−1C^{−1}C1

  • 用于交叉验证生成器的对象。
  • 一种可重复的生成序列。
  • 具有l2正则化的线性回归,可以进行交叉验证
    在这里插入图片描述
  • 正则化力度越大,权重系数会越小
  • 正则化力度越小,权重系数会越大

模拟数据使用岭回归

import numpy as np
import matplotlib.pyplot as pltnp.random.seed(42)
# np.random.uniform(-3, 3, size=100):在 [-3, 3] 之间等分取 100 个数;
x = np.random.uniform(-3.0, 3.0, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x + 3. + np.random.normal(0, 1, size=100)plt.scatter(x, y)
plt.show()

在这里插入图片描述

from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split# 使用多项式回归的管道方法
def PolynomialRegression(degree):return Pipeline([('poly', PolynomialFeatures(degree=degree)),('std_scaler', StandardScaler()),('lin_reg', LinearRegression())])np.random.seed(666)
X_train, X_test, y_train, y_test = train_test_split(X, y)from sklearn.metrics import mean_squared_errorpoly_reg = PolynomialRegression(degree=20)
poly_reg.fit(X_train, y_train)y_poly_predict = poly_reg.predict(X_test)
print(mean_squared_error(y_test, y_poly_predict))X_plot = np.linspace(-3, 3, 100).reshape(100, 1)
y_plot = poly_reg.predict(X_plot)plt.scatter(x, y)
plt.plot(X_plot[:, 0], poly_reg.predict(X_plot), color='r')
plt.axis([-3, 3, 0, 6])
plt.show()

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridgedef plot_model(model):X_plot = np.linspace(-3, 3, 100).reshape(100, 1)y_plot = model.predict(X_plot)plt.scatter(x, y)plt.plot(X_plot[:, 0], model.predict(X_plot), color='r')plt.axis([-3, 3, 0, 6])plt.show()#使用管道的方式使用岭回归方法    
def RidgeRegression(degree, alpha):return Pipeline([('poly', PolynomialFeatures(degree=degree)),('std_scaler', StandardScaler()),('ridge_reg', Ridge(alpha=alpha))])
#degree = 20、α = 0.0001ridge1_reg = RidgeRegression(20, 0.0001)
ridge1_reg.fit(X_train, y_train)y1_predict = ridge1_reg.predict(X_test)
print(mean_squared_error(y_test, y1_predict))
# 输出:1.323349275406402(均方误差)
plot_model(ridge1_reg)

在这里插入图片描述

# degree = 20、α = 1ridge2_reg = RidgeRegression(20, 1)
ridge2_reg.fit(X_train, y_train)y2_predict = ridge2_reg.predict(X_test)
print(mean_squared_error(y_test, y2_predict))
# 输出:1.1888759304218461(均方误差)
plot_model(ridge2_reg)

在这里插入图片描述

# degree = 20、α = 100
ridge3_reg = RidgeRegression(20, 100)
ridge3_reg.fit(X_train, y_train)y3_predict = ridge3_reg.predict(X_test)
print(mean_squared_error(y_test, y3_predict))
# 输出:1.3196456113086197(均方误差)plot_model(ridge3_reg)

在这里插入图片描述

#degree=20、alpha=1000000(相当于无穷大)ridge4_reg = RidgeRegression(20, 1000000)
ridge4_reg.fit(X_train, y_train)y4_predict = ridge4_reg.predict(X_test)
print(mean_squared_error(y_test, y4_predict))
# 输出:1.8404103153255003plot_model(ridge4_reg)

在这里插入图片描述
当 α = 1000000(相当于无穷大)时:拟合曲线几乎是一条水平的直线,因为当 α 非常大的时候,对目标函数的影响相当于只有添加的模型正则化在起作用

Lasso回归API

class sklearn.linear_model.Lasso(alpha=1.0, *, fit_intercept=True, normalize='deprecated', precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic')

模拟数据使用 LASSO 回归

import numpy as np
import matplotlib.pyplot as pltnp.random.seed(42)
x = np.random.uniform(-3.0, 3.0, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x + 3. + np.random.normal(0, 1, size=100)from sklearn.model_selection import train_test_splitnp.random.seed(666)
X_train, X_test, y_train, y_test = train_test_split(X, y)#使用多项式回归拟合数据
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegressiondef PolynomialRegression(degree):return Pipeline([('poly', PolynomialFeatures(degree=degree)),('std_scaler', StandardScaler()),('lin_reg', LinearRegression())])#封装绘制代码
def plot_model(model):X_plot = np.linspace(-3, 3, 100).reshape(100, 1)y_plot = model.predict(X_plot)plt.scatter(x, y)plt.plot(X_plot[:, 0], model.predict(X_plot), color='r')plt.axis([-3, 3, 0, 6])plt.show()
#多项式回归并绘图
from sklearn.metrics import mean_squared_errorpoly_reg = PolynomialRegression(degree=20)
poly_reg.fit(X_train, y_train)y_poly_predict = poly_reg.predict(X_test)
print(mean_squared_error(y_test, y_poly_predict))
# 输出:167.9401085999025(均方误差)plot_model(poly_reg)

在这里插入图片描述

#使用 LASSO Regression 改进算法模型from sklearn.linear_model import Lasso# 以管道的方式,使用 LASSO 回归的方法改进多项式回归的算法
def LassoRegression(degree, alpha):return Pipeline([('poly', PolynomialFeatures(degree=degree)),('std_scaler', StandardScaler()),('lasso_reg', Lasso(alpha=alpha))])
# degree = 20、α = 0.01lasso1_reg = LassoRegression(20, 0.01)
lasso1_reg.fit(X_train, y_train)y1_predict = lasso1_reg.predict(X_test)
print(mean_squared_error(y_test, y1_predict))
# 输出:1.149608084325997(均方误差)plot_model(lasso1_reg)

在这里插入图片描述

#degree = 20、α = 0.1lasso2_reg = LassoRegression(20, 0.1)
lasso2_reg.fit(X_train, y_train)y2_predict = lasso2_reg.predict(X_test)
print(mean_squared_error(y_test, y2_predict))
# 输出:1.1213911351818648(均方误差)plot_model(lasso2_reg)

在这里插入图片描述

#degree = 20、α = 1
lasso3_reg = LassoRegression(20, 1)
lasso3_reg.fit(X_train, y_train)y3_predict = lasso3_reg.predict(X_test)
print(mean_squared_error(y_test, y3_predict))
# 输出:1.8408939659515595(均方误差)plot_model(lasso3_reg)

分析

  • α = 0.01,比岭回归中的第一个 α 的取值大很多,因为对于 RidgeRegression(),正则化的那一项中是 θ^2,平方后的结果会比较大,所以需要让 α 值很小来调节正则项的大小;而对于LassoRegression(),正则化的那一项中是 |θ|,比岭回归中的正则化项小很多,所以在 LassoRegression() 中 α 的取值可以相对大一些;

  • 在具体进行机器学习算法的过程中,需要不断的试验不断的看结果,慢慢的形成经验,用各种不同的方法在调参时,对于不同的参数大概知道参数在哪个范围内进行选择会相应的比较好;

  • 当 α = 1 时,LassoRegression() 对应的正则化的程度已经比较高了;
    正则化的程度:拟合曲线的上下抖动幅度;

  • 现实机器学习的过程中,就是在完全不进行模型正则化和过度模型正则化之间选择一个程度最好的一情况;

比较 Ridge Regression 和 LASSO Regression

1)使用 Ridge 改进的多项式回归算法,随着 α 的改变,拟合曲线始终是各曲线,直到最后变成一条几乎水平的直线;也就是说,使用 Ridge 改造的多项式回归算法,得到的模型变量前还是有系数,因此很难得到一条斜的直线;

2)而使用 Lasso 改进的多项式回归算法,随着 α 的改变,拟合曲线会很快变成一条斜的直线,最后慢慢变成一条几乎水平的直线;模型更倾向于一条直线。

在这里插入图片描述

  • LASSO 的特点:趋向于使得一部分 θ 值变为 0,也就是说 LASSO 认为与 θ = 0 对应的特征是完全没有用的,而剩下与 θ 不为 0 所对应的特征是有用的,所以 LASSO 可作为特征选择用

  • 在作为特征选择用时,LASSO 也可能将一些有用的特征的系数 θ 变为 0,会导致信息不准确;相比较来说,还是 Ridge 更准确。

  1. 但是如果样本特征非常的大,如使用多项式回归时 degree = 100,此种情况下使用 LASSO 可以使样本特征变小。
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. websocket 接口如何测试?

    什么是 websocket 接口&#xff1f; 使用 websocket 建立长连接&#xff0c;服务端和客户端可以互相通信&#xff0c;服务端只要有数据更新&#xff0c;就可以主动推给客户端。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推…...

    2024/4/20 6:19:00
  2. CentOS 安装 Docker

    准备工作 系统要求 Docker CE 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10。 CentOS 7 满足最低 内核的要求&#xff0c;但由于内核版本比较低&#xff0c;部分功能&#xff08;如 overlay2 存储层驱动&#xff09;无法使用&#xff0c;并 且部分功能可…...

    2024/4/20 17:49:06
  3. 29 | 如何判断一个数据库是不是出问题了?

    MySQL45讲 实践篇 29 | 如何判断一个数据库是不是出问题了&#xff1f; select 1 判断 select 1 成功返回&#xff0c;只能说明这个库的进程还在&#xff0c;并不能说明主库没问题。 set global innodb_thread_concurrency3; # 控制 InnoDB 的并发线程上限CREATE TABLE t…...

    2024/4/20 2:39:45
  4. hive的压缩存储格式

    1、5种存储格式 Apache Hive支持Apache Hadoop中使用的几种熟悉的文件格式&#xff0c;如TextFile&#xff0c;RCFile&#xff0c;SequenceFile&#xff0c;AVRO&#xff0c;ORC和Parquet格式。 Cloudera Impala也支持这些文件格式。 在建表时使用STORED AS (TextFile|RCFil…...

    2024/4/20 10:49:34
  5. PHP底层原理以及代码执行过程

    PHP的底层原理 从图上可以看出&#xff0c;php从下到上是一个4层体系 Zend引擎 Zend整体用纯c实现&#xff0c;是php的内核部分&#xff0c;它将php代码翻译&#xff08;词法、语法解析等一系列编译过程&#xff09;为可执行 opcode的处理并实现相应的处理方法、实现了基本的数…...

    2024/4/15 3:32:59
  6. BIT-0程序环境和预编译 c语言预处理

    1.程序的翻译环境 2.程序的执行环境 3.c语言程序的编译链接 4.预定义符号介绍 5.预处理指令#define 6.宏和函数的对比 7.预处理操作符#和##的介绍 8.命令定义 9.预处理指令#include 10.预处理指令#undef 11.条件编译 程序的翻译环境和执行环境 在ANSI C的任何一种实现中&…...

    2024/4/15 3:32:54
  7. class学习(四)

    1.this指针指向被调用函数所属对象 所以在类的非静态成员函数中返回对象本身&#xff0c;可以return *this。 2.this指针的本质是指针常量。即指针指向不可以修改 也可在成员函数后面加const,让指针指向的值也不可以修改本质为&#xff1a;const Person * const this void sho…...

    2024/4/15 3:32:49
  8. PHP获取星期六星期日

    PHP获取星期六星期日 public function week($str) //判断规定时间 是否是 周六 周日{$str "2021-11-06 00:00:00";if((date(w,strtotime($str))6)){echo 你输入的日期是周 6666;}else if ((date(w,strtotime($str)) 0)){echo 你输入的日期是周 7777;}else{echo 不是…...

    2024/4/20 12:59:35
  9. 达梦数据库DEM服务器配置

    DEM 由以下几个部分组成: DEM 服务器 DEM 存储数据库 要管理和监控的数据库实例 数据库代理服务&#xff08;dmagent&#xff09; 其中 DEM 服务器为 DEM 应用服务器&#xff0c;负责处理客户端工具功能逻辑并存储 dmagent收集到的数据到 DEM 存储数据库&#xff0c;同时展…...

    2024/4/17 23:37:28
  10. 共享办公室出租,创业者们的空间

    深圳的办公室成本在全国来说都是比较高的&#xff0c;深圳的创业者也比较多&#xff0c;有很多创业者在开始创业的时候资金并不宽裕&#xff0c;租普通的写字楼需要的费用比较大&#xff0c;这种情况下选择在深圳租共享办公室出租&#xff0c;可以做前期过渡使用&#xff0c;等…...

    2024/4/19 20:15:18
  11. 011-Spring MVC全局异常处理

    使用 ExceptionHandler 处理异常 ExceptionHandler 是作用在方法上的注解&#xff0c;在对应的Controller中定义 ExceptionHandler 注解的方法即可处理当前 Controller 对应的异常。 package com.yyoo.springmvc.controller;import com.yyoo.springmvc.bean.MyResponse; impo…...

    2024/4/7 1:13:26
  12. CentOS搭建Nfs存储服务器,自用收藏

    一、服务端 1.安装rpcbind和nfs-utils yum -y install rpcbind nfs-utils2.编辑配置文件 vi /etc/exports3.输入下列配置 /nfstest 192.168.1.10/24(rw,sync)参数详解&#xff1a; /nfstest &#xff1a; 是服务端本地的共享目录 192.168.1.10/24 &#xff1a;是客户端的IP地…...

    2024/4/18 7:47:50
  13. javascript使用笔记

    1、通过JavaScript使用ajax访问链接出现跨域名访问怎么办&#xff1f; 答&#xff1a;运行本地的html来获取服务器的信息时出现这种问题&#xff0c;将html代码放到服务器上就没有问题了&#xff0c;其他情况尚且不做考虑&#xff0c;遇到了再说。...

    2024/4/20 5:50:47
  14. OWASP-文件上传漏洞简述(低中高)

    OWASP-文件上传漏洞简述&#xff1a;OWASP-文件上传漏洞&#xff08;低级&#xff09;&#xff1a;OWASP-文件上传漏洞&#xff08;中级&#xff09;&#xff1a;OWASP-文件上传漏洞&#xff08;高级&#xff09;&#xff1a;webshell文件包含&#xff1a;注:仅作学习使用 OWA…...

    2024/4/15 3:32:59
  15. DDD领域驱动设计:CQRS架构模式

    文章目录前言一、 CQRS介绍1.什么是 CQRS2.为何要使用CQRS二、CQRS 架构1.单数据库 CQRS2.双数据库 CQRS3.事件源 (Event source) CQRS结尾前言 DDD 作为一种系统分析的方法论&#xff0c;最大的问题是如何在项目中实践。而在实践过程中必然会面临许多的问题&#xff0c;「模式…...

    2024/4/15 3:33:09
  16. 搭建vue框架+vscode环境

    一、安装node.js 官网&#xff1a; Node.js 安装完后cmd查看版本&#xff1a; 二、安装阿里巴巴镜像&#xff1a; npm install -g cnpm --registryhttp://registry.npm.taobao.org 三、安装vue&#xff1a; 安装vue文件&#xff1a;cnpm install i vue -S 安装脚手架&…...

    2024/4/15 3:33:19
  17. Android 使用AgentWeb库轻量级H5混合开发

    一个轻量级的库&#xff0c;加载html效果很好&#xff0c;而且功能很强大。那就是AgentWeb GitHub地址&#xff1a;https://github.com/Justson/AgentWeb GitHub上面介绍&#xff1a; AgentWeb 是一个基于的 Android WebView &#xff0c;极度容易使用以及功能强大的库&…...

    2024/4/19 6:41:05
  18. 大疆嵌入式工程师面经(base:深圳)

    目录补&#xff1a;目前状态一、帖子说明二、个人背景三、面试前期准备1. 简历2. 自我介绍3. 项目介绍4. 企业及工程师文化&#xff08;二面及终面会有涉及&#xff0c;工程师文化要重点关注&#xff0c;可以写在自我介绍里&#xff0c;建议看一下近三年大疆的宣讲会&#xff0…...

    2024/4/7 1:13:23
  19. c++实现Myvector。

    c实现一个自己的vector。我们用到c的类、重载、模板类。 #pragma once #include<iostream> #include<cstring> #include<cassert> template<typename T> class MyVector { public:MyVector(int size 10);~MyVector();//访问T& at(int index) con…...

    2024/4/15 3:33:45
  20. 线性判别准则和线性分类算法【人工智能】

    目录 一、线性判别分析LDA原理 LDA的原理及推导过程 LDA算法流程 LDA算法优缺点 二、线性分类算法&#xff08;支持向量机SVM&#xff09; 优缺点 优点&#xff1a; 缺点&#xff1a; 三、LDA算法代码实现 python编程实现&#xff1a; sklearn 库实现 四、月亮数据集算…...

    2024/4/15 9:09:43

最新文章

  1. 进来学习K8s中的网络资源对象Service!

    进来学习K8s中的网络资源对象Service&#xff01; Kubernetes&#xff08;K8s&#xff09;是一个强大的容器编排平台&#xff0c;它不仅能够管理容器的生命周期&#xff0c;还能提供复杂的网络功能&#xff0c;使得在集群中的服务发现和访问变得简单。在 Kubernetes 中&#x…...

    2024/4/20 21:39:46
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. ChatGPT 初学者指南

    原文&#xff1a;ChatGPT for Beginners 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 介绍 如果您一直关注新闻和趋势&#xff0c;您可能已经在某个地方读到或听到过&#xff0c;Sam Altman 的生成式人工智能平台 ChatGPT 已经将人工智能推向了一个新的高度 - 许多…...

    2024/4/19 9:32:02
  4. Vue3学习笔记+报错记录

    文章目录 1.创建Vue3.0工程1.1使用vue-cli创建1.2 使用vite创建工程1.3.分析Vue3工程结构 2.常用Composition2.1 拉开序幕的setup2.2 ref函数_处理基本类型2.3 ref函数_处理对象类型2.4 ref函数使用总结 1.创建Vue3.0工程 1.1使用vue-cli创建 查看vue/cli版本&#xff0c;确保…...

    2024/4/16 23:49:52
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/19 14:24:02
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/19 18:20:22
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/19 11:57:31
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/19 11:57:31
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/19 11:57:52
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/19 11:58:14
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/19 11:58:20
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/20 7:40:48
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/19 11:58:39
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/19 11:58:51
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/20 3:12:02
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/19 11:59:15
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/19 11:59:48
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/19 12:00:06
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/20 21:12:02
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/19 12:00:25
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/19 12:00:40
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在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