单变量线性回归的机器学习代码

这篇具有很好参考价值的文章主要介绍了单变量线性回归的机器学习代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文为学习吴恩达版本机器学习教程的代码整理,使用的数据集为https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/f2757f85b99a2b800f4c2e3e9ea967d9e17dfbd8/code/ex1-linear%20regression/ex1data1.txt

将数据集和py代码放到同一目录中,使用Spyder打开运行,代码中整体演示了数据加载处理过程、线性回归损失函数计算方法、批量梯度下降方法、获得结果后的预估方法、线性回归结果函数绘制、模型导出及加载使用方法,其中最后三部分彼此无依赖关系可单独执行。详细代码为下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import joblib

# 导入数据
path =  'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])

"""
计算线性回归模型的损失值
"""
def computeCost(X, y, theta):
    """
    此函数计算给定参数 theta 下的均方误差损失。它用于评估线性回归模型预测值与实际值之间的差异。
    损失值越小,表明模型的预测越准确。

    Parameters:
    X : numpy.ndarray 表示特征数据集的矩阵,其中包含了模型用于预测的特征。
    y : numpy.ndarray 表示目标变量的向量,包含了每个数据点的实际值。
    theta : numpy.ndarray 线性回归模型的参数向量,包括截距项和特征的系数。

    Returns:
    float 返回计算得到的均方误差损失值。
    """

    # 计算模型预测值和实际值之间的差异
    inner = np.power(((X * theta.T) - y), 2)

    # 计算并返回均方误差损失的平均值
    return np.sum(inner) / (2 * len(X))

# 在数据集前面加入一列全为1的数据,用于适配截距项
data.insert(0, 'Ones', 1)

# 分离特征(X)和目标变量(y)
cols = data.shape[1]
X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列
y = data.iloc[:,cols-1:cols]#X是所有行,最后一列

# 将X和y的类型转换为numpy矩阵,方便后续计算
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))# 初始化theta

# 计算初始的损失值,仅为输出和最终损失对比
initial_cost = computeCost(X, y, theta)
print("初始的损失值:", initial_cost)

"""
执行批量梯度下降
"""
def gradientDescent(X, y, theta, alpha, iters):
    """
    这个函数通过迭代地调整参数 theta,以最小化损失函数。

    Parameters:
    X : numpy.ndarray 特征数据集矩阵。
    y : numpy.ndarray 目标变量向量。
    theta : numpy.ndarray 线性回归模型的初始参数向量。
    alpha : float 学习率,控制梯度下降的步长。
    iters : int 梯度下降的迭代次数。

    Returns:
    tuple 返回一个元组,包含优化后的 theta 和每次迭代的损失值数组。
    """

    # 初始化一个临时变量,用于更新 theta
    temp = np.matrix(np.zeros(theta.shape))

    # 获取 theta 中参数的数量
    parameters = int(theta.ravel().shape[1])

    # 初始化一个数组,用于记录每次迭代的损失值
    cost = np.zeros(iters)
    
    # 迭代进行梯度下降
    for i in range(iters):
        # 计算当前参数下的误差
        error = (X * theta.T) - y
        
        # 对每个参数进行更新
        for j in range(parameters):
            # 计算误差与特征值的乘积
            term = np.multiply(error, X[:,j])
            
            # 更新 theta 的第 j 个参数
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
            
        # 更新 theta
        theta = temp

        # 记录当前的损失值
        cost[i] = computeCost(X, y, theta)
        
    # 返回优化后的参数和损失值记录
    return theta, cost

# 设置学习率和迭代次数
alpha = 0.01
iters = 2000

# 执行梯度下降算法,优化theta
g, cost = gradientDescent(X, y, theta, alpha, iters)

# 计算优化后的损失值,仅为输出和初始损失对比
final_cost = computeCost(X, y, g)
print("优化后的损失值", final_cost)

"""
使用需要预测的数据X进行预测
"""
# 假设的人口数据
population_values = [3.5, 7.0]  # 代表35,000和70,000人口

# 对每个人口值进行预测
for pop in population_values:
    # 将人口值转换为与训练数据相同的格式(包括截距项)
    predict_data = np.matrix([1, pop])  # 添加截距项

    # 使用模型进行预测
    predict_profit = np.dot(predict_data, g.T)
    print(f"模型预测结果 {pop} : {predict_profit[0,0]}")


"""
使用模型绘制函数
"""
# 创建预测函数
x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = g[0, 0] + (g[0, 1] * x)

# 绘制线性回归结果
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')# 绘制预测线
ax.scatter(data.Population, data.Profit, label='Traning Data')# 绘制训练数据点
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

"""
使用模型绘制损失值变化曲线
"""
# 绘制损失函数的变化
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost, 'r') # 损失值随迭代次数的变化
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

"""
保存模型
"""
# 保存模型
joblib.dump(g, 'linear_regression_model.pkl')

"""
加载模型并执行预测
"""
# 加载模型
loaded_model = joblib.load('linear_regression_model.pkl')

# 假设的人口数据
population_values = [3.5, 7.0]  # 代表35,000和70,000人口

# 使用模型进行预测
for pop in population_values:
    # 更新预测数据矩阵,包括当前的人口值
    predict_data = np.matrix([1, pop])
    
    # 进行预测
    predict_value = np.dot(predict_data, loaded_model.T)
    print(f"加载模型预测结果 {pop} : {predict_value[0,0]}")

运行后结果:
单变量线性回归的机器学习代码,AI,线性回归,机器学习,算法
单变量线性回归的机器学习代码,AI,线性回归,机器学习,算法
输出结果:

初始的损失值: 32.072733877455676
优化后的损失值 4.47802760987997
模型预测结果 3.5 : 0.349676138927709
模型预测结果 7.0 : 4.487420850578528
加载模型预测结果 3.5 : 0.349676138927709
加载模型预测结果 7.0 : 4.487420850578528

上一个版本的线性回归算法是依据批量梯度下降公式过程计算出来的,但实际上直接使用矩阵来计算能够极大提升效率,代码如下:文章来源地址https://www.toymoban.com/news/detail-753351.html

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import joblib

# 导入数据
path = 'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])

# 分离特征和目标变量
X = data.iloc[:, 0:1].values  # Population列
y = data.iloc[:, 1].values  # Profit列
m = len(y)  # 样本数量

# 添加一列全为1的截距项
X = np.append(np.ones((m, 1)), X, axis=1)

# 初始化模型参数
theta = np.zeros(2)

# 批量梯度下降参数
alpha = 0.01  # 学习率
iterations = 1500  # 迭代次数

# 批量梯度下降算法
def gradientDescent(X, y, theta, alpha, num_iters):
    m = len(y)  # 获取样本数量

    for i in range(num_iters):  # 对于指定的迭代次数
        # 计算当前theta下的预测值。这是通过矩阵X(特征)和theta(参数)的点积来完成的。
        predictions = X.dot(theta)
        # 计算预测值和实际值之间的误差。
        errors = np.subtract(predictions, y)
        # 计算梯度:首先,计算特征矩阵X的转置和误差的点积;
        # 然后,乘以学习率alpha和样本数量的倒数。
        sum_delta = (alpha / m) * X.transpose().dot(errors)
        # 更新参数theta:从当前theta中减去梯度(乘以学习率)。
        theta = theta - sum_delta  
    return theta  # 在完成所有迭代后,返回最终的参数theta。


# 进行梯度下降以拟合模型
theta = gradientDescent(X, y, theta, alpha, iterations)

"""
使用需要预测的数据X进行预测
"""
# 假设的人口数据
population_values = [3.5, 7.0]  # 代表35,000和70,000人口

# 对每个人口值进行预测
for pop in population_values:
    # 将人口值转换为与训练数据相同的格式(包括截距项)
    predict_data = np.matrix([1, pop])  # 添加截距项

    # 使用模型进行预测
    predict_profit = np.dot(predict_data, theta.T)
    print(f"模型预测结果 {pop} : {predict_profit[0,0]}")
"""
使用模型绘制函数
"""
# 创建预测函数
x_values = np.array(X[:, 1])
f = theta[0] + (theta[1] * x_values)

# 绘制图表
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(x_values, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Training Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

"""
保存模型
"""
# 保存模型
joblib.dump(theta, 'linear_regression_model.pkl')

"""
加载模型并执行预测
"""
# 加载模型
loaded_model = joblib.load('linear_regression_model.pkl')

# 假设的人口数据
population_values = [3.5, 7.0]  # 代表35,000和70,000人口

# 使用模型进行预测
for pop in population_values:
    # 更新预测数据矩阵,包括当前的人口值
    predict_data = np.matrix([1, pop])
    
    # 进行预测
    predict_value = np.dot(predict_data, loaded_model.T)
    print(f"模型预测结果 {pop} : {predict_value[0,0]}")

到了这里,关于单变量线性回归的机器学习代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习——多元线性回归算法

    多元线性回归算法,即多特征量线性回归算法,用多个特征量来进行预测,如这里用多个特征量(房子面积、卧室数量、房屋楼层数、房子年龄)来预测房子的售价问题 假如有一个多特征量的机器学习问题,并且这个问题中的多个特征可以在一个相近的范围内取值,那么可以

    2024年02月22日
    浏览(45)
  • 机器学习(六):回归分析——鸢尾花多变量回归、逻辑回归三分类只用numpy,sigmoid、实现RANSAC 线性拟合

    [ 实验1 回归分析] 一、 预备知识 使用梯度下降法求解多变量回归问题 数据集 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例。数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、

    2023年04月13日
    浏览(80)
  • 【AI】机器学习——线性模型(逻辑斯蒂回归)

    逻辑回归输出的是实例属于每个类别的似然概率,似然概率最大的类别就是分类结果 在一定条件下,逻辑回归模型与朴素贝叶斯分类器等价 多分类问题可以通过多次二分类或者Softmax回归解决 3. 线性回归模型 4.4 线性分类模型——感知器 目标:用判别模型解决分类问题 4.1.

    2024年02月09日
    浏览(42)
  • 机器学习~从入门到精通(二)线性回归算法和多元线性回归

    SimpleLinearRegression.py moduel_selection.py draft.py lin_fit(x,y) lin_fit2(x,y) x.shape y.shape MSE mean squared error 均方误差 R squared error

    2024年02月01日
    浏览(68)
  • 【机器学习】十大算法之一 “线性回归”

      作者主页: 爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主 爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域. https://blog.csdn.net/Code_and516?type=blog 个人简介:打工人。 持续分

    2024年02月09日
    浏览(36)
  • 机器学习算法:线性回归、逻辑回归、决策树和随机森林解析

    引言 机器学习算法是人工智能领域的核心,它们用于解决各种问题,从预测房价到图像分类。本博客将深入探讨四种常见的机器学习算法:线性回归、逻辑回归、决策树和随机森林。 线性回归 什么是线性回归? 线性回归是一种用于建立连续数值输出的机器学习模型的算法。

    2024年02月10日
    浏览(49)
  • 机器学习算法实战(scikit-learn版本)---线性回归

    目录 文章目标: 1,导入库  2,导入数据集 3,缩放/归一化训练数据 4,创建并拟合回归模型 5,查看参数 6,预测 7,可视化  有一个开源的、商业上可用的机器学习工具包,叫做[scikit-learn](https://scikit-learn.org/stable/index.html)。这个工具包包含了你在本课程中要使用的许多算法的实

    2024年02月05日
    浏览(39)
  • 【算法小记】——机器学习中的概率论和线性代数,附线性回归matlab例程

    内容包含笔者个人理解,如果错误欢迎评论私信告诉我 线性回归matlab部分参考了up主DR_CAN博士的课程 在回归拟合数据时,根据拟合对象,可以把分类问题视为一种简答的逻辑回归。在逻辑回归中算法不去拟合一段数据而是判断输入的数据是哪一个种类。有很多算法既可以实现

    2024年01月24日
    浏览(42)
  • 机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测

    随机梯度下降(SGD)也称为增量梯度下降,是一种迭代方法,用于优化可微分目标函数。该方法通过在小批量数据上计算损失函数的梯度而迭代地更新权重与偏置项。SGD在高度非凸的损失表面上远远超越了朴素梯度下降法,这种简单的爬山法技术已经主导了现代的非凸优化。

    2024年02月03日
    浏览(54)
  • 【AI底层逻辑】——篇章5(上):机器学习算法之回归&分类

    目录 引入 一、何为机器学习 1、定规则和学规则 2、算法的定义

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包