百日筑基篇——线性回归算法(python机器学习算法)

百日筑基篇——线性回归算法(python机器学习算法)


前言

Python是一种广泛应用于机器学习的编程语言,有很多强大的机器学习算法可以使用。今天就先介绍一下基础的线性回归算法。

一、线性回归介绍

线性回归是一种用于建立变量之间线性关系的统计模型。
它通过拟合一个线性方程来预测一个因变量(也称为响应变量)与一个或多个自变量(也称为特征)之间的关系。线性回归可以用于预测连续型变量的值。

二、线性回归算法原理

1. 数学公式

y = w0 + w1x1 + w2x2 + … + wn*xn
#y是因变量, x1, x2, …, xn是自变量, w0, w1, w2, …, wn是模型的参数,表示自变量对因变量的影响。(w0是偏置项,w1, w2, …, wn则为权重项)

设x0 = 1 ; 则有 y = w0x0 + w1x1 + w2x2 + … + wnxn
如此可将数据转换为矩阵形式:(数据为虚构)

x0x1x2xn
1568656
1785667
1675498

整合可得:在这里插入图片描述
既向量和矩阵相乘

2. 线性回归目标

线性回归的目标是找到一组参数w0, w1, w2, …, wn,使得模型预测值与实际观测值之间的差异最小化。这个差异通常使用最小二乘法来计算,即最小化预测值与观测值之间的平方差。

为了找到最优的参数值,可以使用梯度下降等优化算法来最小化损失函数(即预测值与观测值之间的差异)。梯度下降算法通过迭代更新参数值,使得损失函数逐渐减小,直到达到最小值。

3. 误差

真实值和预测值之间的差异,用 ε 表示
对于每一个样本有:

在这里插入图片描述
误差ε (真实值 - 预测值) 是独立并且服从相同的分布。并且服从均值u=0,方差为 σ² 的高斯分布(正态分布)。故有:

请添加图片描述
代入得
在这里插入图片描述

4. 最小二乘法

让误差的平方和最小估计出来的模型最接近真实情形。
首先,我们的目的是通过一组观测得到的样本去估计出模型的参数
ε ∈ N(0,σ²)

从概率统计的角度,将观测样本看作随机变量
请添加图片描述

极大似然估计: 最大化当前这个样本集发生的概率,专业点说就是最大化似然函数,而似然函数就是样本的联合概率。由于我们通常都会假设样本是相互独立的,因此联合概率就等于每个样本发生的概率乘积
一般来说,我们会对似然函数取 log,以将连乘变成累加,主要有两个目的:防止溢出和方便求导
故可以说,最小二乘法其实就是误差满足正态分布的极大似然估计
J(w) 函数为损失函数,去衡量模型预测值与真实值之间的距离

5. 梯度下降方法

梯度下降算法通过迭代更新参数值,使得损失函数逐渐减小,直到达到最小值。

下面图片中的 θ 应该为 W ( 不小心写错了) 。
请添加图片描述

三. 简单代码介绍

  1. 初始化参数w0, w1, w2, …, wn为0或随机值。
  2. 计算模型的预测值y_pred = w0 + w1x1 + w2x2 + … + wn*xn。
  3. 计算损失函数(预测值与观测值之间的差异)。
  4. 计算损失函数对每个参数的偏导数,即梯度。
  5. 更新参数值:wi = wi - learning_rate * gradient_i,其中learning_rate是学习率,用于控制参数更新的步长。
  6. 重复步骤2-5,直到达到停止条件(如达到最大迭代次数或损失函数的变化小于某个阈值)。

1. 自定义代码


import numpy as np

# 生成训练数据
# 建了一个二维的NumPy数组(即一个矩阵),其中包含10行2列的数据
X = np.array([[1, 3], [2, 5], [3, 7], [4, 9], [5, 11], [6, 13], [7, 15], [8, 17], [9, 19], [10, 21]])
# 生成标记量
y = np.array([5, 8, 11, 14, 17, 20, 23, 26, 29, 32])

# 添加偏置项
X = np.insert(X, 0, 1, axis=1)  # axis=1表示在列上插入,0表示在矩阵X的第0列,1表示插入值为1

# 初始权重
w = np.zeros(X.shape[1], )  
# 使用np.zeros()可以创建一个元素全部为0的NumPy数组,其大小为(X.shape[1], ),即包含 X.shape[1] 个元素,这是我们权重向量的大小。
# 这个权重向量将在后面的梯度下降算法中不断更新,以寻找能够最小化预测误差的最优参数值。

# 定义学习率和迭代次数
alpha = 0.00000001
epochs = 10000000

# 梯度下降求解权重
for i in range(epochs):
    y_pred = np.dot(X, w)  # 计算预测值
    error = y_pred - y
    gradient = np.dot(X.T, error) / len(y)  # 计算梯度gradient,即误差对于权重的导数;
    w -= alpha * gradient  # 使用学习率alpha和梯度gradient来更新权重向量w。

# 预测新数据
X_new = np.array([[1, 12], [1, 14], [1, 16]])
X_new = np.insert(X_new, 0, 1, axis=1)  # 添加偏置项
y_pred_new = np.dot(X_new, w)  # 它可以用于计算两个一维或多维数组之间的点积,或者将矩阵与向量相乘。
# 这里我们用训练好的模型来预测

#输出预测值,以及相关模型参数
print(y_pred_new)
print("Linear Regression Model:")
print("Intercept:", w[0])
print("Coefficients:", w[1:])

整理为一个函数:

import numpy as np


def xianxing_huigui(X, y, alpha, epochs, X_new):
    X = np.insert(X, 0, 1, axis=1)
    w = np.zeros(X.shape[1], )
    for i in range(epochs):
        y_pred = np.dot(X, w)  # 计算预测值
        error = y_pred - y
        gradient = np.dot(X.T, error) / len(y)  # 计算梯度gradient,即误差对于权重的导数;
        w -= alpha * gradient
    X_new = np.insert(X_new, 0, 1, axis=1)  # 添加偏置项
    y_pred_new = np.dot(X_new, w)  # 它可以用于计算两个一维或多维数组之间的点积,或者将矩阵与向量相乘。
    # 这里我们用训练好的模型来预测

    print(y_pred_new)
    print("Linear Regression Model:")
    print("Intercept:", w[0])
    print("Coefficients:", w[1:])

2. python自带模块

# 引用库中函数
from sklearn.linear_model import LinearRegression

# 创建线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X, y)

# 预测
y_pred = model.predict(X_new)
print(y_pred)

总结

线性回归算法的深度学习,要理解最小二乘法,损失函数,梯度下降方法以及矩阵运算等原理,当然也可以直接应用python中的模块。
大鹏一日同风起,扶摇直上九万里。

-2023-7-8 筑基篇

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星石传说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值