LinearRegression线性回归(二)
一、 上一篇我们手写代码实现了一元一次的线性回归方程的实现,这里我们实现一元多次方程的线性回归方程的实现。
假设方程为一元二次 y = k x 2 + b y = kx^2 + b y=kx2+b
我们知道线性回归都都是取处理一些一次的方程, 如果要是未知变量的幂大于1,那么得出的结果也就不是线性的,但是我们可以去进行问题的转换,可以假设 t = x 2 t = x^2 t=x2 y = k t + b y = kt + b y=kt+b 这样我们就把问题继续转换为一元一次的方程。
二、 直接来看代码
# 导包
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression
X = np.linspace(0, 10, num = 500).reshape(-1, 1)
# 将参数转换为二次方
X = np.concatenate([X**2, X], axis=1)
X.shape
# 自己先构造一个函数
w = np.random.randint(1, 10, size=2)
b = np.random.randint(-5, 5, size=1)
# 构造函数
y = X.dot(w) + b
plt.plot(X[:,1], y, color='r')
plt.title('w1:%d, w2:%d, b:%d'%(w[0],w[1],b[0]))
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLwEEVPBTRU50dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxkzN1ATN0kTM4ITMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
我们先用learnregression算法进行预测,然后在将结果与自己手写实现的结果进行比较,这样才能判断我们的结果是否正确。
# 直接使用sklearn中LinearRegression进行预测
lr = LearnRegression()
lr.fit(X,y)
print(lr.coef_, lr.intercept_)
# plt.scatter(X[:, 1], y, marker='*')
x = np.linspace(-2, 12, 100)
plt.plot(x, lr.coef_[0]*x**2 + lr.coef_[1]*x + lr.intercept_), color='green'
自己手写代码实现,拟合多属性,多元方程
# 自己手写代码实现,拟合多属性,多元方程
# 使用方法是梯度下降的思想
# epoch 训练的次数
# X,y 训练数据, lr 学习率 epoch 自定义训练次数, w,b 参数的预测范围
def gradient_descent(X, y, lr, epoch, w, b):
batch = len(X)
for i in range(epoch):
d_loss = 0 # 损失函数
dw = [0 for _ in range(len(w))] # 斜率
db = 0 # 截距
for j in range(batch):
y_ = 0 # 预测的值
# 将方程 f(x) = w1 + x1**2 +w2*x2 + b 分部运行
for n in range(len(w)):
y_ += X[j][n]*w[n]
y_ += b
# (y - y_)**2 ---> 2*(y-y_)*(-1)
# (y_ - y)**2 ---> 2*(y_ - y)*(1)
d_loss = -(y[j] - y_)
for n in range(len(w)):
dw[n] += X[j][n]*d_loss/float(batch)
db += 1*d_loss/float(batch)
# 更新系数和截距,梯度下降
for n in range(len(w)):
w[n] -= dw[n]*lr[n]
b -= db*lr[0]
return w,b
设定运行 5000 次梯度下降, 如果w1,w2到达符合要求的值的范围,比如说 精确率已经达到了0.001 但是此时还在循环执行梯度下降怎么办?
如果已经达到了,继续执行只会在符合要求的点的周围左右颠倒执行,结果也是符合要求的。
lr = [0.001, 0.001] # 参数w1 和 w2的学习率
w = np.random.randn(2)
b = np.random.randn(1)[0]
w_,b_ = gredient_descent(X, y, lr, 5000, w, b)
print(w_, b_)
plt.scatter(X[:1), y, marker='*')
x = np.linspace(-2, 12, 100)
f = lambda x:w_[0]*x**2 + w_[1]*x + b_
plt.plot(x, f(x), color='green')
从上图可以看出,我们自己预测的w1, w2, b 羧化出的图形,与learnregression算法所预测的结果基本一致。
当然实际的生活中处理的数据当然不会只有两个参数,一定会是更多的,但是他们的处理思想是相通的,只是在算法的选择方面会有很多的不同,尤其是数据的预处理阶段,感觉是数据分析中最重要的部分,之后会陆续分享一些 集成算法,像 决策数, 随机森林, 极限森林,Ridge, Lasso,逻辑斯蒂归,xgbosst, LIGHTGbm 等等算法。
在此给大家推荐几个联系数据分析的平台:
天池短租
工业蒸汽量预测
望您:
“情深不寿,强极则辱,谦谦君子,温润如玉”。