一元线性回归

回归模型

回归最早是由英国科学家弗朗西斯高尔顿提出的。

现在回归是指:指研究一组随机变量(Y1 ,Y2 ,…,Yi)和另一组(X1,X2,…,Xk)变量之间关系的统计分析方法,又称多重回归分析。通常Y1,Y2,…,Yi是因变量,X1、X2,…,Xk是自变量。

我们最简单的理解就是构造出一个模型能极大的满足符合现在已经有的数据。

最简单的就是一元线性回归:

一元线性回归:

在这里插入图片描述
一元线性回归就是现在已有的散点图,构造出最合适的y = kx +b 去极大的满足符合所有的点,
运用代价函数我们不断的去调节k和b(斜率和截距)的大小 不断调制图像的大小和方向 去模拟出最适合的去符合数据,此时的代价函数值最小,我们这里斜率和截距用谁θ0,θ1来表示:在这里插入图片描述

在这里插入图片描述
我们的任务就是找到所有直线中最符合散点的一条

代价函数

在这里插入图片描述
代价函数就是使用每一个散点的真实值与预测值做差的平方的和在这里插入图片描述
所以我们找到最合适的直线就是找到当代价函数值最小的时候,θ0,θ1的值。代价函数中的1、2m就是为了我们在求导数的时候方便

如果我们想要去衡量线性相关性的强弱时,可以使用相关系数去判断:在这里插入图片描述
那么我们应该如何调整θ0,θ1才能让代价函数值达到最小,θ0,θ1每次变化的值和变化的方向是什么都是我们要考虑的,所以这里我们又引入 梯度下降法

梯度下降法

我们通过随意初始一个θ0,θ1的值,不断调整使其达到全局最小或者局部最小的值在这里插入图片描述
在这里插入图片描述
梯度下降法:在这里插入图片描述
在这里插入图片描述
J(θ0,θ1)还是我们上面确定的代价函数,学习率是我们每一次改变θ0,θ1值的步长,而求导则确定了我们变化的方向。
那么我们将代价函数和梯度下降法结合起来确定公式:在这里插入图片描述
在这里插入图片描述
θ1之所以后面还带着x(i)是因为
J(θ0,θ1) = θ0+θ1*x 对θ1求导是此处还需要分布求导会多出一个x。

注意:
1.梯度下降法可能会陷入局部最小值而不是全局最小值
2.学习率不能太小也不能太大
在这里插入图片描述

代码部分:

首先引入我们需要的包
import numpy as np
import matplotlib.pyplot as plt
引入数据集
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)
plt.show()

x_data 取的是数据集中所有行都取,第一列的数据
y_data 取的是数据集中所有行都取,第二列的数据

之后将散点图表示出来

构造代价函数和梯度下降算法函数
# 学习率
lr = 0.0001
# 截距和斜率
k =0
b = 0
#最大迭代次数
epochs = 50

# 代价函数
def compute_error(b,k,x_data,y_data):
    totalError = 0
    for i in range(0,len(x_data)):
        totalError += (y_data[i] - (x_data[i] * k + b)) ** 2
    return totalError/float(len(x_data))/2.0

# 总数据量
def gradient_runner(x_data,y_data,k,b,lr,epochs):
    m = float(len(x_data))
    for i in range(epochs):
        b_1 = 0
        k_1 = 0
        for j in range(0,len(x_data)):
              b_1 += (1/m)*(((k * x_data[j]) + b)-y_data[j])
              k_1 += (1/m) * (x_data[j]) * (((k * x_data[j]) + b)-y_data[j])
        b = b - (lr * b_1) 
        k = k - (lr * k_1)
    return b,k

compute_error是代价函数,代码形式就是将数学公式表达出来
在这里插入图片描述
gradient_runner是使用梯度下降算法利用代价函数求导
在这里插入图片描述

在经过不断寻找合适的θ0,θ1,我们可以自己看一看使用gradient_runner函数前后代价函数的值可以明显的看到变小了非常多
我们将最后的图像画出来:

b,k = gradient_runner(x_data,y_data,k,b,lr,epochs)
plt.plot(x_data,y_data,'b.')
plt.plot(x_data,k*x_data+b,'r')
plt.show()

最后画出来的图像,可以看到非常吻合了
在这里插入图片描述
使用sklearn实现:
对于sklearn不同的回归模型会不一样的,我们会在另一个博客专门去讲述sklearn

导入包:
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
导入并处理数据:
# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)
plt.show()
x_data = data[:,0,np.newaxis]   # np.newaxis 就是增加一个维度
y_data = data[:,1,np.newaxis]
创建并拟合模型
model = LinearRegression()
model.fit(x_data, y_data)
画图图像:
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data,model.intercept_ + x_data*model.coef_, 'r')
plt.show()

画出的图像和我们上面代码样子是一样的
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值