三、(机器学习)-LinearRegression线性回归(一)

LinearRegression线性回归(一)

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')

img

# 实例化线性回归方程,得到 y=wx+b中w,b的值
lr = LinearRegression()
lr.fit(X,y)
w = lr.coef_[0, 0]
b = lr.intercept_[0]
print(w,b)

img

# 根据结果画出线性回归方程
plt.scatter(X,y)
x = np.linspace(0, 12, 50)
f = w*x + b
plt.plot(x, f(x), c='green')

Linear
首先你需要了解梯度下降,最小二乘法,和损失率,如果不懂可以看我的另一篇博客梯度下降,从上一图我们可以知道,可以画出无数条直线穿过那些点,但是,有那条线是最符合的呢?这儿我们使用最小二乘法,最开始我们已经得到了自己预测的结果,利用自己预测的结果减去真实的结果的最小的那个,也就是标准差最小时,我们就得到了最符合的线性代数方程。 m i n ∑ ∣ y 真 − y 预 测 ∣ 2 min\sum|y_真 - y_{预测}|^2 minyy2
接下来我们自己手动编写代码实现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

模型已经创建完毕,接下来进行数据的分析得到w,b
w,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')

img
可以看到我们自己预测的曲线和算法预测出的曲线已经完全的重合,说明我们自己实现的方法是正确的。

下一篇进行分析 一元二次方程 y = k x 2 + b x + d y = kx^2 + bx + d y=kx2+bx+d的模型的预测。


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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值