机器学习(一元线性回归)

一元线性回归模型

回归分析

        一元线性回归模型如下所示:(我们只需确定此方程的两个参数即可)

        第一个参数为截距,第二个参数为斜率

        为了求解上述参数,我们在这里引入代价函数(cost function),在这里以一元线性回归模型为例:
 

        上述式子为真实值与预测值之间的差值的平方(当然也可以取绝对值,但为便于后续数值操作取其平方),最后取所有训练集个数的平均值,结合下图直观理解。

         上述由一些参数构成的函数称为代价函数,我们的目标就是求解对应的参数使得代价函数达到最小值,最后确定模型:

 相关系数(了解)

        相关系数用于衡量线性相关性的强弱:

 决定系数(了解)

 梯度下降:用于确定所需参数

        其具体步骤如下图所示:

        此方法在一元线性回归中可以用于确定代价函数,因为代价函数是二维的(两个未知量,凸函数),所以理论上可以收敛于全局最小值(对于高次函数就可能达到局部最小值),如下图:

       对于初始化操作,一般情况下赋值为0即可。所谓的梯度优化,就是不断的更改参数值,使之最后到达一个全局(局部)最小值。

        这里的参数更新要求是同步更新,即最后在对参数进行更新,这里的α为学习率,通常取值为0.01,0.001,0.03,0.003等学习率不易过高也不能过低,当过高是会导致永远到达不了收敛点(发散),当过低时会导致收敛过慢,影响收敛速度;在这里的一元线性回归模型我们确定的参数只有两个,其参数求解方式如下图所示:


 实战

       方法一:梯度下降法

        步骤一:载入库

import numpy as np  #导入numpy
import matplotlib.pyplot as plt #导入图像绘制库

        步骤二:读取要进行回归的数据(以CSV为例)

#载入数据
#两列数据,逗号为分隔符
#数据和代码在同一目录下可以直接写文件名,否则要加路径
data=np.getfromtxt("data.csv",delimiter=",")  
x_data=data[:,0]
y_data=data[:,1]

        步骤三:算法编写

# 设置学习率(步长)和初始化线性参数
lr = 0.0001
b = 0 
k = 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] - (k * x_data[i] + b)) ** 2
    return totalError / float(len(x_data)) / 2.0

def gradient_descent_runner(x_data, y_data, b, k, lr, epochs):
    # 计算总数据量
    m = float(len(x_data))
    # 循环epochs次
    for i in range(epochs):
        b_grad = 0
        k_grad = 0
        # 计算梯度的总和再求平均
        for j in range(0, len(x_data)):
            b_grad += (1/m) * (((k * x_data[j]) + b) - y_data[j])
            k_grad += (1/m) * x_data[j] * (((k * x_data[j]) + b) - y_data[j])
        # 更新b和k
        b = b - (lr * b_grad)
        k = k - (lr * k_grad)
        # 每迭代5次,输出一次图像
        if i % 5==0:
            print("epochs:",i)
            plt.plot(x_data, y_data, 'b.')
            plt.plot(x_data, k*x_data + b, 'r')
            plt.show()
    return b, k

        第四步:调用,得到结果

b, k = gradient_descent_runner(x_data, y_data, b, k, lr, epochs)
print("After {0} iterations b = {1}, k = {2}, error = {3}".format(epochs, b, k, compute_error(b, k, x_data, y_data)))

       方法二:sklearn

        步骤一:调用库

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

        步骤二:载入数据

#载入数据
#这里的x_data和y_data需要增加维度,从(100,)变为(100,1),这是回归算法要求的
data=np.getfromtxt("data.csv",delimiter=",")  
x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]

         步骤三:创建并拟合模型

model = LinearRegression()
model.fit(x_data, y_data)
a=model.coef_   #系数
b=model.intercept_   #bias
# 画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, model.predict(x_data), 'r')
plt.show()


        这是我学习 覃秉丰老师的《机器学习算法基础》的自学笔记,课程在B站中的地址为:

机器学习算法基础-覃秉丰_哔哩哔哩_bilibili

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arvee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值