线性回归方程python代码,线性回归的python实现
在写这篇文章之前,首先我要对自己做一点反思。很多时候,在学习新技术的时候,看到出现了什么框架,有什么方法可以直接用在这个框架上。这样做的好处是可以减少我们写的代码量,几个函数可以帮助我们解决需要写几十行代码才能解决的问题。这个看起来不错,因为你对这个函数的底层有深入的研究。如果你是新手,第一次可能会在网上查资料,大概了解一下,但下次还是不会做。原因:知其然,而不知其所以然。
就我而言,我也有这个通病。为了能够:知其然,知其所以然。,我打算在学习机器学习算法的过程中,不调用机器学习函数库中的一些封装方法,通过纯Python实现。这篇文章算是我实践“知其然,知其所以然”这个想法的第一步。
好了,话不多说,进入正题。
线性回归,即一条直线可以准确描述数据之间的关系。这样,当新的数据出现时,可以预测一个简单的值。线性回归中最常见的问题是房价问题。
左图表示房价(纵坐标)和房间面积(横坐标)的关系,右图通过一条直线f=kx b表示房屋关系的预测,通过这条直线,我们可以大致知道房间面积对应的房价。
让我们通过一个具体的例子用Python实现一个简单的线性回归。
例如,我们有一组数据,其格式如下(数据地址):
我们用python绘制这些数据,如下所示:
那么我们需要做的就是找到一条直线,最大化的拟合这些点。理想情况下,所有点都落在直线上。我希望所有的点都最接近直线。为简单起见,将距离平方,误差可表示为
找到最符合数据的直线,也就是误差最小。我们通常使用最小二乘法。
上式中只有m和b未知,可以看m和b的一次二次方程,求损失问题就变成了求极值问题。这里就不赘述了。每个变量的偏导数为0。求方程的解。
然后我们用梯度下降法更新M和B。
在写算法之前,我们需要整理一下写作思路。回归模型的主要部分很简单,关键在于给定MSE损失函数后,如何基于梯度下降更新参数。首先需要写出模型的主体、损失函数和基于损失函数的参数推导结果,然后初始化参数,最后写出基于梯度下降法的参数更新过程。
将数组作为npimport matplotlib.pyplot作为工厂编号计算lossdef liner_loss(w,b,data): :param w:param b:param data:return: x=data[:0] #代表的是第一列数据y=data[:1] #代表的是第二列数据# 损失函数:使用的是均方误差(MES)损失损失=NP。sum((y-w * x-b)* * 2)/data。形状[0]#返回损失退货损失#计算梯度并更新参数def liner_gradient(w,b,data,lr): :param w:param b:param data:param lr:return: #数据集行数N=float(len(data)) #提取数据x=数据[:0] y=数据[:1] #求梯度dw=NP . sum(-(2/N)* x *(y-w * x-b))db=NP。sum(-(2/N)*(y-w * x-b))#更新参数w=w - (lr * dw) b=b - (lr * db) return w,b#每次迭代做梯度下降def optimer(data,w,b,lr,epcoh): :param data:param w:param b:param lr:param epcoh:训练的次数:为范围内的我返回:"(epcoh): #通过每次循环不断更新w,b的值w,b=liner_gradient(w,b,data,lr) #每训练100次更新下失败值if I % 100==0:print( epoch { 0 }:loss={ 1 }).格式(I,liner_loss(w,b,data)))返回w,b#绘图def plot_data(data,w,b): :param data:param w:param b: x=data[:0] y=data[:1] y_predict=w * x b plt.plot(x,y, o) plt.plot(x,y_predict, k-)PLT .show()def liner _ regression(): 构建模型 # 加载数据数据=NP。load txt( D:\ python-workspace \ Machine _ Learing \ Regression \ data。CSV ,分隔符=,)#显示原始数据的分布x=data[:0] y=data[:1] plt.plot(x,y, o) plt.show() #初始化参数lr=0.01 #学习率纪元=1000 #训练次数w=0.0 #权重b=0.0 #偏置# 输出各个参数初始值print( initial变量:\ n initial _ b={ 0 } \ n initial _ w={ 1 } \ n begin={ 2 } \ n .format(b,w,liner_loss(w,b,data))) #更新w和b w,b=optimer(data,w,b,lr,epoch) #输出各个参数的最终值打印(最终公式参数:\n b={1}\n w={2}\n结尾丢失={3} \n .format(epoch,b,w,liner_loss(w,b,data))) #显示plot_data(data,w,b)if _ _ name _ _== _ _ main _ _ :liner _ regression()然后我们运行,结果如下:
初始变量:
initial_b=0.0
初始w=0.0
开始时间的损失=184 .5868686868687
纪元0:损失=3.265436338536489
纪元100年:损失=1.4286548648767
纪元200年:损失=1.3668687868686
纪元300年:损失=1.3466973673861
纪元400年:损失=1.3333636363636
纪元500年:损失=1.3358678678687
纪元600年:损失=1.3388348003535365
纪元700年:损失=1.3267767876867
纪元800年:损失=1.3188786878881
纪元900年:损失=1。36860 .68868889861
最终配方参数:
b=1.2393038013472177
w=1.8672419688724071
终点损失=1.32926254992525777
好了,以上就是计算机编程语言实现的一个简单的线性回归。
不积跬步,无以至千里。加油!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。