线性回归的目的是预测数值型的目标值。
对给定的样本点用直线(平面)进行拟合,求解最佳直线(平面)的过程,就是求解回归方程的过程。
图示说明:
1.一元线性回归
2.二元线性回归
例如:你想要预测的房价,可能会这么计算:y(房价),x(房价大小)
=1000+200∗
这就是所谓的回归方程(regression equation),其中的1000和200称作回归系数(regression weights)。
求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做预测就非常容易了。
具体的做法是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值y。
1.一元线性回归表达式
2.多元线性回归表达式
注:一元线性回归是特殊的多元线性回归
3.小结
<1>线性回归解决回归问题,即做出预测(目标变量是连续性问题)
<2>回归系数确定了,回归方程就确定了
<3>求回归系数的过程就是回归
1.代价函数就是为了求最佳直线,需要运用最小二乘法求最佳函数
2.最小二乘法的思想
目标是最小化误差平方和,从而找到最优模型。
通俗来讲,就是使得真实值和预测值(拟合值,模型给出的)之间的距离平方和最小化。
注最小误差
y为真实值,h(x)为预测值。
3.最小二乘法分为两类:
<1>.线性最小二乘法
<2>.非线性最小二乘法
经常使用数值方法来求解。数值方法包括:随机梯度下降或牛顿法等。
注:随机梯度下降也可以解决线性问题。
4.最小二乘法求解方法
<1>矩阵求导方法(标准方程法)
矩阵求导方法思想就是把目标函数划分为矩阵运算问题。
首先判断
是否为可逆矩阵。
如果可逆,将得到:
推导过程:
注:1.numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求行列式。
2.
<2>数值方法随机梯度下降(在逻辑回归部分求解回归方程就是使用该方法)
基本思路:对参数向量求导,使其梯度为0,然后得到参数变量的迭代更新公式
<3>数值方法牛顿法
利用泰勒公式展开,利用梯度和海塞矩阵进行迭代下降,速度很快。
变量以牛顿方法来下降。牛顿方向定义为:
逻辑回归处理分类问题,线性回归处理回归问题,这是两者的本质区别!
第一列为偏置项,第二列为特征值(自变量)x,第三列为因变量y。
ex0.txt 部分数据:
import numpy as np
import matplotlib.pyplot as plt
np.set_printoptions(threshold=np.inf) #显示全部行列的内容
dataSet=np.genfromtxt('ex0.txt')
x_data=dataSet[:,:-1]
y_data=dataSet[:,-1]
def plot():
plt.scatter(x_data[:,1],y_data)
plot()
plt.show()
def standRegres(xArr,yArr):
xMat=np.mat(xArr)
yMat=np.mat(yArr).T
xTx=xMat.T*xMat
if np.linalg.det(xTx)==0.0:
print('这个是矩阵是奇异矩阵,矩阵不可逆')
return
ws=(xTx).I*(xMat.T*yMat)
return ws
ws=standRegres(x_data,y_data)
print(ws)
yHat=x_data*ws
plt.plot(x_data[:,1],yHat,c='r')
plot()
plt.show()
案列总结:
1.用genfromtxt函数读取文件并划分为x_data,y_data,为了画关于x_data[1]和y_data的散点。
2.定义standRegres函数,先将数组转变为矩阵,方便运算;判断xTx是否为奇异矩阵,若是则进行 ws=(xTx).I*(xMat.T*yMat)
3.写出预测函数,画出直线。
注:想了解sklearn里面的线性回归点击这里