怎么在网站视频做字幕,常用的营销策略,温州网站设计服务商,合肥网站优化方案Python 中的机器学习简介#xff1a;简单线性回归 一、说明 简单线性回归为机器学习提供了优雅的介绍。它可用于标识自变量和因变量之间的关系。使用梯度下降#xff0c;可以训练基本模型以拟合一组点以供未来预测。 二、技术背景 这是涵盖回归、梯度下降、分类和机器学习的其…    Python 中的机器学习简介简单线性回归                           一、说明             简单线性回归为机器学习提供了优雅的介绍。它可用于标识自变量和因变量之间的关系。使用梯度下降可以训练基本模型以拟合一组点以供未来预测。         二、技术背景         这是涵盖回归、梯度下降、分类和机器学习的其他基本方面的系列文章的第一篇文章。本文重点介绍简单的线性回归它确定了一组点的最佳拟合线以便进行将来的预测。 2.1 最佳拟合线              最佳拟合线是最准确地表示一组点的方程。对于给定的输入公式的输出应尽可能接近预期输出。         在上图中很明显中间线比左线或右线更适合蓝点。但是它是最适合的路线吗有没有第四条线更适合这些观点这条线当然可以向上或向下移动以确保相同数量的点落在其上方和下方。但是可能有十几行符合此确切标准。是什么让其中任何一个成为最好的         值得庆幸的是有一种方法可以使用回归在数学上确定一组点的最佳拟合线。 2.2 回归         回归有助于识别两个或多个变量之间的关系它采用多种形式包括简单线性、多重线性、多项式等。为了证明这种方法的有用性将使用简单的线性回归。         简单线性回归尝试找到一组点的最佳拟合线。更具体地说它标识自变量和因变量之间的关系。最佳拟合线的形式为 y  mx  b。 x 是输入或自变量m 是直线的斜率或陡度b 是 y 截距y 是输出或因变量         简单线性回归的目标是确定 m 和 b 的值当给定 x 时这些值将生成最准确的 y 值。这个方程也称为模型也可以用机器学习术语进行评估。在等式中w 表示“重量”Ŷ  Xw₁ w₀ X 是输入或特征w₁ 是斜率w₀ 是偏置或 y 截距Ŷ 是预测发音为“y-hat”         虽然这很有用但需要评估方程的准确性。如果它的预测很差它就不是很有用。为此使用成本或损失函数。 2.3 成本或损失函数         回归需要某种方法来跟踪模型预测的准确性。给定输入方程的输出是否尽可能接近预期输出成本函数也称为损失函数用于确定方程的精度。         例如如果预期输出为 5而方程输出为 18则损失函数应表示此差值。一个简单的损失函数可以输出 13这是这些值之间的差值。这表明模型的性能很差。另一方面如果预期输出为 5模型预测为 5则损失函数应输出 0这表明模型的性能非常出色。 执行此操作的常用损失函数是均方误差 MSE            此函数用于查找模型的预测 Ŷ 和预期输出 Y 之间的差异。然后对差值进行平方以确保输出始终为正。它跨一组大小为 n 的点执行此操作。通过将所有这些点的平方差相加并除以 n输出是均方差误差。这是一种同时评估模型在所有点上的性能的简单方法。下面可以看到一个简单的例子              虽然还有无数其他损失函数同样适用于这种情况但由于其简单性这是机器学习中回归中最受欢迎的损失函数之一尤其是在梯度下降方面这将在后面解释。 为了最好地理解梯度下降的位置可以评估一个示例。 三、预测最佳拟合线         若要显示操作中的简单线性回归需要数据来训练模型。这以 X 数组和 Y 数组的形式出现。对于此示例可以手动生成数据。它可以从“蓝图”函数创建。随机性可以添加到蓝图中模型将被强制学习底层函数。PyTorch一个标准的机器学习库用于实现回归。 3.1 生成数据         首先下面的代码使用随机整数生成器生成一个输入值数组。X 当前具有 n 个样本num 特征的形状。请记住特征是一个自变量简单线性回归有 1。在本例中n 将为 20。 import torchtorch.manual_seed(5)
torch.set_printoptions(precision2)# (n samples, features) 
X  torch.randint(low0, high11, size(20, 1))  tensor([[ 9],[10],[ 0],[ 3],[ 8],[ 8],[ 0],[ 4],[ 1],[ 0],[ 7],[ 9],[ 3],[ 7],[ 9],[ 7],[ 3],[10],[10],[ 4]])         然后可以通过 Y  1.5X  2 传递这些值以生成输出值并且可以使用平均值为 0 且标准差为 1 的正态分布将这些值添加一些随机性。Y 的形状为 n 个样本1。         下面的代码显示了具有相同形状的随机值。 torch.manual_seed(5)# normal distribution with a mean of 0 and std of 1
normal  torch.distributions.Normal(loc0, scale1)normal.sample(X.shape) tensor([[ 1.84],[ 0.52],[-1.71],[-1.70],[-0.13],[-0.60],[ 0.14],[-0.15],[ 2.61],[-0.43],[ 0.35],[-0.06],[ 1.48],[ 0.49],[ 0.25],[ 1.75],[ 0.74],[ 0.03],[-1.17],[-1.51]])         最后可以使用下面的代码计算Y。 Y  (1.5*X  2)  normal.sample(X.shape)Y tensor([[15.00],[15.00],[-0.36],[ 6.75],[13.59],[15.16],[ 2.33],[ 8.72],[ 2.67],[ 1.81],[13.74],[14.06],[ 7.15],[12.81],[15.91],[13.15],[ 6.76],[18.05],[18.71],[ 6.80]]) 它们也可以与 matplotlib 一起绘制以便更好地理解它们的关系 import matplotlib.pyplot as pltplt.scatter(X,Y)
plt.xlim(-1,11)
plt.ylim(0,20)
plt.xlabel($X$)
plt.ylabel($Y$)
plt.show()              虽然为示例生成数据似乎违反直觉但它是演示回归如何工作的好方法。该模型如下所示将仅提供 X 和 Y并且需要将 w₁ 标识为 1.5将 w₀ 标识为 2。                     权重可以存储在数组 w 中。 这个数组中有两个权重一个用于偏差一个用于特征的数量。它的形状为 数字特征  1 个偏差1。对于此示例数组的形状为 2 1。 torch.manual_seed(5)
w  torch.rand(size(2, 1))
w  tensor([[0.83],[0.13]])         生成这些值后可以创建模型。 3.2 创建模型         模型的第一步是为最佳拟合线定义一个函数为 MSE 定义另一个函数。         如前所述该模型的方程为 Ŷ  Xw₁ w₀。 截至目前偏差已添加到每个样本中。这相当于将偏差广播为与 X 大小相同并将数组相加。输出如下所示。 w[1]*X  w[0] tensor([[1.97],[2.09],[0.83],[1.21],[1.84],[1.84],[0.83],[1.33],[0.96],[0.83],[1.71],[1.97],[1.21],[1.71],[1.97],[1.71],[1.21],[2.09],[2.09],[1.33]])         下面的函数计算输出。 # line of best fit
def model(w, X):Inputs:w: array of weights | (num features  1 bias, 1)X: array of inputs  | (n samples, num features  1 bias)Output:returns the predictions | (n samples, 1)return w[1]*X  w[0]         MSE 的功能非常简单 # mean squared error (MSE)
def MSE(Yhat, Y):Inputs:Yhat: array of predictions | (n samples, 1)Y: array of expected outputs | (n samples, 1)Output:returns the loss of the model, which is a scalarreturn torch.mean((Yhat-Y)**2) # mean((error)^2) 3.3 预览最佳拟合线         创建函数后可以使用绘图预览最佳拟合线并且可以创建标准函数以供将来使用。它将以红色显示最佳拟合线以橙色显示每个输入的预测以蓝色显示预期输出。 def plot_lbf():Output:plots the line of best fit in comparison to the training data# plot the pointsplt.scatter(X,Y)# predictions for the line of best fitYhat  model(w, X)plt.scatter(X, Yhat, zorder3) # plot the predictions# plot the line of best fitX_plot  torch.arange(-1,110.1,.1) # generate values with a step of .1plt.plot(X_plot, model(w, X_plot), colorred, zorder0)plt.xlim(-1, 11)plt.xlabel($X$)plt.ylabel($Y$)plt.title(fMSE: {MSE(Yhat, Y):.2f})plt.show()plot_lbf()              具有当前权重的输出并不理想因为MSE为105.29。为了获得更好的MSE需要选择不同的权重。它们可以再次随机化但获得完美线的机会很小。这是梯度下降算法可用于以定义的方式更改权重值的地方。 3.4 梯度下降         梯度下降算法的解释可以在这里找到梯度下降的简单介绍。在继续之前应阅读本文以避免混淆。            总结一下这篇文章梯度下降使用成本函数的梯度来揭示每个权重对其的方向和影响。通过使用学习率缩放梯度并从每个权重的当前值中减去梯度成本函数最小化迫使模型的预测尽可能接近预期输出。    对于简单的线性回归f 将是 MSE。Python 实现可以在下面看到。请记住每个权重都有自己的偏导数用于公式如上所示。 # optimizer
def gradient_descent(w):Inputs:w: array of weights | (num features  1 bias, 1)Global Variables / Constants:X: array of inputs  | (n samples, num features  1 bias)Y: array of expected outputs | (n samples, 1)lr: learning rate to scale the gradientOutput:returns the updated weights n  len(X)# update the biasw[0]  w[0] - lr*2/n * torch.sum(model(w,X) - Y)# update the weightw[1]  w[1] - lr*2/n * torch.sum(X*(model(w,X) - Y))return w         现在该函数可用于更新权重。学习率是根据经验选择的但它通常是一个较小的值。还可以绘制最佳拟合的新线。 lr  0.01print(weights before:, w.flatten())
print(MSE before:, MSE(model(w,X), Y))# update the weights
w  gradient_descent(w)print(weights after:, w.flatten())
print(MSE after:, MSE(model(w,X), Y))plot_lbf() weights before: tensor([0.83, 0.13])
MSE before: tensor(105.29)
weights after: tensor([1.01, 1.46])
MSE after: tensor(2.99)              MSE 在第一次尝试时下降了 100 多分但这条线仍然不能完全符合点数。请记住目标是将 w₀ 设为 2将 w₁ 设为 1.5。为了加快学习过程可以再执行500次梯度下降并且可以检查新结果。 # update the weights
for i in range(0, 500):# update the weightsw  gradient_descent(w)# print the new values every 10 iterationsif (i1) % 100  0:print(epoch:, i1)print(weights:, w.flatten())print(MSE:, MSE(model(w,X), Y))print(*10)plot_lbf() epoch: 100
weights: tensor([1.44, 1.59])
MSE: tensor(1.31)epoch: 200
weights: tensor([1.67, 1.56])
MSE: tensor(1.25)epoch: 300
weights: tensor([1.80, 1.54])
MSE: tensor(1.24)epoch: 400
weights: tensor([1.87, 1.53])
MSE: tensor(1.23)epoch: 500
weights: tensor([1.91, 1.52])
MSE: tensor(1.23)500 个时期后MSE 为 1.23。w₀ 为 1.91w₁ 为 1.52。这意味着模型成功识别了最佳拟合线。可以执行其他更新但添加到输出值的随机性可能会阻止模型实现完美的预测。         为了建立关于梯度下降如何工作的额外直觉可以通过将它们与其输出 MSE 绘制来检查 w₀ 和 w₁ 的影响。绘制梯度下降的函数可以在附录中检查输出可以在下面检查 torch.manual_seed(5)
w  torch.rand(size(2, 1))w0s, w1s, losses  list(),list(),list()# update the weights
for i in range(0, 500):if i  0 or (i1) % 10  0:w0s.append(float(w[0]))w1s.append(float(w[1]))losses.append(MSE(model(w,X), Y))# update the weightsw  gradient_descent(w)plot_GD([-2, 5.2], [-2, 5.2])              每个橙色点表示权重的更新红线表示从一个迭代到下一个迭代的变化。最大的更新是从第一次迭代到第二次迭代即红线。其他橙色点靠得很近因为它们的衍生物很小因此更新更小。该图显示了权重如何更新直到获得最佳 MSE。         虽然这种方法很有用但可以通过几种方式简化。首先它没有利用矩阵乘法这将简化模型的方程。其次梯度下降不是回归的闭式解因为每个问题的 epoch 数和学习率都不同并且解是近似的。本文的最后一部分将解决第一个问题下一篇文章将解决第二个问题。 四、另一种方法         虽然这种方法很有用但它并不像它可能的那么简单。它不利用矩阵。截至目前整个方程 Ŷ  Xw₁ w₀ 用于模型的函数并且必须单独计算每个权重的偏导数以进行梯度下降。通过使用矩阵运算和微积分这两个函数都简化了。         首先X 的形状为 n 个样本num 特征w 的形状为 num 特征  1 个偏差1。通过在 X 中添加额外的列可以使用矩阵乘法因为它将具有 n 个样本、num 特征  1 个偏差的新形状。这可以是一列将乘以偏差的列这将缩放向量。这相当于广播偏差这是先前计算预测的方式。 X  torch.hstack((torch.ones(X.shape),X))
X tensor([[ 1.,  9.],[ 1., 10.],[ 1.,  0.],[ 1.,  3.],[ 1.,  8.],[ 1.,  8.],[ 1.,  0.],[ 1.,  4.],[ 1.,  1.],[ 1.,  0.],[ 1.,  7.],[ 1.,  9.],[ 1.,  3.],[ 1.,  7.],[ 1.,  9.],[ 1.,  7.],[ 1.,  3.],[ 1., 10.],[ 1., 10.],[ 1.,  4.]])         这会将等式更改为 Ŷ  X₁w₁ X₀w₀。展望未来偏差可以被视为一个特征因此 num 特征可以表示自变量和偏差并且可以省略  1 偏差。因此X 的大小为 n 个样本num 特征w 的大小为 num features1。当它们相互相乘时输出是预测向量其大小为 n 个样本1。矩阵乘法的输出与 相同。w[1]*X  w[0] torch.manual_seed(5)
w  torch.rand(size(2, 1))torch.matmul(X, w) tensor([[1.97],[2.09],[0.83],[1.21],[1.84],[1.84],[0.83],[1.33],[0.96],[0.83],[1.71],[1.97],[1.21],[1.71],[1.97],[1.71],[1.21],[2.09],[2.09],[1.33]]) 考虑到这一点可以更新模型的功能 # line of best fit
def model(w, X):Inputs:w: array of weights | (num features, 1)X: array of inputs  | (n samples, num features)Output:returns the output of Xw | (n samples, 1)return torch.matmul(X, w)         由于不再将每个权重视为单个分量因此梯度下降算法也可以更新。基于梯度下降的简单介绍矩阵的梯度下降算法如下            这可以通过 PyTorch 轻松实现。由于 w 在文章开头被重塑因此导数的输出需要重新整形以进行减法。 # optimizer
def gradient_descent(w):Inputs:w: array of weights | (num features, 1)Global Variables / Constants:X: array of inputs  | (n samples, num features)Y: array of expected outputs | (n samples, 1)lr: learning rate to scale the gradientOutput:returns the updated weights | (num features, 1) n  X.shape[0]return w - (lr * 2/n) * (torch.matmul(-Y.T, X)  torch.matmul(torch.matmul(w.T, X.T), X)).reshape(w.shape)         使用 500 个 epoch可以生成与以前相同的输出 lr  0.01# update the weights
for i in range(0, 501):# update the weightsw  gradient_descent(w)# print the new values every 10 iterationsif (i1) % 100  0:print(epoch:, i1)print(weights:, w.flatten())print(MSE:, MSE(model(w,X), Y))print(*10) epoch: 100
weights: tensor([1.43, 1.59])
MSE: tensor(1.31)epoch: 200
weights: tensor([1.66, 1.56])
MSE: tensor(1.25)epoch: 300
weights: tensor([1.79, 1.54])
MSE: tensor(1.24)epoch: 400
weights: tensor([1.87, 1.53])
MSE: tensor(1.23)epoch: 500
weights: tensor([1.91, 1.53])
MSE: tensor(1.23)由于这些函数不需要为每个要素手动添加其他变量因此可用于多元线性回归和多项式回归。 五、结论         下一篇文章将讨论不近似权重的回归闭式解决方案。相反最小化的值将使用 Python 中的机器学习简介Python 中回归的正态方程直接计算。 请不要忘记点赞和关注:) 七、引用 plot 3D 绘图 六、附录 绘制梯度下降 此函数利用 Plotly 在三维空间中显示梯度下降。 import plotly.graph_objects as go
import plotly
import plotly.express as pxdef plot_GD(w0_range, w1_range):Inputs:w0_range: weight range [w0_low, w0_high]w1_range: weight range [w1_low, w1_high]Global Variables:X: array of inputs  | (n samples, num features  1 bias)Y: array of expected outputs | (n samples, 1)lr: learning rate to scale the gradientOutput:prints gradient descent # generate all the possible weight combinations (w0, w1)w0_plot, w1_plot  torch.meshgrid(torch.arange(w0_range[0],w0_range[1],0.1),torch.arange(w1_range[0],w1_range[1],0.1))# rearrange into coordinate pairsw_plot  torch.hstack((w0_plot.reshape(-1,1), w1_plot.reshape(-1,1)))# calculate the MSE for each pairmse_plot  [MSE(model(w, X), Y) for w in w_plot]# plot the datafig  go.Figure(data[go.Mesh3d(xw_plot[:,0], yw_plot[:,1],zmse_plot,)])# plot gradient descent on loss functionfig.add_scatter3d(xw0s, yw1s, zlosses, markerdict(size3,colororange),linedict(colorred,width5))# prepare ranges for plottingxaxis_range  [w0  0.01 if w0  0 else w0 - 0.01 for w0 in w0_range] yaxis_range  [w1  0.01 if w1  0 else w1 - 0.01 for w1 in w1_range] fig.update_layout(scene  dict(xaxis_titlewsub0/sub, yaxis_titlewsub1/sub, zaxis_titleMSE,xaxis_rangexaxis_range,yaxis_rangeyaxis_range))fig.show()      七、参考和引用 plot 3D 绘图亨特·菲利普斯    文章转载自: http://www.morning.qwzpd.cn.gov.cn.qwzpd.cn http://www.morning.wpjst.cn.gov.cn.wpjst.cn http://www.morning.pqrhb.cn.gov.cn.pqrhb.cn http://www.morning.zhnpj.cn.gov.cn.zhnpj.cn http://www.morning.kgmkl.cn.gov.cn.kgmkl.cn http://www.morning.gbyng.cn.gov.cn.gbyng.cn http://www.morning.pjbhk.cn.gov.cn.pjbhk.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.ktcrr.cn.gov.cn.ktcrr.cn http://www.morning.zpfqh.cn.gov.cn.zpfqh.cn http://www.morning.ypbp.cn.gov.cn.ypbp.cn http://www.morning.cxnyg.cn.gov.cn.cxnyg.cn http://www.morning.rqlzz.cn.gov.cn.rqlzz.cn http://www.morning.bkfdf.cn.gov.cn.bkfdf.cn http://www.morning.rui931.cn.gov.cn.rui931.cn http://www.morning.bpmmq.cn.gov.cn.bpmmq.cn http://www.morning.tckxl.cn.gov.cn.tckxl.cn http://www.morning.dwrjj.cn.gov.cn.dwrjj.cn http://www.morning.bnpcq.cn.gov.cn.bnpcq.cn http://www.morning.zrhhb.cn.gov.cn.zrhhb.cn http://www.morning.dxqwm.cn.gov.cn.dxqwm.cn http://www.morning.lqlc.cn.gov.cn.lqlc.cn http://www.morning.wqpr.cn.gov.cn.wqpr.cn http://www.morning.snbry.cn.gov.cn.snbry.cn http://www.morning.rnytd.cn.gov.cn.rnytd.cn http://www.morning.qtxwb.cn.gov.cn.qtxwb.cn http://www.morning.ftync.cn.gov.cn.ftync.cn http://www.morning.bnrnb.cn.gov.cn.bnrnb.cn http://www.morning.sdkaiyu.com.gov.cn.sdkaiyu.com http://www.morning.jkpnm.cn.gov.cn.jkpnm.cn http://www.morning.mrfnj.cn.gov.cn.mrfnj.cn http://www.morning.kmbgl.cn.gov.cn.kmbgl.cn http://www.morning.gczzm.cn.gov.cn.gczzm.cn http://www.morning.kzdgz.cn.gov.cn.kzdgz.cn http://www.morning.kydrb.cn.gov.cn.kydrb.cn http://www.morning.kyfrl.cn.gov.cn.kyfrl.cn http://www.morning.lpzyq.cn.gov.cn.lpzyq.cn http://www.morning.phgz.cn.gov.cn.phgz.cn http://www.morning.xxfxxf.cn.gov.cn.xxfxxf.cn http://www.morning.rgdcf.cn.gov.cn.rgdcf.cn http://www.morning.tnfyj.cn.gov.cn.tnfyj.cn http://www.morning.qjldz.cn.gov.cn.qjldz.cn http://www.morning.fpxyy.cn.gov.cn.fpxyy.cn http://www.morning.mttqp.cn.gov.cn.mttqp.cn http://www.morning.kqpxb.cn.gov.cn.kqpxb.cn http://www.morning.wnrcj.cn.gov.cn.wnrcj.cn http://www.morning.gcthj.cn.gov.cn.gcthj.cn http://www.morning.rycd.cn.gov.cn.rycd.cn http://www.morning.rqbkc.cn.gov.cn.rqbkc.cn http://www.morning.xgcwm.cn.gov.cn.xgcwm.cn http://www.morning.kwxr.cn.gov.cn.kwxr.cn http://www.morning.hngmg.cn.gov.cn.hngmg.cn http://www.morning.hkshy.cn.gov.cn.hkshy.cn http://www.morning.tqgmd.cn.gov.cn.tqgmd.cn http://www.morning.skkmz.cn.gov.cn.skkmz.cn http://www.morning.qxmpp.cn.gov.cn.qxmpp.cn http://www.morning.rhlhk.cn.gov.cn.rhlhk.cn http://www.morning.bgpch.cn.gov.cn.bgpch.cn http://www.morning.tnhg.cn.gov.cn.tnhg.cn http://www.morning.xtlty.cn.gov.cn.xtlty.cn http://www.morning.pwhjr.cn.gov.cn.pwhjr.cn http://www.morning.redhoma.com.gov.cn.redhoma.com http://www.morning.rdbj.cn.gov.cn.rdbj.cn http://www.morning.dshxj.cn.gov.cn.dshxj.cn http://www.morning.jhxtm.cn.gov.cn.jhxtm.cn http://www.morning.nxnrt.cn.gov.cn.nxnrt.cn http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn http://www.morning.rjznm.cn.gov.cn.rjznm.cn http://www.morning.jhswp.cn.gov.cn.jhswp.cn http://www.morning.sooong.com.gov.cn.sooong.com http://www.morning.msbpb.cn.gov.cn.msbpb.cn http://www.morning.nlqgb.cn.gov.cn.nlqgb.cn http://www.morning.qgghj.cn.gov.cn.qgghj.cn http://www.morning.ndfwh.cn.gov.cn.ndfwh.cn http://www.morning.tqlhn.cn.gov.cn.tqlhn.cn http://www.morning.gnbtp.cn.gov.cn.gnbtp.cn http://www.morning.jpkhn.cn.gov.cn.jpkhn.cn http://www.morning.qlck.cn.gov.cn.qlck.cn http://www.morning.cljpz.cn.gov.cn.cljpz.cn http://www.morning.cqwb25.cn.gov.cn.cqwb25.cn