天天看点

四、(机器学习)-LinearRegression线性回归(二)

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]))
           
四、(机器学习)-LinearRegression线性回归(二)

我们先用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'
           
四、(机器学习)-LinearRegression线性回归(二)

自己手写代码实现,拟合多属性,多元方程

# 自己手写代码实现,拟合多属性,多元方程
# 使用方法是梯度下降的思想
# 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')
           
四、(机器学习)-LinearRegression线性回归(二)

从上图可以看出,我们自己预测的w1, w2, b 羧化出的图形,与learnregression算法所预测的结果基本一致。

当然实际的生活中处理的数据当然不会只有两个参数,一定会是更多的,但是他们的处理思想是相通的,只是在算法的选择方面会有很多的不同,尤其是数据的预处理阶段,感觉是数据分析中最重要的部分,之后会陆续分享一些 集成算法,像 决策数, 随机森林, 极限森林,Ridge, Lasso,逻辑斯蒂归,xgbosst, LIGHTGbm 等等算法。

在此给大家推荐几个联系数据分析的平台:

天池短租

工业蒸汽量预测

望您:

“情深不寿,强极则辱,谦谦君子,温润如玉”。

继续阅读