神经网络与深度学习(一)

news2024/11/25 16:20:05

线性回归

定义

  • 利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法

要素

  • 训练集(训练数据)
  • 输出数据
  • 拟合函数
  • 数据条目数

场景

  • 预测价格(房屋、股票等)、预测住院时间(针对住院病人等)、预测需求(零售销量等)

实例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LinearRegression
from sklearn import metrics

# 创建一些随机的线性数据
np.random.seed(0)
x = np.random.rand(100, 1)
y = 2 + 3 * x + np.random.rand(100, 1)

# 将数据分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

# 创建线性回归模型
regressor = LinearRegression()  

# 使用训练数据来训练模型
regressor.fit(x_train, y_train) 

# 使用测试数据来评估模型
y_pred = regressor.predict(x_test)

# 计算模型的准确度
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))  
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))  
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

# 绘制原始数据和拟合的直线
plt.scatter(x_test, y_test,  color='gray')
plt.plot(x_test, y_pred, color='red', linewidth=2)
plt.show()

线性回归

分类与回归

线性二分类

定义

线性分类器则透过特征的线性组合来做出分类决定,以达到此种目的。简言之,样本通过直线(或超平面)可分。

  • 线性分类器输入:特征向量
  • 输出:哪一类。如果是二分类问题,则为0和1,或者是属于某类的
  • 概率:即0-1之间的数。

线性分类与线性回归差别

  • 输出意义不同:属于某类的概率VS回归具体值
  • 参数意义不同:最佳分类直线VS最佳拟合直线
  • 维度不同:一维的回归VS二维的分类

Sigmoid函数

  • 用于结果转换,归入0-1区间
    请添加图片描述

梯度下降法

  • 梯度下降法(Gradient Descent)是一种用于找到函数局部极小值的优化算法。它通过向函数上当前点对应梯度的反方向迭代搜索,以寻找最小值。如果相反地向梯度正方向迭代搜索,则会接近函数的局部极大值点,这个过程被称为梯度上升法。

二分类实例

import numpy as np
import matplotlib.pyplot as plt

# 设定随机种子以便结果可复现
np.random.seed(0)

# 生成数据集
X = np.random.randn(100, 2)  # 生成100个样本,每个样本有2个特征
Y = np.where(X[:, 0] + X[:, 1] > 0, 1, 0)  # 根据线性方程生成标签

# 绘制原始数据
plt.scatter(X[Y == 0][:, 0], X[Y == 0][:, 1], color='red', label='Class 0')
plt.scatter(X[Y == 1][:, 0], X[Y == 1][:, 1], color='blue', label='Class 1')
plt.legend()
plt.title('Original Data')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()

# 梯度下降函数
def gradient_descent(X, Y, theta, alpha, iterations):
    m = len(X)
    for i in range(iterations):
        h = np.dot(X, theta)
        loss = h - Y
        gradient = np.dot(X.transpose(), loss) / m
        theta = theta - alpha * gradient
    return theta

# 初始化参数
theta = np.zeros(2)  # 特征数量 + 截距项
alpha = 0.01  # 学习率
iterations = 1000  # 迭代次数

# 运行梯度下降
theta = gradient_descent(X, Y, theta, alpha, iterations)

# 绘制决策边界
def plot_decision_boundary(theta, X, Y):
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    h = (theta[0] * x_min + theta[1] * y_min) / -theta[2]
    k = -theta[0] / theta[1]
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = np.dot(np.array([xx.ravel(), yy.ravel()]), theta)
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
    plt.scatter(X[Y == 0][:, 0], X[Y == 0][:, 1], color='red', label='Class 0')
    plt.scatter(X[Y == 1][:, 0], X[Y == 1][:, 1], color='blue', label='Class 1')
    plt.legend()
    plt.title('Decision Boundary')
    plt.xlabel('X1')
    plt.ylabel('X2')

plot_decision_boundary(theta, X, Y)
plt.show()

请添加图片描述

指数回归

实例

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 定义指数函数
def exponential_func(x, a, b, c):
    return a * np.exp(b * x) + c

# 创建模拟数据
x = np.linspace(0, 4, 50)
y = 3 * np.exp(2.5 * x) + 0.5
np.random.seed(1729)
yn = y + 0.2 * np.random.normal(size=len(x))

# 使用curve_fit进行拟合
popt, pcov = curve_fit(exponential_func, x, yn)

# 输出最优参数
print("最优参数: ", popt)

# 使用最优参数进行预测
y_pred = exponential_func(x, *popt)

# 绘制原始数据和拟合曲线
plt.figure(figsize=(8, 6))
plt.scatter(x, yn, label='原始数据')
plt.plot(x, y_pred, 'r-', label='拟合曲线')
plt.legend()
plt.show()

请添加图片描述

多分类回归

  • 多分类回归通常指的是多目标回归问题,即预测多个连续的输出变量。与多分类分类问题不同,回归任务预测的是连续的数值,而不是离散的类别。

实例

  • 二分类
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

# 创建模拟的二分类数据集
np.random.seed(0)
X = np.random.randn(100, 2)  # 生成100个二维数据点
y = (X[:, 0] + X[:, 1] > 0).astype(int)  # 创建简单的线性分类标签

# 使用逻辑回归(其输出层实际上应用了Softmax对于二分类)
# 对于多分类问题,我们可以使用LogisticRegression(multi_class='multinomial', solver='lbfgs')
clf = LogisticRegression(multi_class='multinomial', solver='lbfgs')
clf.fit(X, y)

# 预测概率
probabilities = clf.predict_proba(X)

# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolor='k')

# 绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3, cmap='viridis')

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Softmax Classification with Scatter Plot')
plt.show()

请添加图片描述

  • 多分类
import numpy as np
import matplotlib.pyplot as plt

# 设置随机种子以保证结果的可复现性
np.random.seed(0)

# 定义类别数量和每个类别的数据点数量
num_classes =5
num_points_per_class = 5000

# 生成随机散点数据
X = np.zeros((num_classes * num_points_per_class, 2))
for i in range(num_classes):
    # 为每个类别生成一个正态分布的簇
    X[i * num_points_per_class: (i + 1) * num_points_per_class] = np.random.randn(num_points_per_class, 2) + [i, i]

# 为每个类别创建一个权重向量和偏置项
W = np.random.randn(num_classes, 2)
b = np.random.randn(num_classes)

# 计算每个数据点的分数
scores = np.dot(X, W.T) + b

# 应用Softmax函数得到概率分布
def softmax(x):
    exps = np.exp(x - np.max(x, axis=1, keepdims=True))
    return exps / np.sum(exps, axis=1, keepdims=True)

probabilities = softmax(scores)

# 绘制散点图
colors = ['r', 'g', 'b', 'c', 'm']  # 每个类别的颜色
for i in range(num_classes):
    plt.scatter(X[scores[:, i] == np.max(scores, axis=1)][:, 0],
                X[scores[:, i] == np.max(scores, axis=1)][:, 1],
                c=colors[i], label=f'Class {i}')

# 添加图例和坐标轴标签
plt.legend()
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Scatter Plot with 5 Classes and Softmax Output')

# 显示图像
plt.show()

# 打印Softmax概率(仅打印前5个数据点的概率作为示例)
print("Softmax Probabilities (for the first 5 points):")
print(probabilities[:5])

请添加图片描述

神经元模型

分类

  • 生物神经元
  • Spiking模型
  • Integrate-and-fire模型
  • M-P模型
  • 单神经元模型

作用函数

非对称型 Sigmoid 函数 (Log Sigmoid)

非对称型Sigmoid函数(也称作Log Sigmoid函数)是Sigmoid函数的一个变体,它可以将任何实数映射到介于0和1之间的值,但不像标准的Sigmoid函数那样是对称的。非对称型Sigmoid函数通常具有不同的形状参数,允许用户调整函数的形状以满足特定的需求。非对称型Sigmoid函数的一般形式可以表示为:f(x) = 1 / (1 + exp(-a * (x - b)))其中,a和b是形状参数。a控制函数的斜率,而b控制函数的中心位置。当a为正数时,函数在x=b处呈现出一个向上的S形曲线;当a为负数时,函数在x=b处呈现出一个向下的S形曲线。通过调整a和b的值,可以改变函数的形状和位置。

请添加图片描述

对称型 Sigmoid 函数 (Tangent Sigmoid)

对称型 Sigmoid 函数(也称为 Logistic Sigmoid 函数)是一种常用的非线性函数,通常用于将连续值映射到 0 到 1 之间的概率值。标准的对称型 Sigmoid 函数公式如下:
f(x) = 1 / (1 + exp(-x))
其中 exp 是自然指数函数,x 是输入值。这个函数将任何实数 x 映射到 (0, 1) 区间内,其中当 x 趋近于正无穷时,f(x) 趋近于 1;当 x 趋近于负无穷时,f(x) 趋近于0。
请添加图片描述

多层感知机

应对问题

  • 线性不可分问题:无法进行线性分类。Minsky 1969年提出XOR问题
  • 三层感知器可识别任一凸多边形或无界的凸区域。
  • 更多层感知器网络,可识别更为复杂的图形。

实现过程

  • 在输入和输出层间加一或多层隐单元,构成多层感知器(多层前馈神经网络)
  • 加一层隐节点(单元)为三层网络,可解决异或(XOR)问题由输入得到两个隐节点、一个输出层节点的输出。

多层前馈网络

  • 多层感知机是一种多层前馈网络,由多层神经网络构成,每层网络将输出传递给下一层网络。神经元间的权值连接仅出现在相邻层之间,不出现在其他位置。如果每一个神经元都连接到上一层的所有神经元(除输入层外),则成为全连接网络。
    在这里插入图片描述

BP网络

  • 多层前馈网络的反向传播 (BP)学习算法,简称BP算法,是有导师的学习,它是梯度下降法在多层前馈网中的应用。
    网络结构:见图,𝐮(或𝐱 )、𝐲是网络的输入、输出向量,神经元用节点表示,网络由输入层、隐层和输出层节点组成,隐层可一层
    ,也可多层(图中是单隐层),前层至后层节点通过权联接。由于用BP学习算法,所以常称BP神经网络。

BP学习算法

由正向传播和反向传播组成:

  • 正向传播是输入信号从输入层经隐层,传向输出层,若输出层得到了期望的输出,则学习算法结束;否则,转至反向传播。
  • 反向传播是将误差(样本输出与网络输出之差)按原联接通路反向计算,由梯度下降法调整各层节点的权值和阈值,使误差减小。

优缺点:

  • 学习完全自主
  • 可逼近任意非线性函数
  • 算法非全局收敛
  • 收敛速度慢
  • 学习速率α选择
  • 神经网络如何设计(几层?节点数?)

性能优化

常用技巧

  • 模型初始化
  • 训练数据与测试数据
  • 训练数据与测试数据:𝐾折交叉验证
  • 欠拟合与过拟合
  • 权重衰减 (𝐿2正则化)
  • Dropout(暂退)

动量法

自适应梯度法

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

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

相关文章

计算机网络 - 基础篇总结

TCP/IP 网络模型有哪几层? 1.应用层 为用户提供应用功能 2.传输层 负责为应用层提供网络支持 使用TCP和UDP 当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏…

汇总:五个开源的Three.js项目

Three.js 是一个基于 WebGL 的 JavaScript 库,它提供了一套易于使用的 API 用来在浏览器中创建和显示 3D 图形。通过抽象和简化 WebGL 的复杂性,Three.js 使开发者无需深入了解 WebGL 的详细技术就能够轻松构建和渲染3D场景、模型、动画、粒子系统等。 T…

OSI七层参考模型

osi即开放系统互联参考模型。 osi的目的是为了解决主机间的通信 从下到上:物理层、数据链路层、网络层、传输层、会话层、表示出、应用层 上三层(应用层、表示出、会话层)负责产生数据,下四层(传输层、网络层、数据…

设计模式(9):外观模式

一.迪米特法则(最少知识原则) 一个软件实体应当尽可能少的与其他实体发生相互作用。 二.外观模式 为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用。它的核心是什么呢,就是为我们的子系统提供一个统一的入口,封装子…

YOLOv5改进系列:升级版ResNet的新主干网络DenseNet

一、论文理论 论文地址:Densely Connected Convolutional Networks 1.理论思想 DenseNet最大化前后层信息交流,通过建立前面所有层与后面层的密集连接,实现了特征在通道维度上的复用,不但减缓了梯度消失的现象,也使其…

【前端Vue】Vue从0基础完整教程第4篇:面经PC端 - Element (下)【附代码文档】

Vue从0基础到大神学习完整教程完整教程(附代码资料)主要内容讲述:vue基本概念,vue-cli的使用,vue的插值表达式,{{ gaga }},{{ if (obj.age > 18 ) { } }},vue指令,综合…

Spring: 在SpringBoot项目中解决前端跨域问题

这里写目录标题 一、什么是跨域问题二、浏览器的同源策略三、SpringBoot项目中解决跨域问题的5种方式:使用CORS1、自定 web filter 实现跨域(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、 CorsFilter(全局跨域)4、使用CrossOrigin注解 (局部跨域) 一、什么是跨域…

稀碎从零算法笔记Day34-LeetCode:最小栈

感谢耶稣,笔者又过了一天“复活节”。月末斩杀一道Hard画上句号 题型:栈、模拟数据结构 链接:155. 最小栈 - 力扣(LeetCode) 来源:LeetCode 题目描述 设计一个支持 push ,pop ,…

适用于 Windows 的 6 个最佳视频转换器

视频转换器可以帮助您在设备上转换和播放不受支持的视频格式。它还可以方便地减小视频文件大小、以通用格式组织所有视频或与其他人共享文件以在不同设备上播放。 Windows 有大量视频转换器可供选择。虽然有些是免费的,但其他一些则提供迎合专业用户的高级功能。在…

Pycharm选择使用Anaconda环境中的Pytorch 失败解决办法之一

前几日想要复现一篇论文,结果给配的台式机完全禁不住,老是报溢出,慢都没事,溢出就很难受了,因此想用自己笔记本的GPU来训练。 安装以后遇到一个问题: Anaconda里创建了环境,安装好了对应pytor…

AR智能眼镜解决方案_MTK平台安卓主板硬件芯片方案开发

AR智能眼镜,是一个可以让现场作业更智能的综合管控设备。采用移动互联网、大数据和云计算等技术,现场数据的采集与分析;同时实现前端现场作业和后端管理的实时连动、信息的同步传输与存储。让前端现场作业更加智能,后端管理更加高…

再次加深理解Java中的并发编程

目录 一、线程、进程、程序 二、线程状态 三、线程的七大参数 四、lock与synchronized锁机制 一)、lock与synchronized锁区别 二)、synchronized锁原理 三)、Lock锁原理 五、synchronized锁升级原理 一)、锁升级基础知识 …

【Web】NSSCTF Round#20 Basic 两道0解题的赛后谈

目录 前言 baby-Codeigniter 组合拳! 前言 本想着说看看go的gin框架就睡了的,r3师傅提醒说赛题环境已经上了,那不赶紧研究下😀 主要来谈谈做题的心路历程 baby-Codeigniter 拿到题目的第一反应应该是:“什么是C…

C之易错注意点转义字符,sizeof,scanf,printf

目录 前言 一:转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 : 如果出现\890,\921这些的不是属于\ddd类型的,,不是一个字符…

SOA-面向服务架构

SOA-面向服务架构 1.概述2.SOA的设计原则包括:3. SOA实现方法1.Web Service2. 服务注册表3. 企业服务总线 细讲 超赞笔记 1.概述 SOA (Service-Oriented Architecture,SOA),从应用和原理的角度,目前有2种…

书生·浦语大模型-第一节课笔记

视频总结 23年发布的模型在一些材料中归位指令微调模型,后面逐渐升级应该已经是train的模型了 技术报告总结 InternLM2 Technical Report 评测与特点 6 dimensions and 30 benchmarks, long-context modeling, and open-ended subjective evaluations长文本…

【软件工程】概要设计

1. 导言 1.1 目的 该文档的目的是描述学生成绩管理系统的概要设计,其主要内容包括: 系统功能简介 系统结构简介 系统接口设计 数据设计 模块设计 界面设计 本文的预期读者是: 项目开发人员 项目管理人员 项目评测人员(…

C++:数据类型—字符串(11)

字符串就是包含多个字符组成的一个串 比如字符a,b,单个字符就是字符 那么"hello world" 就是一串字符组成的一个字符串 注意字符要在双引号里引用上,而字符一般都是单引号引用 在c中有两种定义字符串的方法,一个是原始c语言的定义方…

swift中的autoreleasepool(自动释放池)有用么?

想到一个问题 swift中的autoreleasepool(自动释放池)有用么? 我们进行验证一下 首先我们写一个加载图片的方法,保证会真正用到真实的IMP内存func loadBigData(string: String?) {if let path Bundle.main.path(forResource: "big", ofType: "png") {for…

二十四种设计模式与六大设计原则(二):【门面模式、适配器模式、模板方法模式、建造者模式、桥梁模式、命令模式】的定义、举例说明、核心思想、适用场景和优缺点

接上次博客:二十四种设计模式与六大设计原则(一):【策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式】的定义、举例说明、核心思想、适用场景和优缺点-CSDN博客 目录 门面模式【Facade Pattern】 定义 举…