从简单线性回归到TensorFlow深度学习

news/2024/12/30 1:15:02/

大家好,人工智能近年来变得越来越流行,学习人工智能的需求也随之增加,尤其是许多IT专业人士希望利用机器学习的强大功能,但面临不小的挑战,尤其是在理论和数学上。

步骤1:线性回归

线性回归是一种统计学中常用的回归分析方法,用于建立一个自变量和一个或多个因变量之间的关系模型。在线性回归中,我们假设自变量和因变量之间存在一个线性关系,即因变量的值可以通过对自变量进行线性组合来预测。

线性回归可以用于解决各种问题,例如根据房屋面积、卧室数量、地理位置等因素来预测房价,或者根据广告投入、用户点击率等因素来预测销售额等。

在线性回归中,我们通常使用最小二乘法来估计模型参数,即通过最小化预测值与实际值之间的差异来确定自变量的系数。线性回归还可以通过引入多项式项、交互项等来建立更复杂的模型,以更好地适应实际情况。

下图通过随机生成一些数据,并进行了可视化:

import numpy as np
import matplotlib.pyplot as plt
from helpers import generate_data_lin, plot_linear_model, plot_loss_historyX, y = generate_data_lin(samples=100)
plot_data(X, y)

 将初始斜率和截距设为0:

# 初始化模型系数
slope = 0
bias  = 0# 绘制未经训练的模型
plot_linear_model(X, y, slope, bias)

 实现损失函数、计算模型系数的梯度:

learning_rate = 0.01
epochs = 100
loss_history = []# TODO: 实现损失函数(MSE)
def loss(X, y, slope, bias):return 0# TODO: 计算模型系数的梯度
def gradient(X, y, slope, bias):return 0, 0for i in range(epochs):    # 计算梯度slope_g, bias_g = gradient(X, y, slope, bias)# 更新系数slope -= slope_g * learning_ratebias  -= bias_g  * learning_rate# 更新损失历史loss_history.append(loss(X, y, slope, bias))plot_linear_model(X, y, slope, bias)
plot_loss_history(loss_history)

在这个例子中使用的超参数不多,使用少量的超参数(学习率和周期数)有助于更好地理解它们在训练过程中的作用。

步骤2:多项式回归

从线性回归开始,多项式回归将说明如何添加其他非线性特征(有效地增加模型的复杂性),使我们能够建模更复杂的数据。

由于最终目标是实现神经网络,固定系数的数量可以降低抽象级别。这就是为什么我们通常会使用三次多项式的原因:

图片

import numpy as np
import matplotlib.pyplot as plt
from helpers import generate_data_poly, plot_poly_model, plot_loss_historyX_train, y_train, X_test, y_test = generate_data_poly(samples=100, test_ratio=0.2)
plot_data(X_train, y_train, X_test, y_test)

 

# 用任意的值初始化模型系数
model_coefs = np.array([0, 0.1, 0.1, -0.1])# 绘制未经训练的模型
plot_poly_model(X_train, y_train, model_coefs)

 和之前一样,实现损失函数(MSE)并计算模型系数的梯度:

learning_rate = 0.01
epochs = 100
train_loss_history = []
test_loss_history = []# TODO: 实现损失函数(MSE)
def loss(X, y, model_coefs):return 0# TODO: 计算模型系数的梯度
def gradient(X, y, coef):d0 = 0d1 = 0d2 = 0d3 = 0return np.array([d0, d1, d2, d3])for i in range(epochs):    # 计算梯度coefs_g = gradient(X, y, model_coefs)# 更新系数model_coefs -= codefs_g * learning_rate# 更新损失历史train_loss_history.append(loss(X_train, y_train, model_coefs))test_loss_history.append(loss(X_test, y_test, model_coefs))plot_poly_model(X_test, y_test, model_coefs)
plot_loss_history(train_loss_history, test_loss_history)

步骤3:神经网络回归

最后,我们可以基于简单线性回归和多项式回归,从计算图的角度来处理神经网络,可以将神经网络看作手动计算特征的模型。

从三次多项式(四个系数)到具有四个神经元的神经网络的转变非常无缝。这种比较是神经网络可以被视为对任意数量的计算单元(神经元)的抽象的绝佳说明。尽管每个神经元的单独能力较弱,但在数量较大时它们变得非常强大,因为它们使我们能够统一地计算梯度,从而显著地简化了训练过程。

使用TensorFlow创建神经网络模型:

import matplotlib.pyplot as plt
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input
from helpers import generate_data_poly, plot_nn_modelX_train, y_train, X_test, y_test = generate_data_poly(samples=100, test_ratio=0.2)model = Sequential([Input(1),Dense(4, activation='relu'),Dense(1)
])model.compile(loss='mse')model.fit(X_train,y_train,epochs=50,validation_data=[X_test, y_test],verbose=0
)plot_nn_model(X_test, y_test, model)

 修改模型,使用Dense(32, activation='relu')

model = Sequential([Input(1),Dense(32, activation='relu'),Dense(1)
])model.compile(loss='mse')model.fit(X_train,y_train,epochs=300,validation_data=[X_test, y_test],verbose=0
)plot_nn_model(X_test, y_test, model)

 修改模型,再添加一个Dense(16, activation='relu')

model = Sequential([Input(1),Dense(32, activation='relu'),Dense(16, activation='relu'),Dense(1)
])model.compile(loss='mse')model.fit(X_train,y_train,epochs=300,validation_data=[X_test, y_test],verbose=0
)plot_nn_model(X_test, y_test, model)

 

综上所述,在机器学习和统计学中,模型参数是指用来描述模型的一组数值或向量。这些参数可以被调整或优化,以使模型能够更好地拟合训练数据,从而提高模型的预测性能。

模型参数的意义通常取决于具体的模型类型。例如,在线性回归中,模型参数包括自变量的系数和截距项,它们描述了自变量和因变量之间的线性关系。在神经网络中,模型参数包括每个神经元的权重和偏置项,它们描述了神经元之间的连接方式和激活规律。


http://www.ppmy.cn/news/974283.html

相关文章

【CN-Docker】window11下Docker下开启kubernetes

1. 安装Docker 安装docker步骤如下: 下载Docker启用hyper-v 2.1.powershell,管理员运行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All安装wsl配置Docker镜像加速地址(阿里云) 4.1. "registry-mirrors": [&quo…

java享元模式

在Java中实现享元模式,可以通过创建一个享元工厂(FlyweightFactory)和享元对象(Flyweight)来完成。享元模式用于共享可复用对象,以节省内存和提高性能。 下面是一个简单的示例: 首先&#xff…

力扣 -- 122. 买卖股票的最佳时机 II

一、题目: 题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode) 二、解题步骤 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码: clas…

C++实现MySQL数据库连接池

C实现MySQL数据库连接池 涉及技术 MySQL数据库编程、单例模式、STL容器、C11多线程(线程互斥、线程互斥、线程同步通信和unique_lock)、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型。 项目背景 为了提升MySQL数据库(基于C/…

5.3.tensorRT基础(2)-从下载onnx-tensorrt到配置好并运行起来

目录 前言1. ONNX解析器更新总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 基础-从下载 onnx-tensorrt 到配置好…

详解C++特性之noexcept (C++11 C++17 C++20)

引导 throw() 在C11前,使用throw(optional_type_list)来声明某些函数,表示该函数不会抛出异常。 如果函数抛出了异常,则调用 unexpected() 函数(C98 标准规定,函数出现异常但未被捕获时会调用 unexpected() 函数(该…

浙大数据结构第五周之05-树7 堆中的路径

题目详情: 将一系列给定数字依次插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-1…

1.JavaScript介绍

1.1 JavaScript是什么 1.JavaScript(是什么? ) 是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。 2.作用(做什么?) -网页特效(监听用户的一些行为让网页作出对应的反馈&#xff09…