【动手学深度学习】--02.Softmax回归

news2024/11/16 11:50:23

文章目录

  • Softmax回归
    • 1.原理
      • 1.1 从回归到多类分类
      • 1.2三种常见的损失函数
    • 2.图像分类集
      • 2.1读取数据集
      • 2.2读取小批量
      • 2.3整合组件
    • 3.从零实现Softmax回归
      • 3.1初始化模型参数
      • 3.2定义softmax操作
      • 3.3定义模型
      • 3.4定义损失函数
      • 3.5分类精度
      • 3.6训练
      • 3.7预测
    • 4.softmax回归的简洁实现
      • 4.1初始化模型参数
      • 4.2损失函数
      • 4.3优化算法
      • 4.4训练

Softmax回归

学习视频:Softmax 回归 + 损失函数 + 图片分类数据集【动手学深度学习v2】

官方笔记Softmax回归

1.原理

回归vs分类

  • 回归估计一个连续值
  • 分类预测一个离散类别

1.1 从回归到多类分类

image-20230715114743908

均方损失

image-20230715114838000

无校验比例

要将输出视为概率,我们必须保证在任何数据上的输出都是非负的且总和为1。 此外,我们需要一个训练的目标函数,来激励模型精准地估计概率。 例如, 在分类器输出0.5的所有样本中,我们希望这些样本是刚好有一半实际上属于预测的类别。 这个属性叫做校准(calibration)。

image-20230715115015582

image-20230715115036834

softmax函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持 可导的性质。 为了完成这一目标,我们首先对每个未规范化的预测求幂,这样可以确保输出非负。 为了确保最终输出的概率值总和为1,我们再让每个求幂后的结果除以它们的总和

Softmax是一个非线性函数,但是softmax回归的输出仍然由输入特征的仿射变换决定,因此Softmax回归是一个线性模型

交叉熵损失

image-20230715160208197

image-20230715115228261

总结:

  • Softmax回归是一个多分类模型
  • 使用Softmax操纵子得到每个类的预测置信度
  • 使用交叉熵来衡量预测和标号的区别

1.2三种常见的损失函数

均方损失

image-20230715115421275

  • 蓝色的曲线代表y=0时,变换预测值y’的函数
  • 绿色的曲线代表其似然函数
  • 橙色的曲线代表损失函数的梯度

绝对值损失函数

image-20230715115705327

鲁棒损失

image-20230715115818105

2.图像分类集

Fashion-MNIST数据集本地下载

2.1读取数据集

%matplotlib inline
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
from d2l import torch as d2l

d2l.use_svg_display()

# 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式,
# 并除以255使得所有像素的数值均在0~1之间
trans = transforms.ToTensor()
mnist_train = torchvision.datasets.FashionMNIST(
    root="F:/pytorch/data", train=True, transform=trans, download=False)
mnist_test = torchvision.datasets.FashionMNIST(
    root="F:/pytorch/data", train=False, transform=trans, download=False)

Fashion-MNIST由10个类别的图像组成, 每个类别由训练数据集(train dataset)中的6000张图像 和测试数据集(test dataset)中的1000张图像组成。 因此,训练集和测试集分别包含60000和10000张图像。 测试数据集不会用于训练,只用于评估模型性能。

len(mnist_train), len(mnist_test)

#(60000, 10000)

每个输入图像的高度和宽度均为28像素。 数据集由灰度图像组成,其通道数为1

mnist_train[0][0].shape

#torch.Size([1, 28, 28])

Fashion-MNIST中包含的10个类别,分别为t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙)、coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、bag(包)和ankle boot(短靴)。 以下函数用于在数字标签索引及其文本名称之间进行转换。

def get_fashion_mnist_labels(labels):  #@save
    """返回Fashion-MNIST数据集的文本标签"""
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
                   'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
    return [text_labels[int(i)] for i in labels]

创建一个函数来可视化这些样本

def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):  
    """绘制图像列表"""
    figsize = (num_cols * scale, num_rows * scale)
    _, axes = plt.subplots(num_rows, num_cols, figsize=figsize)
    axes = axes.flatten()
    for i, (ax, img) in enumerate(zip(axes, imgs)):
        if torch.is_tensor(img):
            # 图片张量
            ax.imshow(img.numpy())
        else:
            # PIL图片
            ax.imshow(img)
        ax.axes.get_xaxis().set_visible(False)
        ax.axes.get_yaxis().set_visible(False)
        if titles:
            ax.set_title(titles[i])
    return axes

以下是训练数据集中前几个样本的图像及其相应的标签。

X, y = next(iter(data.DataLoader(mnist_train, batch_size=18)))
show_images(X.reshape(18, 28, 28), 2, 9, titles=get_fashion_mnist_labels(y));

image-20230715180306137

2.2读取小批量

在每次迭代中,数据加载器每次都会读取一小批量数据,大小为batch_size。 通过内置数据迭代器,我们可以随机打乱了所有样本,从而无偏见地读取小批量。

batch_size = 256

def get_dataloader_workers():  #@save
    """使用4个进程来读取数据"""
    return 4

train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,
                             num_workers=get_dataloader_workers())

我们看一下读取训练数据所需的时间。

timer = d2l.Timer()
for X, y in train_iter:
    continue
f'{timer.stop():.2f} sec'

2.3整合组件

现在我们定义load_data_fashion_mnist函数,用于获取和读取Fashion-MNIST数据集。 这个函数返回训练集和验证集的数据迭代器。 此外,这个函数还接受一个可选参数resize,用来将图像大小调整为另一种形状。

def load_data_fashion_mnist(batch_size, resize=None):  #@save
    """下载Fashion-MNIST数据集,然后将其加载到内存中"""
    trans = [transforms.ToTensor()]
    if resize:
        trans.insert(0, transforms.Resize(resize))
    trans = transforms.Compose(trans)
    mnist_train = torchvision.datasets.FashionMNIST(
        root="../data", train=True, transform=trans, download=True)
    mnist_test = torchvision.datasets.FashionMNIST(
        root="../data", train=False, transform=trans, download=True)
    return (data.DataLoader(mnist_train, batch_size, shuffle=True,
                            num_workers=get_dataloader_workers()),
            data.DataLoader(mnist_test, batch_size, shuffle=False,
                            num_workers=get_dataloader_workers()))

通过指定resize参数来测试load_data_fashion_mnist函数的图像大小调整功能

train_iter, test_iter = load_data_fashion_mnist(32, resize=64)
for X, y in train_iter:
    print(X.shape, X.dtype, y.shape, y.dtype)
    break

3.从零实现Softmax回归

引入Fashion-MNIST数据集, 并设置数据迭代器的批量大小为256

batch_size = 256
train_iter, test_iter = load_data_fashion_mnist(batch_size)

3.1初始化模型参数

原始数据集中的每个样本都是28×28的图像,这里将展平每个图像,把它们看作长度为784的向量,回想一下,在softmax回归中,我们的输出与类别一样多。 因为我们的数据集有10个类别,所以网络输出维度为10。 因此,权重将构成一个784×10的矩阵,偏置将构成一个1×10的行向量, 与线性回归一样,我们将使用正态分布初始化我们的权重W,偏置初始化为0。

num_inputs = 784
num_outputs = 10

W = torch.normal(0, 0.01, size=(num_inputs, num_outputs), requires_grad=True)
b = torch.zeros(num_outputs, requires_grad=True)

3.2定义softmax操作

我们在使用如sum函数进行求和的时候,如果指定维度的情况下,会把相应的维度进行降维,如X为一个(2, 3)的张量,X.sum(0)则返回一个(3, )的向量,X.sum(1)返回一个(2, )的向量。但是如果我们把参数keepdim设置为True,则会保持这个维度为1,仍然为原本尺寸的张量。

X = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
X.sum(0, keepdim=True), X.sum(1, keepdim=True)

'''(tensor([[5., 7., 9.]]),
 tensor([[ 6.],
         [15.]]))'''

image-20230715181850047

def softmax(X):
    X_exp = torch.exp(X)
    partition = X_exp.sum(1, keepdim=True)
    return X_exp / partition  # 这里应用了广播机制

对于任何随机输入,我们将每个元素变成一个非负数。 此外,依据概率原理,每行总和为1。

X = torch.normal(0, 1, (2, 5))
X_prob = softmax(X)
X_prob, X_prob.sum(1)

'''(tensor([[0.2968, 0.4115, 0.0945, 0.1603, 0.0368],
         [0.2128, 0.5422, 0.0865, 0.1104, 0.0481]]),
 tensor([1.0000, 1.0000]))'''

3.3定义模型

下面的代码定义了输入如何通过网络映射到输出。 注意,将数据传递到模型之前,我们使用reshape函数将每张原始图像展平为向量

def net(X):
    return softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) + b)

3.4定义损失函数

交叉熵采用真实标签的预测概率的负对数似然。 这里我们不使用Python的for循环迭代预测(这往往是低效的), 而是通过一个运算符选择所有元素。 下面,我们创建一个数据样本y_hat,其中包含2个样本在3个类别的预测概率, 以及它们对应的标签y。 有了y,我们知道在第一个样本中,第一类是正确的预测; 而在第二个样本中,第三类是正确的预测。 然后使用y作为y_hat中概率的索引, 我们选择第一个样本中第一个类的概率和第二个样本中第三个类的概率。实现嵌套提取对应真实标号的概率

y = torch.tensor([0, 2])
y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y_hat[[0, 1], y]

'''tensor([0.1000, 0.5000])'''

实现交叉熵函数

def cross_entropy(y_hat, y):
    return - torch.log(y_hat[range(len(y_hat)), y])

cross_entropy(y_hat, y)

'''tensor([2.3026, 0.6931])'''

3.5分类精度

为了计算精度,我们执行以下操作。 首先,如果y_hat是矩阵,那么假定第二个维度存储每个类的预测分数。 我们使用argmax获得每行中最大元素的索引来获得预测类别。 然后我们将预测类别与真实y元素进行比较。 由于等式运算符“==”对数据类型很敏感, 因此我们将y_hat的数据类型转换为与y的数据类型一致。 结果是一个包含0(错)和1(对)的张量。 最后,我们求和会得到正确预测的数量

def accuracy(y_hat, y):  
    """计算预测正确的数量"""
    if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
        y_hat = y_hat.argmax(axis=1)
    cmp = y_hat.type(y.dtype) == y
    return float(cmp.type(y.dtype).sum())
'''使用上面的示例可以轻松得出上面示例的精度率'''
accuracy(y_hat, y) / len(y)
'''output: 0.5'''

对于任意数据迭代器data_iter可访问的数据集, 我们可以评估在任意模型net的精度。

def evaluate_accuracy(net, data_iter):  #@save
    """计算在指定数据集上模型的精度"""
    if isinstance(net, torch.nn.Module):
        net.eval()  # 将模型设置为评估模式
    metric = Accumulator(2)  # 正确预测数、预测总数
    with torch.no_grad():
        for X, y in data_iter:
            metric.add(accuracy(net(X), y), y.numel())
    return metric[0] / metric[1]

这里定义一个实用程序类Accumulator,用于对多个变量进行累加。 在上面的evaluate_accuracy函数中, 我们在Accumulator实例中创建了2个变量, 分别用于存储正确预测的数量和预测的总数量。 当我们遍历数据集时,两者都将随着时间的推移而累加。

class Accumulator:  
    """在n个变量上累加"""
    def __init__(self, n):
        self.data = [0.0] * n

    def add(self, *args):
        self.data = [a + float(b) for a, b in zip(self.data, args)]

    def reset(self):
        self.data = [0.0] * len(self.data)

    def __getitem__(self, idx):
        return self.data[idx]

初始化的时候会根据传进来的n的大小来创建n个空间,且初始化全部为0.0。

使用.add()的时候,虽然*args代表这里可以传入任意个参数,但是因为要和初始化的个数相同不然要报错。for a,b in zip(self.data,args)是把原来类中对应位置的data和新传入的args做 a + float(b)加法操作然后重新赋给该位置的data。从而达到累加器的累加效果。

reset函数即重新设置空间大小并初始化。__getitem__实现通过传入下标抓取数值操作。
由于我们使用随机权重初始化net模型, 因此该模型的精度应接近于随机猜测。 例如在有10个类别情况下的精度为0.1

evaluate_accuracy(net, test_iter)
'''output :  0.1012'''

3.6训练

def train_epoch_ch3(net, train_iter, loss, updater):  #@save
    """训练模型一个迭代周期(定义见第3章)"""
    # 将模型设置为训练模式
    if isinstance(net, torch.nn.Module):
        net.train()
    # 训练损失总和、训练准确度总和、样本数
    metric = Accumulator(3)
    for X, y in train_iter:
        # 计算梯度并更新参数
        y_hat = net(X)
        l = loss(y_hat, y)
        if isinstance(updater, torch.optim.Optimizer):
            # 使用PyTorch内置的优化器和损失函数
            updater.zero_grad()
            l.mean().backward()
            updater.step()
        else:
            # 使用定制的优化器和损失函数
            l.sum().backward()
            updater(X.shape[0])
        metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())
    # 返回训练损失和训练精度
    return metric[0] / metric[2], metric[1] / metric[2]

在展示训练函数的实现之前,我们定义一个在动画中绘制数据的实用程序类Animator

class Animator:  #@save
    """在动画中绘制数据"""
    def __init__(self, xlabel=None, ylabel=None, legend=None, xlim=None,
                 ylim=None, xscale='linear', yscale='linear',
                 fmts=('-', 'm--', 'g-.', 'r:'), nrows=1, ncols=1,
                 figsize=(3.5, 2.5)):
        # 增量地绘制多条线
        if legend is None:
            legend = []
        d2l.use_svg_display()
        self.fig, self.axes = d2l.plt.subplots(nrows, ncols, figsize=figsize)
        if nrows * ncols == 1:
            self.axes = [self.axes, ]
        # 使用lambda函数捕获参数
        self.config_axes = lambda: d2l.set_axes(
            self.axes[0], xlabel, ylabel, xlim, ylim, xscale, yscale, legend)
        self.X, self.Y, self.fmts = None, None, fmts

    def add(self, x, y):
        # 向图表中添加多个数据点
        if not hasattr(y, "__len__"):
            y = [y]
        n = len(y)
        if not hasattr(x, "__len__"):
            x = [x] * n
        if not self.X:
            self.X = [[] for _ in range(n)]
        if not self.Y:
            self.Y = [[] for _ in range(n)]
        for i, (a, b) in enumerate(zip(x, y)):
            if a is not None and b is not None:
                self.X[i].append(a)
                self.Y[i].append(b)
        self.axes[0].cla()
        for x, y, fmt in zip(self.X, self.Y, self.fmts):
            self.axes[0].plot(x, y, fmt)
        self.config_axes()
        display.display(self.fig)
        display.clear_output(wait=True)

接下来我们实现一个训练函数, 它会在train_iter访问到的训练数据集上训练一个模型net。 该训练函数将会运行多个迭代周期(由num_epochs指定)。 在每个迭代周期结束时,利用test_iter访问到的测试数据集对模型进行评估。 我们将利用Animator类来可视化训练进度。

def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater):  #@save
    """训练模型(定义见第3章)"""
    animator = Animator(xlabel='epoch', xlim=[1, num_epochs], ylim=[0.3, 0.9],
                        legend=['train loss', 'train acc', 'test acc'])
    for epoch in range(num_epochs):
        train_metrics = train_epoch_ch3(net, train_iter, loss, updater)
        test_acc = evaluate_accuracy(net, test_iter)
        animator.add(epoch + 1, train_metrics + (test_acc,))
    train_loss, train_acc = train_metrics
    assert train_loss < 0.5, train_loss
    assert train_acc <= 1 and train_acc > 0.7, train_acc
    assert test_acc <= 1 and test_acc > 0.7, test_acc

作为一个从零开始的实现,我们使用定义的 小批量随机梯度下降来优化模型的损失函数,设置学习率为0.1。

lr = 0.1

def updater(batch_size):
    return d2l.sgd([W, b], lr, batch_size)

现在,我们训练模型10个迭代周期。 请注意,迭代周期(num_epochs)和学习率(lr)都是可调节的超参数。 通过更改它们的值,我们可以提高模型的分类精度。

num_epochs = 10
train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, updater)

image-20230715183456533

3.7预测

现在训练已经完成,我们的模型已经准备好对图像进行分类预测。 给定一系列图像,我们将比较它们的实际标签(文本输出的第一行)和模型预测(文本输出的第二行)。

def predict_ch3(net, test_iter, n=6):  #@save
    """预测标签(定义见第3章)"""
    for X, y in test_iter:
        break
    trues = d2l.get_fashion_mnist_labels(y)
    preds = d2l.get_fashion_mnist_labels(net(X).argmax(axis=1))
    titles = [true +'\n' + pred for true, pred in zip(trues, preds)]
    d2l.show_images(
        X[0:n].reshape((n, 28, 28)), 1, n, titles=titles[0:n])

predict_ch3(net, test_iter)

image-20230715183525550

4.softmax回归的简洁实现

4.1初始化模型参数

import torch
from torch import nn
from d2l import torch as d2l

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)

softmax回归的输出层是一个全连接层。 因此,为了实现我们的模型, 我们只需在Sequential中添加一个带有10个输出的全连接层。 同样,在这里Sequential并不是必要的, 但它是实现深度模型的基础。 我们仍然以均值0和标准差0.01随机初始化权重。

类似于手动实现那里,我们使用了nn.Flatten()先定义了一个展平层,它保留了输入tensor的第0维度(这里就是batch_size),然后把剩余的维度降维成一维向量 (即 256 * 28 * 28 —> 256 * 784)

# PyTorch不会隐式地调整输入的形状。因此,
# 我们在线性层前定义了展平层(flatten),来调整网络输入的形状
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights);

4.2损失函数

loss = nn.CrossEntropyLoss(reduction='none')

4.3优化算法

我们使用学习率为0.1的小批量随机梯度下降作为优化算法。 这与我们在线性回归例子中的相同,这说明了优化器的普适性。

trainer = torch.optim.SGD(net.parameters(), lr=0.1)

4.4训练

调用定义的训练函数来训练模型

num_epochs = 10
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

image-20230715184104198

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

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

相关文章

计网笔记--应用层

1--网络程序的组织方式和关系 网络应用程序在各种端系统上的组织方式及其关系主要有两种&#xff1a; 客户/服务器方式&#xff08;C/S方式&#xff09;和对等方式&#xff08;P2P方式&#xff09;&#xff1b; 2--动态主机配置协议&#xff08;DHCP&#xff09; 动态主机配置协…

26 sigmoid Belief Network

文章目录 26 Sigmoid Belief Network26.1 背景介绍26.2 通过log-likelihood推断SBN的后验26.3 醒眠算法——Wake Sleep Algorithm 26 Sigmoid Belief Network 26.1 背景介绍 什么是Sigmoid Belief Network&#xff1f;Belief Network等同于Bayesian Network&#xff0c;表示有…

新手如何自学PostgreSQL(PG)

如果你是一个新手&#xff0c;想要自学PostgreSQL&#xff0c;下面是一些步骤和资源&#xff0c;可以帮助你入门&#xff1a; ①了解数据库基础知识&#xff1a;在开始学习PostgreSQL之前&#xff0c;建议你先了解一些数据库的基础概念和术语&#xff0c;例如表、列、行、SQL查…

【Elasticsearch】搜索结果处理和RestClient查询文档

目录 2.搜索结果处理 2.1.排序 2.1.1.普通字段排序 2.1.2.地理坐标排序 2.2.分页 2.2.1.基本的分页 2.2.2.深度分页问题 2.2.3.小结 2.3.高亮 2.3.1.高亮原理 2.3.2.实现高亮 2.4.总结 3.RestClient查询文档 3.1.快速入门 3.1.1.发起查询请求 3.1.2.解析响应 …

LangChain(6)构建用户自己的Agent

构建用户自己的Agent 编写简单的计算工具编写有多个参数的工具其它更高级的工具 LangChain 中有一些可用的Agent内置工具&#xff0c;但在实际应用中我们可能需要编写自己的Agent。 编写简单的计算工具 !pip install -qU langchain openai transformersfrom langchain.tools …

Spring-Interceptor拦截器

使用步骤 申明拦截器bean&#xff0c;并实现HandlerInterceptor接口 true为放行&#xff0c;false为拦截 2.定义配置类&#xff0c;继承WebMvcConfigurationSupport&#xff0c;实现addInterceptors方法&#xff0c;该方法调用具体的拦截器进行拦截 也可以在配子类通过实现W…

HTPP入门教程||HTTP 状态码||HTTP content-type

HTTP 状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含 HTTP 状态码的信息头&#xff08;server header&#xff09;用以响应浏览器的请求。 HTTP 状态码的英文为…

Springboot+Flask+Neo4j+Vue2+Vuex+Uniapp+Mybatis+Echarts+Swagger综合项目学习笔记

文章目录 Neo4j教程&#xff1a;Neo4j高性能图数据库从入门到实战 医疗问答系统算法教程&#xff1a;医学知识图谱问答系统项目示例&#xff1a;neo4j知识图谱 Vueflask 中药中医方剂大数据可视化系统可视化技术&#xff1a;ECharts、D.jsflask教程&#xff1a;速成教程Flask w…

『分割』 分割圆柱

原始点云 直通滤波过滤后&#xff08;z:0~1.5&#xff09; 分割到的平面 分割得到的圆柱形 代码&#xff1a; #include <pcl/ModelCoefficients.h> #include <pcl/io/pcd_io.h> #include <pcl/filters/extract_indices.h> // 用于提取指定索引的数据 #inclu…

伪标签(pseudo label)(半监督学习)

使用伪标签进行半监督学习&#xff0c;在机器学习竞赛当中是一个比较容易快速上分的关键点。下面给大家来介绍一下什么是基于伪标签的半监督学习。在传统的监督学习当中&#xff0c;我们的训练集具有标签&#xff0c;同时&#xff0c;测试集也具有标签。这样我们通过训练集训练…

RS485转ETHERCAT连接西门子支持ethercat吗

我们将为大家介绍一款强大的设备——远创智控YC-ECT-RS485/232通讯网关。这是一款自主研发的ETHERCAT从站功能的网关&#xff0c;它能够将ETHERCAT网络和RS485或RS232设备无缝连接。 这款网关在ETHERCAT总线和RS485或RS232总线中均能发挥主站或从站的作用。它的最大特点就是解决…

ICCV 2023 接收结果出炉!再创历史新高!录用2160篇!(附6篇最新论文)

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【计算机视觉】微信交流群 2023 年 7 月 14 日13:03&#xff0c;ICCV 2023 顶会论文接收结果出炉&#xff01;这次直接放出论文 Accepted Paper ID List。这也意味着&#xf…

【大数据趋势】7月15日 汇率,美澳,恒指期货的大数据趋势概率分析。

1. 数据源头之一 : 美元汇率破位&#xff0c;下面有3-7%的空间 从程序模拟趋势来看&#xff0c;如果没有干预&#xff0c;美元这个破位后&#xff0c;下方空间是3-7%。从中期趋势来看&#xff0c;是一次破位寻找新的稳定位置&#xff0c;在RSI的底部附近&#xff0c;现在刚刚开…

6.3.1 利用Wireshark进行协议分析(一)

6.3.1 利用Wireshark进行协议分析&#xff08;一&#xff09; Wireshark是目前全球使用最广泛的抓包软件&#xff0c;也是很强大的抓包软件&#xff0c;不管从事网络测试还是软件开发工程师&#xff0c;Wireshark都是一个非常实用的好工具。单纯的学习网络理论知识很抽象&…

个人笔记:下载及配置maven详细步骤

下载maven以及配置maven 访问 maven 官网&#xff0c;这里我下载的是 3.6.1的版本&#xff0c;尽量不要下载太新的版本&#xff0c;新版本可能会不太稳定&#xff0c;遇到一些奇奇怪怪的问题。 官网地址&#xff1a; https://maven.apache.org/download.cgi点击 download&…

安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用后台模块SessionCookieToken身份验证唯一性

文章目录 开发环境数据导入-mysql架构&库表列数据库操作-mysqli函数&增删改查数据接收输出-html混编&超全局变量第三方插件引用-js传参&函数对象调用身份验证-Cookie使用身份验证-Session使用唯一性判断-Token使用具体安全知识点&#xff1a;Cookie和Session都…

aes加密解密算法流程

有了https加密传输为何还要使用AES加密 HTTPS&#xff08;HTTP Secure&#xff09;是基于 SSL/TLS 协议的安全通信协议&#xff0c;通过对传输的数据进行加密和认证来确保通信的机密性、完整性和身份验证。它使用了公钥加密来建立安全通道&#xff0c;并使用对称密钥加密来加密…

分享一个创意滚筒按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>滚筒按钮</title><style>* {border: 0;box-sizing: border-box;margin: 0;padding: 0;}:ro…

COMP527数据分析:中心性度量

在数据分析中&#xff0c;中心性度量通常是指描述数据集中心位置的统计量。