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

本文为学习吴恩达版本机器学习教程的代码整理,使用的数据集为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]}")

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超参数优化的多功能贝叶斯优化包SMAC3

地址 关键词 Bayesian optimization, hyperparameter optimization, SMAC3 文章概述 本文介绍了SMAC3,一个用于超参数优化的多功能贝叶斯优化包。SMAC3使用随机森林作为代理模型,并结合了多样性的BO和强化策略,如积极竞赛和多样性方法…

如何使用DC电源模块进行快速原型开发

如何使用DC电源模块进行快速原型开发 BOSHIDA DC电源模块是一种用于转换电源电压的电子元件,它可以把输入的直流电压转换为不同的输出电压,让我们可以在无需改变设备硬件的情况下,实现电压的升降。它广泛应用于不同的电子设备中,…

【数字经济】你必须知道的SABOE数字化转型

【文末送书】今天推荐一本企业管理类前沿书籍《企业架构驱动数字化转型:以架构为中心的端到端转型方法论》 目录 01传统企业数字化转型面临诸多挑战02SABOE数字化转型五环法为企业转型破除迷雾03文末送书 01传统企业数字化转型面临诸多挑战 即将过去的2023年&#…

​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案

随着“第四次工业革命”的爆炸式发展,众多企业都将自己的业务与迅速发展的应用开发和网站建设领域高度绑定。而对于众多有上云需求的企业和个人用户来说,选择一款自己的服务器配置就成为了一项至关重要的任务。而随着需求端的不断扩大,云服务…

SD-WAN VS MPLS :怎么选择最合适的网络连接方案?

随着企业网络需求的不断增长,网络连接方案也变得更加多样化。在这种情况下,SD-WAN和MPLS成为了企业考虑的两种主要选择。本文将就SD-WAN和MPLS这两种网络连接方案进行比较,深入探讨它们在成本、体验、部署周期和运维等方面的差异。 1、成本投…

050:vue项目webpack打包,大文件分成几个小文件的方法

第050个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

[PTP][Announce] ClockIdentity 定义规则

文章目录 一、简介二、格式三、备注 一、简介 ClockIdentity: 时钟标识, 8个字节,采用IEEE MAC48编码方式 二、格式 PTP实例的clockIdentity值应符合802.1AS的8.5.2.2中的规定。 如下(8.5.2.2中描述了1588-2019的内容): clockI…

城市生态与交通,数据可视化大屏,PSD源文件(ps大屏设计素材)

用酷炫的大屏展示其城市的生态与交通情况,辅助相关决策。好的大屏组件也可以让设计师的工作更加便捷,使其更高效快速的完成设计任务。现分享城市生态与交通的大屏Photoshop源文件,开箱即用!以下为部分截图示意。 若需更多的 智慧…

HCIP---RSTP/MSTP

文章目录 目录 文章目录 前言 一.RSTP诞生背景 二.RSTP对比STP的快速收敛机制 端口角色变化 接口状态变化 RSTP-BPDU 指定端口- P/A机制 BPDU发送变化 端口状态快速切换 优化拓扑变更机制 三.MSTP MSTP诞生背景 MSTP相关概念 MSTP配置 总结 前言 STP协议虽然能够解决环…

Holynix

信息收集阶段 存活主机探测:arp-scan -l 当然了,正常来说我们不应该使用arp进行探测,arp探测的是arp的缓存表,我们应该利用nmap进行探测! nmap -sT --min-rate 10000 192.168.182.0/24 端口探测 nmap -sT --min-rat…

java学习part42反射

187-反射机制-反射的理解与使用举例_哔哩哔哩_bilibili

代码随想录二刷 |二叉树 |94.二叉树的中序遍历

代码随想录二刷 |二叉树 |二叉树的中序遍历 题目描述解题思路代码实现迭代法递归法 题目描述 94.二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出&a…

protobuf 协议 java版

protobuf全称Google Protocol Buffers 1. 下载proto文件编译软件 下载路径&#xff1a;https://github.com/protocolbuffers/protobuf/releases下载文件&#xff1a;protoc-25.1-win64.zip将 bin 目录配置到环境变量path 中2. pom引入protobuf-java <dependency><gro…

解决traefik/nginx-ingress-controller配置正确的情况访问域名仍然报错: Connection Refused的问题

最近碰到一个很奇怪的问题&#xff1a; traefik/nginx-ingress-controller配置正确&#xff0c;但是访问ingress配置的host域名就是死活报错&#xff1a; Connection Refused 这样怎么也找不到原因&#xff0c;然后一咬牙直接在其中一台节点yum安装nginx, 通过直接反向代理的方…

高效纯化树脂A-2313 CPR

在化工、制药等行业中&#xff0c;对colorful chemicals的纯化一直是挑战。本文将为您介绍一款具有卓越性能的强碱性阴离子交换树脂——Tulsion A-2313 CPR。通过分析其特性和应用&#xff0c;展示其在colorful chemicals纯化领域的优势。 一、Tulsion A-2313 CPR离子交换树脂的…

SQL命令---删除字段

介绍 使用sql语句删除表字段。 命令 alter table 表名 drop 字段名;例子 删除a表中的name字段。 alter table a drop name;下面是执行删除后的表结构&#xff1a;

Java智慧校园-中小学校园管理系统源码

智慧校园系统是通过信息化手段&#xff0c;实现对校园内各类资源的有效集成 整合和优化&#xff0c;实现资源的有效配置和充分利用&#xff0c;将校务管理过程的优化协调。为校园提供数字化教学、数字化学习、数字化科研和数字化管理。 致力于为家长和教师提供一个全方位、多层…

〖Python网络爬虫实战㊷〗- 极验滑块介绍(四)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

数据结构与算法之美学习笔记:34 | 字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?

这里写自定义目录标题 前言KMP 算法基本原理失效函数计算方法KMP 算法复杂度分析解答开篇 & 内容小结 前言 本节课程思维导图&#xff1a; BM 算法&#xff0c;是工程中非常常用的一种高效字符串匹配算法。不过&#xff0c;在所有的字符串匹配算法里&#xff0c;要说最知名…

毫米波雷达天线罩设计指导2(TI文档)

5 天线罩设计与仿真 本节重点介绍了一些天线罩设计和仿真&#xff0c;IWR6843 ISK型天线使用球形天线罩作为案例研究。在本节中&#xff0c;将比较带和不带天线罩的远场天线辐射方向图。在这次仿真中&#xff0c;使用了IWR6843 ISK EVM设计的衍生品。 图5-1 ~图5-4为三维电磁场…