1. 什么是线性回归
线性回归是利用最小二乘法,对一个或者多个自变量和因变量之间的关系进行建模的一种回归分析。
那么什么是回归,什么又是分类呢?
如果一个模型输出的是一个连续的值,比如说估计房子的面积,估计值可以是100.1,100.2也可以是100.3这种连续的值,那么这个模型就是回归分析,如果预测的值不是一个了连续的值,比如说估计房子的房间数,房间数只能是1, 2, 3,这种整数,不是连续的值,那么这个模型就是分类分析操作。
2. 直接来看代码
线性回归方程有很多中,例如: y = k x + b y=kx+b y=kx+b还有 y = a x 2 + b x + d y = ax^2 + bx +d y=ax2+bx+d这一篇博客我先进分析,如何自己实现一个线性回归方程使用梯度下降方法,下一篇会有如何实现一元二次方程的线性回归的实现和使用正规方程解实现的线性回归 一元二次方程。
# 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
%matplotlib inline
先使用sklearn库封装好的方法LinearRegression来实现线性回归方程,之后再进行手写实现线性回归,二者进行验证,以保证结果的正确性。
# 先给一些随机的数据
X = np.linspace(2, 10, 20).reshape(-1, 1)
y = np.random.randint(1, 6, size=1)*X + np.random.randint(-5, 5, size=1)
# 对y进行加盐操作
y += np.random.randn(20, 1)
plt.scatter(X,y,c='red')
# 实例化线性回归方程,得到 y=wx+b中w,b的值
lr = LinearRegression()
lr.fit(X,y)
w = lr.coef_[0, 0]
b = lr.intercept_[0]
print(w,b)
# 根据结果画出线性回归方程
plt.scatter(X,y)
x = np.linspace(0, 12, 50)
f = w*x + b
plt.plot(x, f(x), c='green')
首先你需要了解梯度下降,最小二乘法,和损失率,如果不懂可以看我的另一篇博客梯度下降,从上一图我们可以知道,可以画出无数条直线穿过那些点,但是,有那条线是最符合的呢?这儿我们使用最小二乘法,最开始我们已经得到了自己预测的结果,利用自己预测的结果减去真实的结果的最小的那个,也就是标准差最小时,我们就得到了最符合的线性代数方程。 m i n ∑ ∣ y 真 − y 预 测 ∣ 2 min\sum|y_真 - y_{预测}|^2 min∑∣y真−y预测∣2
接下来我们自己手动编写代码实现LinearRegression()的功能来实现线性回归
# 使用梯度下降,来解决一元以此的线性回归问题
class LinerModel(object):
def __init__(self):
self.w = np.random.randn(1)[0]
self.b = np.random.randn(1)[0]
def model(self, x): # 建立线性回归的模型
return self.w*x + b
def loss(self, x,y): # 计算损失率
cost = (y-self.model(x))**2
# 求偏导数,解 w,b
gradient_w = 2*(y-self.model(x))*(-x)
gradient_b = 2*(y-self.model(x))*(-1)
return cost,gradint_w, gradient_b
def gradient_descent(self, gradient_w,gradient_b,learning_rate=0.1):
# 使用梯度下降去更新 w,b的值直到符合要求
self.w -= gradient_w * learning_rate
self.b -= gradient_b * learning_rate
def fit(self, X,y):
count = 0 # 定义一个出口判断值
tol = 0.0001 # 预测值的精确度要求
last_w = self.w + 0.1
last_b = self.b + 0.1
length = len(X)
while True:
if count > 3000:
break
if(abs(last_w - self.w)< tol) and (abs(last_b - self.b)<tol):
break
cost = 0
gradient_w = 0
gradient_b = 0
for i in range(length):
cost_, gradient_w_, gradient_b_ = self.loss(X[i,0], y[i,0])
cost += cost_/length
gradient_w += gradient_w_/length
gradient_b += gradient_b_/length
print('执行次数%d,损失率是:%0.2f'%(count, cost))
last_w = self.w
last_b = self.b
# 更新截距和斜率
self.gradient_descent(gradient_w, gradient_b, learning_rate=0.01)
count += 1
def result(self):
return self.w,self,b
lm = LinerModel()
lm.fit(X,y)
w_,b_ = lm.result()
plt.scatter(X,y,c='red')
plt.plot(x,w_*x + b_,color='green')# 自己预测的线
plt.plot(x, w*x + b,color='blue') # 算法预测的线
plt.title('自定义的算法拟合曲线:',fontproperties='KaiTi')
可以看到我们自己预测的曲线和算法预测出的曲线已经完全的重合,说明我们自己实现的方法是正确的。
下一篇进行分析 一元二次方程 y = k x 2 + b x + d y = kx^2 + bx + d y=kx2+bx+d的模型的预测。
望您:
“情深不寿,强极则辱,谦谦君子,温润如玉”。