ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零开始,用Python徒手写线性回归

从零开始,用Python徒手写线性回归 先放下 -learn我们来看一看真正的技术。对于多数数据科学家来讲, 线性回归方法是他们开展统计学建模以及预测分析任务的开端之处。这种方法存有200多年了, 且得到了广泛地研究, 然而依旧是活跃的研究范畴。鉴于具备良好的可解释性特性, 线性回归在商业数据方面用途极为广泛。当然了, 于生物数据和工业数据等领域, 有关回归分析的应用也不匮乏。另外一方面, 已然变成数据科学家优先选择的编程语言, 能够运用多种方式借助线性模型去拟合大型数据集, 这显得特别的重要。假设你才方才踏入机器学习这一门槛, 那么运用从零起始对全个线性回归算法予以编码, 这可是一回颇具意义的尝试, 咱们瞧瞧该咋做吧。数据第一步针对于机器学习问题在于获取数据, 得不到能用来学习的相应数据当然便不存在机器学习了。本文会运用极为常规通常用的线性回归数据集, 也就是预测房价的相关数据集。这是一个简单数据集, 包含俄勒冈州波特兰市房价, 数据集中第一列是房屋面积, 以平方英尺为单位, 第二列是卧室数量, 第三列是房屋价格, 数据集中有多个特征, 比如房间数, 所以我们将研究多元线性回归, 标签(y)是我们要预测的房价。首先定义用于加载数据集的函数, rooms, price数据等于利用NumPy库中的数组函数, 将数据框按照浮点型数据类型转换而成的数组, 数据, 数据数据, 数据, 数据。稍后, 我们会去调用上述的那个函数, 以此函数来进行数据集的加载。而这个函数呢, 它返回的是x以及y。归一化数据上面的那段代码, 它不只是负责加载数据, 还会针对所加载的数据去执行归一化的处理操作, 并且还要绘制那些数据点。在去查看数据图之前, 我们得先要搞清楚上面代码里的data。查看原始数据集之后, 你会发觉第二列数据的值, 也就是房间数量, 比起第一列也就是房屋面积要小得多。此数据不会被模型评估作房间数量或者房屋面积, 就模型而言, 它们仅只是一些数字罢了。机器学习模型里某些列也就是特征的数值比起其他列高, 这可能会造成不想要的偏差, 还极有可能致使方差与整体均值的不平衡。鉴于这些缘由同时也是为了使工作简化, 我们提出建议, 先针对特征实施缩放或者进行归一化, 让之于同一范围以内, 打个比方似的, 这会让训练变得易于许多。因此我们将使用特征归一化其数学表达如下Z (x — μ) / σμ : meanσ :存在这样一种情况, 其中的 z 属于那种被归一化了的特征, 而 x 则是未被归一化的特征。在有了用于实施归一化操作的公式之后, 我们能够做到为实现归一化去创建出一个函数:设置一个函数, 函数名为def , 其参数为data , 在函数内部, 对于从0到data的形状减1的范围内的每一个i , 执行这样的操作, 将data 进行如下处理, 用data减去data的均值, 再除以data的标准差。每一列都被上述的代码依次遍历, 并且在遍历其中, 是以该列里所有数据元素的均值以及标准差, 来对当前所遍历这一列执行归一化操作的。绘制数据在对线性回归模型进行编码之前我们需要先问「为什么」。为何要用线性回归去解决此问题? 这可是个极为有用的问题, 在编写任何具体代码以前, 你都应当极其清楚要运用哪种算法, 以及在给定数据集与待解决问题的情形下, 这究竟是不是最佳的选择。凭借绘制图像, 我们能够证实针对当前数据集运用线性回归有效的缘由。为达成如此, 我们于上面的之中调用了函数, 此刻我们着手对函数予以定义。调用该函数将生成下图房屋面积与房屋价格关系图。对应上面所呈现的图示, 我们能够大概地拟合出一条线, 这表明运用线性近似能够达成比较准确的预测, 所以能够采用线性回归。准备好数据之后就要进行下一步给算法编写代码。假设最初, 我们得去界定假设函数这下边一个事儿, 紧接着往后, 我们会用上它, 进而开展实施计算代价这些相关的操作。就线性回归来说, 这个假设所涵盖的内容是:但数据集中只有 2 个特征因此对于当前问题假设是其中, x1是两个特征当中的一个, 房间数量是具备的特征, x2是两个特征当中的另一个, 房屋面积是具备的特征。然后, 编写一个函数, 该函数是简单的, 返回该假设。接下来我们来看代价函数。代价函数使用代价函数的目的是评估模型质量。代价函数的等式为代价函数的代码如下定义, 对于x、y以及theta, 计算得到, 先求出h(x,theta)减去y, 对其进行转置, 再与h(x,theta)减去y进行矩阵乘法运算, 最后将结果除以2乘以y的形状所得到的值, 作为最终结果。迄于现今, 吾等所界定之统统函数, 皆与上述线性回归之数学意涵全然相同, 随后吾等所需做的乃是将代价予以最小化, 而此便需借助梯度下降。梯度下降梯度下降是一种优化算法旨在调整参数以最小化代价函数。梯度下降的主要更新步是因此, 我们把代价函数的导数, 与学习率α相乘, 之后, 用参数θ的当前值, 减去这一乘积, 从而获得新的更新参数θ。你提供的内容似乎并不是一个完整且正确的代码片段表述, 存在格式和语法错误, 不太能按照要求准确改写。请提供正确完整的内容以便进行改写。首先, 对于在范围中进行的每一次循环, 这里的h_x等于h作用于x和theta的结果 , 然后, cost_等于(1除以m)乘以x进行转置后与h_x减去y的运算结果 , 接着, theta等于theta减去某个值乘以cost_ , 最后, J_all作用于x、y和theta。theta, J_all返回的函数有 theta 和 J_all, theta 明显是参数向量, 此向量中有假设相关的θs 值, J_all是个列表, 该列表里有每个 epoch 之后的代价函数, J_all 变量不是绝对必要的, 不过它对模型更好地分析有帮助。整合到一起接下来要做的就是以正确的顺序调用函数#针对 以及 花费 等于 jplot 等于 count 等于 0, 针对 J_all 中的 i, jplot 的(i)的(count), count 增加 等于将 jplot 转换为 np.array 等于 np.array()的(jplot, )。test(theta, )首先进行调用, 调用的是函数, 该函数用于载入 x 值还有 y 值, x 值当中包含着训练样本, y 值里面包含着标签, 这里所说的标签其实就是房屋的价格。你必定留意到了, 在全部代码里, 我们始终运用矩阵乘法的形式来呈现所需, 比如说为了获取假设, 我们非得把每个参数θ跟每个特征向量x相乘, 我们能够采用for循环, 逐个遍历每个样本, 每一回都开展一次乘法, 然而要是训练的样本数目过多, 这兴许并非最为高效的办法。在此处更为有效的办法乃是运用矩阵乘法。本文所采用的数据集拥有两个特性分别是房屋面积以及房间数, 也就是说我们存在21这三个参数。把假设视作图形层面上的一条线, 用这样的方式思考另外的参数θ0, 最终额外的那个θ0同样要让这条线契合要求。有利的假设函数图示。此刻, 我们获取到了三个参数与两个特征, 这所蕴含的意义表明, θ也就是参数向量1维矩阵, 它的维数处于(3, 1)这种状况之中。可是特征向量的维度却是(46, 2)情况。你务必会留意了解发现, 把如此这般的两个矩阵进行相乘运作, 于数学范畴之内是绝对没有可能实现的存在。赶紧再次查看一回我们所设定的假设内容:要是你认真去观察, 事实上这挺直观的: 若在特征向量x {其维度是46, 3} 的起始位置添加额外的一列, 并且针对x以及theta去执行矩阵乘法, 那将会得出hθ(x)的方程。谨记, 于实际去运行代码以达成此功能之际, 并非会如同 hθ(x)那般去返回表达式, 相反是返回经由该表达式所算出的数学值。在上面那段代码之中, 存在 x np.((np.ones((x.shape,1)), x)) 这样一行, 它于 x 起始之处增添了额外的一列, 目的是为了满足矩阵乘法所需。在此之后, 我们把 theta 向量用零来进行初始化, 当然, 你也能够采用一些小的随机值去做初始化操作。我们还对训练学习率以及 epoch 数进行了指定。当完成了全部超参数的定义之后, 我们便能够去调用梯度下降函数, 借此来返回所有代价函数的历史记录, 以及参数theta的最终向量。在这儿, theta向量对最终的假设进行了定义。你也许留意到了, 由梯度下降函数所返回的theta向量的维度是(3,1)。还记得函数的假设吗所以, 我们所需的是三个θ, theta向量的维度是(3,1), 因而, theta、theta以及theta实际上分别对应θ0、θ1和θ2。J_all变量乃是所有代价函数的历史记录。你能够打印出J_all数组, 以此查看代价函数于梯度下降的每个epoch中逐步减小的过程。代价和 epoch 数量的关系图。我们可以通过定义和调用 函数来绘制此图如下所示定义(J_all, ), 进行绘图操作, 设置绘图内容为空, 设置绘图标题为Cost, 绘制曲线, 用红色(颜色代码m), 设置线条宽度为5, 显示绘图。当下, 我们能够运用此类参数去寻觅标签, 好比在给出房屋面积以及房间数量之际的房屋价格。测试现此刻, 你能够去开展调用测试函数的代码的测试工作, 此函数会把房屋面积, 以及房间数量, 还有回归模型返回的那种最终的theta向量当作输入内容, 进而输出出现房屋价格。确定一个名为test的函数, 其包含参数theta以及x, 将x进行这样的计算, 即把x减去mu后再除以std, 把x减去mu后再除以std。y等于theta加上theta乘以x再加上theta乘以x, 打印出“Price of house:”, 以及y。完整代码numpy as . as as pd这个需求不太清晰, 请你明确一下具体的句子内容, 以便我按照要求进行改写。def (): df pd.(, sep,, False) df. , rooms, pricedata np.array(df, dtypefloat) (data, data) (data) data, datadef (x, y): plt.(house size) plt.(price) plt.plot(x, y, bo) plt.show()看起来你提供的这段内容像是一段代码片段, 不过表述似乎不太准确和完整且结构混乱不太能按正常要求改写。请你检查并清晰准确地提供一下原始内容以便能更好地进行创作。但按照你现有的内容勉强改写如下: 定义一个函数, 其参数为数据, 对于从0到数据形状减1的范围内的每个索引值, 将数据进行这样的操作, 即先减去数据的均值再除以数据的标准差, 然后对于均值和标准差分别进行某种与mu和std相关的操作。def h(x,theta): np.(x, theta)def (x, y, theta): ((h(x, theta)-y).T(h(x, theta)-y))/(2*y.shape)def (x, y, theta, 0.1, 10): m x.shape J_all for _ in range(): h_x h(x, theta) cost_ (1/m)*(x.T(h_x - y)) theta theta - ()*cost_ J_all.((x, y, theta))theta, J_alldef (J_all, ): plt.() plt.(Cost) plt.plot(, J_all, m, 5) plt.show()def test(theta, x): x (x - mu)/std x (x - mu)/stdy theta theta*x theta*x print(Price of house:, y)x,y (.txt)y np.(y, (46,1))x np.((np.ones((x.shape,1)), x))theta np.zeros((x.shape, 1)) 0. , J_all (x, y, theta, , )J (x, y, theta)print(Cost:, J)print(:, theta)#for and cost jplot count 0for i in J_all: jplot.(i) .(count) count np.array(jplot) np.array()(jplot, )test(theta, )总结这就是线性回归的全部代码了。此刻, 你已然掌握了从无到有成功编写出线性回归模型的能力。要明白并编写出整套算法可不是件轻松的事儿, 你可能得时常回头去看才能全然理解。不过, 这些付出是有价值的, 线性回归往往是人们学习机器学习算法的首个步骤, 在此之后, 你能够挑选另一个适用于线性回归处理的数据集, 进而去尝试刚完成编写的算法。原文链接AAAI 2021进行线上分享, 其中涉及BERT模型蒸馏技术, 阿里云存在新方法, 对吧。在与阿里巴巴等机构开展合作、且被AAAI 2021收录的论文, 此论文名为《to for Data- BERT 》当中, 研究者们想出了一种针对跨域的自动数据增强办法, 该办法用于针对于数据稀缺这一领域去做扩充, 另外, 在多个各种不相同的任务上方, 该办法显著比当前最为新颖的基准更为优越。1月27日, 20:00的时候, 论文共同一作, 阿里云高级算法专家邱明辉, 为大家, 详细解读, 此研究。添加机器之心小助手备注「AAAI」进群一起看直播。
返回列表