基于单个参数线性回归的机器学习代码

本文为学习吴恩达版本机器学习教程的代码整理,使用的数据集为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 和每次迭代的损失值数组。"""# 初始化一个临时变量,用于更新 thetatemp = 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))# 更新 thetatheta = 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]}")

运行后结果:
在这里插入图片描述
在这里插入图片描述
输出结果:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/265759.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dijkstra求最短路 I(Dijkstra算法)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含三个整…

使用JLink仿真器实现调试打印的N种方法

方法一:使用MCU的串口 这是最古老也是最简单的方法。 电脑上面插一个USB转TTL,然后与MCU的UART_RX/UART_TX/GND连接起来。PC端再打开一个串口调试助手。两边的波特率一致,就可以收到MCU发过来的打印信息了。 方法二:使用JLink仿…

低代码开发平台通常提供哪些功能?发挥什么作用?

目录 一、低代码助力开发 二、低代码核心功能 1.业务建模: 2.表单建模: 3.页面建模: 4.流程建模: 5.报表建模: 6.门户建模: 7.大屏建模: 8.移动建模: 三、解放程序员的双…

使用人工智能优化常见业务流程

在现代商业环境中,人工智能(AI)正在改变企业的运营方式。将人工智能集成到业务流程中可以提高效率和准确性,从而节省大量时间和成本。 这使员工能够专注于更具战略性的任务。人工智能在商业中的应用范围从自动化日常任务到提供高级分析,以做…

【实用】sklearn决策树怎么导出规则

目录 一、什么是决策树模型 0.1 什么是决策树 02.决策树模型有哪些 二、在sklearn中怎么训练一棵决策树 三、什么是决策树的规则 0.1决策树的决策规则 02. 决策树的决策规则是怎么存储的 四、怎么导出决策树的规则 4.1 导出决策树文本规则 4.2 导出可视化决策树 4.3…

MS1242,替代ADS1242,24bit 高精度、低功耗模数转换器

产品简述 MS1242/MS1243 是一款高精度、宽动态范围、 ∆-Σ 模数转 换芯片,其工作电压为 2.7V 至 5.25V ,可以达到 24bit 无失码转 换,有效精度可达 21bit 。 MS1242/MS1243 可以广泛使用在工 业控制、称重、液体 / 气体化学分析、血液分…

利用Rclone将阿里云对象存储迁移至雨云对象存储的教程,对象存储数据迁移教程

使用Rclone将阿里云对象存储(OSS)的文件全部迁移至雨云对象存储(ROS)的教程,其他的对象存储也可以参照本教程。 Rclone简介 Rclone 是一个用于和同步云平台同步文件和目录命令行工具。采用 Go 语言开发。 它允许在文件系统和云存储服务之间或在多个云存储服务之间…

如何公网访问内网的群晖NAS随时随地远程访问本地存储的学习资源

文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

伪原创API,一文快速了解伪原创API

伪原创API,听起来可能对许多人来说是一个陌生的术语。然而,在当今数字化时代,尤其是在内容创作和网络营销领域,伪原创API正逐渐崭露头角。在本文中,我将向您深入介绍伪原创API是什么,以及它如何在实际应用中…

Weblogic CVE-2023-21839(metasploit版)

Step1:用docker搭建环境 Step2:docker查看映射端口 Step3:访问特定端口,然后靶标应用。 Step4:用metasploit进行攻击: 首先,打开metasploit,然后查询需要攻击的板块&#xff0…

Python中的并发编程(3)线程池、锁

concurrent.futures 提供的线程池 concurrent.futures模块提供了线程池和进程池简化了多线程/进程操作。 线程池原理是用一个任务队列让多个线程从中获取任务执行,然后返回结果。 常见的用法是创建线程池,提交任务,等待完成并获取结果&…

内网穿透的应用-如何结合Cpolar内网穿透工具实现在IDEA中远程访问家里或者公司的数据库

文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如Mysql数据库,但是在IDEA中只能连接本…