第二章.线性回归以及非线性回归—一元线性回归

第二章.线性回归以及非线性回归

2.5 一元线性回归

1.流程:

  • 初始化θ0,θ1

  • 不断改变θ0,θ1,直到J(θ0,θ1)到达一个全局最小值或局部极小值

2.图像分析:

在这里插入图片描述

1).图像层面分析代价函数:

①.红色区域表示代价函数的值比较大,蓝色区域表示代价函数的值比较小

②.先给(θ0,θ1)赋一个初始值,然后进行迭代(就是求导,得到一个梯度方向)得到下一个点,不断迭代优化,直到J(θ0,θ1)到达一个全局最小值,最小值所对应的(θ0,θ1)就是我们所求的值

2).梯度下降法内部循环执行的函数:(当前步到下一步的计算函数)

①.公式
在这里插入图片描述
参数说明:
:= :相当于赋值
α:学习率,控制梯度下降法的运动步长 [学习率不能太大(有可能一直循环,找不到最小值),也不能太小(耗时长),可以多尝试一些值]
在这里插入图片描述

②.更新(θ0,θ1)的方法
在这里插入图片描述

3.梯度下降法的缺点:

在这里插入图片描述
在这里插入图片描述

缺点: 初始值(θ0,θ1)的选取位置不同,可能会导致J(θ0,θ1)找不到全局最小值,会找到局部极小值。

4.梯度下降法求解线性回归

1).公式:在这里插入图片描述

①.求导之后的公式:
在这里插入图片描述

2).非凸函数和凸函数:

在这里插入图片描述
非凸函数:使用梯度下降法可能会存在多个局部极小值,不太适合使用梯度下降法

凸函数:只存在一个全局最小值,比较适合使用梯度下降法

3).线性回归的代价函数是凸函数:

在这里插入图片描述

初始值(θ0和θ1)无论怎么选择,使用梯度下降法进行优化都会找到全局最小值,没有局部极小值,线性回归比较适合梯度下降法

5.梯度下降法的优化过程:在这里插入图片描述

6.实战1: 梯度下降法—一元线性回归:

1).CSV中的数据:

  • data.xlsx
  • 上传文件为excel文件,需转换成csv文件使用

2).代码

import numpy as np
import matplotlib.pyplot as plt

# 载入数据
data = np.loadtxt('D:\\Data\\data.csv', delimiter=',')
x_data = data[:, 0]
y_data = data[:, 1]
plt.scatter(x_data, y_data)
plt.show()

# 学习率learning rate
lr = 0.0001
# 截距
b = 0
# 斜率
k = 0
# 最大迭代次数
epochs = 50


# 代价函数:最小二乘法
def comuter_error(b, k, x_data, y_data):
    totalError = 0
    for i in range(0, len(x_data)):
        totalError += (y_data[i] - (k * x_data[i] + b)) ** 2
    return totalError / float(len(x_data)) / 2.0  # 2除不除都可以,之前的文档有说明


# 梯度下降法
def gradient_descent(x_data, y_data, k, b, lr, epochs):
    # 总的数据量
    m = float(len(x_data))

    for i in range(epochs):
        grad_b = 0
        grad_k = 0
        for j in range(0, len(x_data)):
            grad_b += (1 / m) * ((k * x_data[j] + b) - y_data[j])
            grad_k += (1 / m) * x_data[j] * ((k * x_data[j] + b) - y_data[j])
            # 更新b,k
        b = b - lr * grad_b
        k = k - lr * grad_k

    #         #每循环10次输入一次图像
    #         if i%10==0:
    #             plt.plot(x_data,y_data,'b.')
    #             plt.plot(x_data,k * x_data + b,'r')
    #             plt.show()

    return k, b


print('初始参数 b={0},k={1},error={2}'.format(b, k, comuter_error(b, k, x_data, y_data)))
k, b = gradient_descent(x_data, y_data, k, b, lr, epochs)
print('结果参数 b={0},k={1},error={2}'.format(b, k, comuter_error(b, k, x_data, y_data)))
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, k * x_data + b, 'r')
plt.show()

示:
①.数据

在这里插入图片描述

②.图像
请添加图片描述

7.实战2: sklearn—一元线性回归:

1).CSV中的数据:

  • data.xlsx
  • 上传文件为excel文件,需转换成csv文件使用

2).代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 载入数据
data = np.loadtxt('D:\\Data\\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]
y_data = data[:, 1, np.newaxis]

# 创建并拟合模型
model = LinearRegression(copy_X=True, fit_intercept=True)
model.fit(x_data, y_data)

# 截距
b = model.intercept_
print('截距:', b)

# 回归系数
k = model.coef_
print('回归系数(斜率):', k)

# 画图
plt.scatter(x_data, y_data, s=10)
plt.plot(x_data, model.predict(x_data), 'r')
plt.show()

3).结果展示:

①.数据

在这里插入图片描述

②.图像
请添加图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值