Python建立线性回归算法
前言
线性回归(Linear Regression )是机器学习的基础,作为机器学习算法的基础,后人在此基础上进化出了各种更加精确有效的算法。
1线性回归的基本原理
线性回归是使用一系列特征的线性组合来拟合目标值。 “假设函数”(hypothesis function )表示为:
x是mn的特征矩阵,是特征参数矩阵,线性回归学习的目标是得到一组拟合的向量值。
以下,使用基于比较的最小二乘法、梯度下降法求出矢量值。 数据量少时使用最小二乘法
a .最小二乘法
为了求出上式的最佳解,在线性回归中需要将观测结果y和预测结果y’的差设为目标函数j() :
当j()等于某最小值时
要推导参数,需要:
b .坡度下降法
定义简单的成本函数。
表示第I个数据的要因变量(特征)、
表示第I个数据的参数(观察结果)。
参数更新:
在每次更新时使用所有数据,因此将该方法称为“批量”梯度下降法。 与随机梯度下降法(SGD )相比,该方法易于局部优化。 另外,使用梯度下降法时要注意将自变量(特征)正规化。 例如,年龄和身高明显不是同一个尺度,如果不规范化则采用相同的学习率效果较差。
二维码实现
代码地址: https://github.com/hznu1/writing-machine-learning-algorithms-in-python
仅显示算法的一部分:
a .最小二乘法
import numpy as np
class LinearRegression_1:
def __init__(self,x,y ) :
self.x=NP.mat(x )
self.y=NP.mat(y ) ) )
def注册(self ) :
添加#系数0,赋予它的参数为1
theta0=NP.Ones () Len(data ),1 ) )
(self.x=NP.h堆栈() (self.x,theta0) ) ) ) ) )。
x_T=self.x.T #计算x矩阵的倒置矩阵
self.theta=(x_t*self.x ).I * x_T * self.y.T #最小二乘法参数向量
efpredict(self,vec ) :
vec=NP.mat(vec ) )
VEC0=NP.ones((Len ) ) vec ),1 ) )
vec=NP.h堆栈((vec,vec0) ) )
estimate=NP.matmul(vec,self.theta ) #点乘
返回时间
b .坡度下降法
import numpy as np
class LinearRegression_2:
def __init__(self ) :
self._theta=None
#自变量x、变量y、学习率learning_rate (默认值0.0001 )、迭代次数(默认值10000次) )。
effit_GD(self,x,y,learning_rate=0.0001,n_iters=1e4 ) :
#成本函数
defj(Theta,x,y ) :
try:
returnNP.sum((y-x.dot ) ) *2)/(len ) y ) )
except:
返回浮动(INF )。
#成本函数的偏导数
defDJ(Theta,x,y ) :
returnx.t.dot(x.dot(theta )-y )/len(y ) y ) )。
#坡度下降
ef梯度_ descent (x,y,initial_theta,learning_rate,n_iters=1e4,epsilon=1e-8 ) :
theta=initial_theta
cur_iter=0
#遍历
while cur_iter n_iters:
梯度=DJ (theta,x,y ) )。
last_theta=theta
theta=theta-learning _ rate * gradient
#收敛条件本次迭代与上次迭代之差小于epsilon=1e-8
if(ABS(j(Theta,x,y )-j ) last_Theta,x,y ) ) epsilon ) :
布雷克
cur_iter =1
返回以太网
添加#系数0,赋予它的参数为1
x=NP.h堆栈([ NP.ones () Len ),1 ),x ) ]
#初始teta值全部为0的1n数组
initial _ theta=NP.zeros (x.shape [1]
self._theta=gradient_descent(x,y,initial_theta,learning_rate,n_iters ) )。
返回自助
efpredict(self,X_predict ) :
x=NP.h堆栈([ NP.ones ] (len (x_predict ),1 ) ],x _ predict () ) ) ) ) )。
returnx.dot(self._theta ) )。