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

本文为学习吴恩达版本机器学习教程的代码整理,使用的数据集为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.mzph.cn/news/213858.shtml

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

相关文章

2023最新八股文前端面试题

第一章 Css 1.说一下CSS的盒模型。 在HTML页面中的所有元素都可以看成是一个盒子盒子的组成:内容content、内边距padding、边框border、外边距margin盒模型的类型: 标准盒模型 margin border padding content IE盒模型 margin content(border padding) 控制盒模型的模式…

淘宝api接口测试方式(item_get-获得淘宝商品详情)

注册淘宝开放平台账号:首先,你需要在淘宝开放平台上注册一个账号,并创建一个应用。获取App Key和Secret Key:在创建应用后,你会获得App Key和Secret Key,这些凭证将用于调用API。了解淘宝商品详情接口&…

【开源】基于Vue+SpringBoot的免税店商城管理系统

文末获取源码,项目编号: S 069 。 \color{red}{文末获取源码,项目编号:S069。} 文末获取源码,项目编号:S069。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统…

什么是图片懒加载(image lazy loading)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【Flutter】graphic图表实现tooltip一段时间后自动隐藏

概述 graphic图表中提供了自定义tooltip的事件,可通过selections中on和clear配置手势选项和可识别设备,默认情况下tooltip需要双击隐藏,但这并不符合我们的需求。通过调研发现,若想实现tooltip隔几秒后隐藏,可通过Str…

3DMax物理画笔物体填充放置绘制画笔插件安装使用方法

3DMax物理画笔物体填充放置绘制画笔插件,允许您使用笔刷以非常自然的方式用物品快速填充场景,并使用刚体模拟自动放置它们。 无论你是从事建筑、游戏电影还是商业。。。等等,你经常需要用一些物品为你的场景添加细节。手工放置它们是乏味的&…

Threejs发光闪烁提示特效

一、导语 发光闪烁特效应该在我们的项目中是经常需要去封装的一个特效吧,一般用于点击选择,选中物体,或者一些特效加持于中心物体,物体碰撞检测后的发光特效等等 二、分析 我们可以合理的使用后处理特效,上步骤&am…

hive查看数据库出现org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

FAILED: HiveException java,lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient 在启动hive后,使用show databses查看数据库时发现,出现了这个错误 情况一: 根据搜索查找以及…

Docker一 | Docker的基本使用

目录 Docker的基本使用 常用命令 启动Docker 查看Docker的运行状态 重启Docker 停止Docker服务 查看命令相关信息 镜像命令 列出本地主机上的镜像 搜索某个镜像的名称 拉取指定的镜像到本地 查看镜像/容器/数据卷所占的空间 删除某个镜像 容器命令 启动容器 列出…

数字电路基础知识系列(六)之LC滤波器的基础知识

LC滤波器,是指将电感(L)与电容器 ©进行组合设计构成的滤波电路,可去除或通过特定频率的无源器件。电容器具有隔直流通交流,且交流频率越高越容易通过的特性。而电感则具有隔交流通直流,且交流频率越高越不易通过的特性。因此…

linux如何使用Xshell远程连接

简介:本文的一切条件基于redhat的linux操作系统。 目录 1、创建虚拟机: 2、使用命令查看网段信息 拓展1:(若网卡上没有网段信息,可以使用任意两种方法): 准备工作: 1、点击左…

git入门教程+常用命令

Git入门教程 本文章主要参照视频教程:https://www.bilibili.com/video/BV1FE411P7B3/?spm_id_from333.337.search-card.all.click&vd_source06caf161b187fb3f4c039bc15e238fea 为什么要使用GIT 版本控制是项目、文档迭代的必然要求,所以需要使用…

Springboot自定义start首发预告

Springboot自定义start首发预告 基于Springboot的自定义start , 减少项目建设重复工作, 如 依赖 , 出入参包装 , 日志打印 , mybatis基本配置等等等. 优点 模块化 可插拔 易于维护和升级 定制化 社区支持(后期支持) 发布时间 预告: 2023-12-10 预计发布: 2024-1-1 , 元旦首…

移动端原生实现列表列固定横向滚动功能

功能介绍: 在移动端开发中,会用到列表作为信息展示方式,一般希望上下滚动时,可以固定表头,左右滚动时,可以固定最左列。 需求: 1、列表可以使用数组循环遍历; 2、上下滚动时&…

离线环境下使用百度地图(vue版)(展示自己的地图瓦片)3.0版本api

1.下载自己想要的地图网片 (1)瓦片图下载 提取百度网盘中文件,然后运行exe文件,选择要下载的层级及地区即可 百度网盘链接:https://pan.baidu.com/s/16sOJ9ws7HCgNH3EMf7Ejyg?pwd0q0e 提取码:0q0e (2)将瓦片图映射到网上 推荐使…

Python-docx 深入word源码 自定义字符间距

代码和实现效果 from docx import Document from docx.oxml import OxmlElement from docx.oxml.ns import qn from docx.shared import Pt# 调整pt设置字间距 def SetParagraphCharSpaceByPt(run, pt1):通过修改word源码方式, 添加w:spacing标签直接通过调整pt来设置字符间距…

Blender学习--制作带骨骼动画的机器人

1. 首先创建一个机器人模型 时间关系,这部分步骤有时间补充 2. 然后为机器人创建一副骨架 时间关系,这部分步骤有时间补充 3.骨骼绑定 切换到物体模式,选中机器人头部,Shift选中骨骼,切换到姿态模式,&am…

SpringBoot集成系列--xxlJob

文章目录 一、搭建调度中心xxl-job-admin1、下载项目2、调整项目参数3、执行初始化数据库SQL4、启动项目5、访问 二、集成步骤1、添加xxl-job的依赖2、添加xxl-job的依赖3、配置执行器4、创建执行器5、开发任务1)方式1:BEAN模式(方法形式&…

RocketMQ源码

RocketMQ的核心三流程 启动流程 RocketMQ服务端由两部分组成NameServer和Broker,NameServer是服务的注册中心,Broker会把自己的地址注册到NameServer,生产者和消费者启动的时候会先从NameServer获取Broker的地址,再去从Broker发…

【自动驾驶】2023年度盘点:智能汽车、自动驾驶、车联网必读书

2023年,智能驾驶和新能源汽车行业仍然有着肉眼可见的新进展。自动驾驶技术继续尝试从辅助驾驶向自动驾驶的过渡,更重要的是相关技术成本的下降。根据《全球电动汽车展望2023》等行业报告,预计2023年平均成本将降至100美元/千瓦时以下&#xf…