1 多层感知机(MLP)

多层感知机(Multilayer Perceptron, MLP)是一种前馈神经网络,包含一个或多个隐藏层。它能够学习数据中的非线性关系,广泛应用于分类和回归任务。MLP的每个神经元对输入信号进行加权求和,然后通过激活函数引入非线性。

1.1 架构

MLP通常包含以下几部分:

  1. 输入层:接收输入特征。
  2. 隐藏层:一个或多个,每一层包含多个神经元。
  3. 输出层:产生最终的预测结果。

每层的输出作为下一层的输入。隐藏层的神经元通过激活函数引入非线性,使得模型能够学习复杂的模式。

1.2 激活函数

激活函数是神经元的输出函数,用于引入非线性。常见的激活函数包括:

  • ReLU(Rectified Linear Unit) ( ReLU ( x ) = max ⁡ ( 0 , x ) ) ( \text{ReLU}(x) = \max(0, x) ) (ReLU(x)=max(0,x))
  • Sigmoid ( Sigmoid ( x ) = 1 1 + e − x ) ( \text{Sigmoid}(x) = \frac{1}{1 + e^{-x}} ) (Sigmoid(x)=1+ex1)
  • Tanh ( Tanh ( x ) = e x − e − x e x + e − x ) ( \text{Tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} ) (Tanh(x)=ex+exexex)

激活函数的选择对模型的性能有重要影响。

1.3 训练过程

MLP的训练过程包括以下几个步骤:

  1. 前向传播:从输入层开始,逐层计算输出。
  2. 计算损失:通过损失函数(如交叉熵损失或均方误差损失)计算预测值与真实值之间的差异。
  3. 反向传播:计算损失函数关于每个参数的梯度。
  4. 参数更新:使用优化算法(如梯度下降法)更新模型参数。
1.4 应用场景

MLP可以应用于各种分类和回归任务,例如:

  • 图像分类:将图像的像素值作为输入,预测图像的类别。
  • 语音识别:将语音信号的特征作为输入,预测语音内容。
  • 自然语言处理:将文本的向量表示作为输入,预测文本的情感倾向等。
1.5 示例代码

以下是一个简单的MLP实现,使用PyTorch框架。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset# 模拟一些简单的数据
X = torch.randn(100, 2)
y = torch.randint(0, 2, (100,))# 定义MLP模型
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.layers = nn.Sequential(nn.Linear(2, 10),  # 输入层到隐藏层nn.ReLU(),         # 激活函数nn.Linear(10, 2)   # 隐藏层到输出层)def forward(self, x):return self.layers(x)# 实例化模型
model = MLP()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 数据加载器
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=10, shuffle=True)# 训练模型
num_epochs = 100
for epoch in range(num_epochs):for inputs, targets in loader:# 前向传播outputs = model(inputs)loss = criterion(outputs, targets)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()if (epoch + 1) % 10 == 0:print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
  • 隐藏层:隐藏层是MLP的核心,通过引入非线性激活函数,使得模型能够学习复杂的模式。
  • 激活函数:激活函数引入非线性,使得模型能够处理非线性问题。
  • 反向传播:反向传播是训练MLP的关键,通过计算损失函数的梯度,更新模型参数,最小化损失函数。
  • 优化算法:选择合适的优化算法(如SGD、Adam等)对模型的训练效果有重要影响。

通过理解多层感知机的架构和训练过程,你可以更好地应用它来解决实际问题。

2 激活函数

激活函数是神经网络中每个神经元的输出函数,用于引入非线性,使得模型能够学习复杂的模式。以下是几种常见的激活函数及其特点:

2.1. ReLU(Rectified Linear Unit)
  • 公式 ( ReLU ( x ) = max ⁡ ( 0 , x ) ) ( \text{ReLU}(x) = \max(0, x) ) (ReLU(x)=max(0,x))
  • 特点:计算简单,收敛速度快,常用于隐藏层。但存在“神经元死亡”问题(当输入为负时,梯度为零)。
  • 应用场景:广泛应用于卷积神经网络和多层感知机。
2.2. Sigmoid
  • 公式 ( Sigmoid ( x ) = 1 1 + e − x ) ( \text{Sigmoid}(x) = \frac{1}{1 + e^{-x}} ) (Sigmoid(x)=1+ex1)
  • 特点:输出范围在 (0, 1),可用于二分类问题的输出层。但容易出现梯度消失问题(当输入绝对值较大时,梯度趋近于零)。
  • 应用场景:二分类问题的输出层。
2.3. Tanh(双曲正切函数)
  • 公式 ( Tanh ( x ) = e x − e − x e x + e − x ) ( \text{Tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} ) (Tanh(x)=ex+exexex)
  • 特点:输出范围在 (-1, 1),比 Sigmoid 收敛更快,但同样存在梯度消失问题。
  • 应用场景:隐藏层。
2.4. Leaky ReLU
  • 公式 ( Leaky ReLU ( x ) = max ⁡ ( 0.01 x , x ) ) ( \text{Leaky ReLU}(x) = \max(0.01x, x) ) (Leaky ReLU(x)=max(0.01x,x))
  • 特点:解决了 ReLU 的“神经元死亡”问题,通过引入一个较小的斜率(如 0.01)来处理负值输入。
  • 应用场景:需要避免神经元死亡问题的场景。
2.5. ELU(Exponential Linear Unit)
  • 公式 ( ELU ( x ) = { x , x > 0 α ( e x − 1 ) , x ≤ 0 ) ( \text{ELU}(x) = \begin{cases} x, & x > 0 \\ \alpha(e^x - 1), & x \leq 0 \end{cases} ) (ELU(x)={x,α(ex1),x>0x0)
  • 特点:在负值区域引入非线性,有助于缓解梯度消失问题。参数 α \alpha α通常设置为 1.0。
  • 应用场景:需要更好的收敛性能的场景。
2.6. Swish
  • 公式 ( Swish ( x ) = x ⋅ Sigmoid ( x ) ) ( \text{Swish}(x) = x \cdot \text{Sigmoid}(x) ) (Swish(x)=xSigmoid(x))
  • 特点:由 Google 提出,具有平滑的非线性特性,通常比 ReLU 表现更好。
  • 应用场景:各种深度学习任务。
2.7 激活函数的比较
激活函数优点缺点应用场景
ReLU计算简单,收敛快神经元死亡问题隐藏层
Sigmoid输出范围固定梯度消失问题二分类输出层
Tanh输出范围对称梯度消失问题隐藏层
Leaky ReLU解决神经元死亡问题需要调整斜率参数需要避免神经元死亡的场景
ELU缓解梯度消失问题计算稍复杂需要更好收敛性能的场景
Swish平滑非线性,性能好计算稍复杂各种深度学习任务
2.8 代码示例

以下是使用PyTorch实现几种常见激活函数的示例:

import torch
import torch.nn as nn
import matplotlib.pyplot as plt# 定义输入数据
x = torch.linspace(-5, 5, 100)# 定义激活函数
relu = nn.ReLU()
sigmoid = nn.Sigmoid()
tanh = nn.Tanh()
leaky_relu = nn.LeakyReLU(0.01)
elu = nn.ELU()
swish = nn.SiLU()  # PyTorch 1.7+ 支持 Swish# 计算输出
y_relu = relu(x)
y_sigmoid = sigmoid(x)
y_tanh = tanh(x)
y_leaky_relu = leaky_relu(x)
y_elu = elu(x)
y_swish = swish(x)# 绘制图像
plt.figure(figsize=(12, 8))plt.subplot(2, 3, 1)
plt.plot(x.numpy(), y_relu.numpy(), label='ReLU')
plt.xlabel('x')
plt.ylabel('y')
plt.title('ReLU')
plt.grid(True)plt.subplot(2, 3, 2)
plt.plot(x.numpy(), y_sigmoid.numpy(), label='Sigmoid', color='orange')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Sigmoid')
plt.grid(True)plt.subplot(2, 3, 3)
plt.plot(x.numpy(), y_tanh.numpy(), label='Tanh', color='green')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Tanh')
plt.grid(True)plt.subplot(2, 3, 4)
plt.plot(x.numpy(), y_leaky_relu.numpy(), label='Leaky ReLU', color='red')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Leaky ReLU')
plt.grid(True)plt.subplot(2, 3, 5)
plt.plot(x.numpy(), y_elu.numpy(), label='ELU', color='purple')
plt.xlabel('x')
plt.ylabel('y')
plt.title('ELU')
plt.grid(True)plt.subplot(2, 3, 6)
plt.plot(x.numpy(), y_swish.numpy(), label='Swish', color='brown')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Swish')
plt.grid(True)plt.tight_layout()
plt.show()
  • 非线性:激活函数的主要作用是引入非线性,使得神经网络能够学习数据中的复杂模式。
  • 梯度消失:Sigmoid 和 Tanh 等激活函数在输入绝对值较大时,梯度趋近于零,导致训练过程变慢。
  • 选择合适的激活函数:根据具体任务和网络结构选择合适的激活函数,可以显著提高模型的性能和训练效率。

通过理解不同激活函数的特点和应用场景,你可以更好地选择和应用它们来构建高效的神经网络模型。

3 多层感知机的从零开始实现

使用Python和PyTorch从零开始实现一个多层感知机(MLP)。我们将逐步构建模型,包括数据准备、模型定义、训练和评估。

3.1 数据准备

首先,我们需要准备一些用于训练的数据。这里我们使用一个简单的二维数据集,目标是将其分类为两个类别。

import numpy as np
import matplotlib.pyplot as plt# 生成数据集
np.random.seed(42)
X = np.random.rand(100, 2)  # 100个样本,每个样本2个特征
y = (X[:, 0] + X[:, 1] > 1).astype(np.int64)  # 简单的分类规则# 绘制数据
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.xlabel('X1')
plt.ylabel('X2')
plt.title('Generated Data')
plt.legend()
plt.show()
3.2 定义模型

接下来,我们定义一个多层感知机模型。我们将实现一个包含一个隐藏层的MLP,隐藏层使用ReLU激活函数。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import TensorDataset, DataLoader# 转换为张量
X_tensor = torch.tensor(X, dtype=torch.float32)
y_tensor = torch.tensor(y, dtype=torch.long)# 创建数据集和数据加载器
dataset = TensorDataset(X_tensor, y_tensor)
data_loader = DataLoader(dataset, batch_size=10, shuffle=True)# 定义模型
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.hidden = nn.Linear(2, 4)  # 输入特征维度为2,隐藏层维度为4self.output = nn.Linear(4, 2)  # 隐藏层维度为4,输出维度为2def forward(self, x):x = torch.relu(self.hidden(x))  # 使用ReLU激活函数x = self.output(x)return xmodel = MLP()
3.3 定义损失函数和优化器

我们使用交叉熵损失函数和随机梯度下降优化器来训练模型。

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
3.4 训练模型

现在,我们开始训练模型。我们将迭代多个周期,并在每个周期中执行前向传播、计算损失、执行反向传播和更新参数。

# 训练模型
num_epochs = 100
losses = []for epoch in range(num_epochs):for X_batch, y_batch in data_loader:# 前向传播y_pred = model(X_batch)loss = criterion(y_pred, y_batch)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()losses.append(loss.item())if (epoch + 1) % 10 == 0:print(f'Epoch {epoch + 1}, Loss: {loss.item():.4f}')# 绘制损失曲线
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Loss Curve')
plt.show()
3.5 模型评估

训练完成后,我们评估模型的性能,计算准确率。

# 计算准确率
model.eval()  # 设置为评估模式
with torch.no_grad():y_pred = model(X_tensor)_, predicted = torch.max(y_pred, 1)accuracy = (predicted == y_tensor).sum().item() / len(y_tensor)print(f'Accuracy: {accuracy * 100:.2f}%')
3.6 可视化决策边界

为了更好地理解模型的分类效果,我们可以可视化决策边界。

# 可视化决策边界
h = .02  # 网格步长
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))# 计算模型预测
Z = model(torch.tensor(np.c_[xx.ravel(), yy.ravel()], dtype=torch.float32))
Z = torch.max(Z, 1)[1].numpy().reshape(xx.shape)# 绘制决策边界
plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlabel('X1')
plt.ylabel('X2')
plt.title('Decision Boundary')
plt.show()
3.7 完整代码

将上述代码整合在一起,可以直接运行以下代码来实现多层感知机模型的从零开始实现:

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import TensorDataset, DataLoader
import matplotlib.pyplot as plt# 生成数据集
np.random.seed(42)
X = np.random.rand(100, 2)  # 100个样本,每个样本2个特征
y = (X[:, 0] + X[:, 1] > 1).astype(np.int64)  # 简单的分类规则# 转换为张量
X_tensor = torch.tensor(X, dtype=torch.float32)
y_tensor = torch.tensor(y, dtype=torch.long)# 创建数据集和数据加载器
dataset = TensorDataset(X_tensor, y_tensor)
data_loader = DataLoader(dataset, batch_size=10, shuffle=True)# 定义模型
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.hidden = nn.Linear(2, 4)  # 输入特征维度为2,隐藏层维度为4self.output = nn.Linear(4, 2)  # 隐藏层维度为4,输出维度为2def forward(self, x):x = torch.relu(self.hidden(x))  # 使用ReLU激活函数x = self.output(x)return xmodel = MLP()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)# 训练模型
num_epochs = 100
losses = []for epoch in range(num_epochs):for X_batch, y_batch in data_loader:# 前向传播y_pred = model(X_batch)loss = criterion(y_pred, y_batch)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()losses.append(loss.item())if (epoch + 1) % 10 == 0:print(f'Epoch {epoch + 1}, Loss: {loss.item():.4f}')# 绘制损失曲线
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Loss Curve')
plt.show()# 计算准确率
model.eval()  # 设置为评估模式
with torch.no_grad():y_pred = model(X_tensor)_, predicted = torch.max(y_pred, 1)accuracy = (predicted == y_tensor).sum().item() / len(y_tensor)print(f'Accuracy: {accuracy * 100:.2f}%')# 可视化决策边界
h = .02  # 网格步长
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))# 计算模型预测
Z = model(torch.tensor(np.c_[xx.ravel(), yy.ravel()], dtype=torch.float32))
Z = torch.max(Z, 1)[1].numpy().reshape(xx.shape)# 绘制决策边界
plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlabel('X1')
plt.ylabel('X2')
plt.title('Decision Boundary')
plt.show()

4 多层感知机的简洁实现

利用 PyTorch 提供的高级 API 来构建多层感知机(MLP),这将帮助我们更加高效地实现模型,减少手动定义和管理模型细节的工作量。

4.1 构建多层感知机
4.1.1. 导入必要的库

首先,我们需要导入 PyTorch 中的相关模块,这些模块将被用于定义模型、优化器以及数据加载器等。

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
4.1.2. 定义 MLP 模型

使用 PyTorch 的 nn.Module 定义一个简单的多层感知机,包含一个隐藏层。这里我们定义一个简单的两层神经网络,隐藏层使用 ReLU 激活函数,输出层没有激活函数。

class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 = nn.Linear(784, 128)  # 输入层到隐藏层的线性变换self.fc2 = nn.Linear(128, 10)   # 隐藏层到输出层的线性变换def forward(self, x):x = F.relu(self.fc1(x))  # 隐藏层后应用 ReLU 激活函数x = self.fc2(x)return x
  • nn.Linear:定义了一个全连接层。
  • F.relu:将 ReLU 激活函数应用于隐藏层的输出。
4.1.3. 准备数据集

为了训练模型,我们需要一个数据集。这里我们使用 PyTorch 的 torchvision 库来加载 MNIST 数据集,并使用 DataLoader 将其封装为一个可迭代的数据加载器。

from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 数据转换
transform = transforms.Compose([transforms.ToTensor(),  # 将图像数据转换为张量transforms.Normalize((0.1307,), (0.3081,))  # 标准化
])# 下载并加载训练集和测试集
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)
4.1.4. 初始化模型和优化器

创建 MLP 模型的实例,并初始化优化器。这里我们使用随机梯度下降(SGD)优化器。

model = MLP()
optimizer = optim.SGD(model.parameters(), lr=0.01)
4.1.5. 训练模型

定义一个训练函数,执行模型的训练过程。这个过程包括前向传播、损失计算、反向传播和参数更新。

def train(model, device, train_loader, optimizer, epoch):model.train()for batch_idx, (data, target) in enumerate(train_loader):data, target = data.view(-1, 784).to(device), target.to(device)  # 将数据展平为 784 维的向量optimizer.zero_grad()output = model(data)loss = F.cross_entropy(output, target)  # 计算交叉熵损失loss.backward()optimizer.step()if batch_idx % 100 == 0:print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} ({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')
4.1.6. 测试模型

定义一个测试函数,评估模型在测试集上的性能。

def test(model, device, test_loader):model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.view(-1, 784).to(device), target.to(device)output = model(data)test_loss += F.cross_entropy(output, target, reduction='sum').item()  # 将一批的损失相加pred = output.argmax(dim=1, keepdim=True)  # 获得概率最大的索引correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)print(f'\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)} ({100. * correct / len(test_loader.dataset):.0f}%)')
4.1.7. 定义设备并开始训练

在训练之前,定义使用的设备(CPU 或 GPU),然后开始训练和测试过程。

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)for epoch in range(1, 11):  # 进行 10 轮训练train(model, device, train_loader, optimizer, epoch)test(model, device, test_loader)
4.2 注意事项
  1. 数据预处理:数据预处理对于模型的性能至关重要。在 MNIST 数据集的例子中,我们进行了归一化处理,以提高模型的训练效率。
  2. 超参数调整:学习率、隐藏层大小、批次大小等超参数对模型的训练和测试性能有重要影响,需要根据具体任务进行调整。
  3. 模型复杂度:增加隐藏层或隐藏层神经元的数量可以提高模型的表示能力,但同时也会增加训练难度和计算成本。
  4. 过拟合和欠拟合:如果模型在训练集上表现很好,但在测试集上表现不佳,可能是过拟合;如果模型在训练集上表现也不好,可能是欠拟合。需要通过调整模型复杂度、增加数据量、使用正则化等方法来解决这些问题。

通过这种简洁的实现方式,我们可以快速地构建和训练一个基本的多层感知机模型,同时也可以方便地对模型进行扩展和优化,以适应更复杂的任务和数据集。

4.5 模型评估

评估训练后的模型性能,计算准确率:

# 计算准确率
model.eval()  # 设置为评估模式
with torch.no_grad():y_pred = model(X_tensor)_, predicted = torch.max(y_pred, 1)accuracy = (predicted == y_tensor).sum().item() / len(y_tensor)print(f'Accuracy: {accuracy * 100:.2f}%')

4.6 多层感知机的应用

多层感知机可以应用于各种分类和回归任务。通过增加隐藏层和调整网络结构,可以提高模型的性能和泛化能力。

多层感知机通过引入隐藏层和非线性激活函数,能够学习数据中的复杂模式,适用于各种分类和回归任务。

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

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

相关文章

第十三篇:MySQL 运维自动化与可观测性建设实践指南

本篇重点介绍 MySQL 运维自动化的关键工具与流程,深入实践如何构建高效可观测体系,实现数据库系统的持续稳定运行与故障快速响应。 一、为什么需要 MySQL 运维自动化与可观测性? 运维挑战: 手动备份容易遗漏或失败; …

蜜獾算法(HBA,Honey Badger Algorithm)

2021年由Hashim等人提出(论文:Honey Badger Algorithm: A New Metaheuristic Algorithm for Solving Optimization Problems)。模拟蜜獾在自然界中的智能捕食行为,属于群体智能优化算法(与粒子群PSO、遗传算法GA同属一…

Duix.HeyGem:以“离线+开源”重构数字人创作生态

在AI技术快速演进的今天,虚拟数字人正从高成本、高门槛的专业领域走向大众化应用。Duix.HeyGem 数字人项目正是这一趋势下的杰出代表。该项目由一支拥有七年AI研发经验的团队打造,通过放弃传统3D建模路径,转向真人视频驱动的AI训练模型,成功实现了低成本、高质量、本地化的…

HTTP常见的请求方法、响应状态码、接口规范介绍

HTTP(Hypertext Transfer Protocol)是Web通信的基础协议,用于客户端和服务器之间的请求和响应。本文将详细介绍HTTP常见的请求方法、响应状态码以及接口规范,帮助开发者更好地理解和使用HTTP协议。 一、HTTP请求方法 HTTP请求方…

基于Matlab实现LDA算法

线性判别分析(Linear Discriminant Analysis, LDA)是一种经典的统计方法,常用于特征降维和分类问题。在机器学习领域, 一、LDA基本原理 LDA的目标是寻找一个投影空间,使得类间距离最大化,同时保持类内距离…

matlab基于GUI实现水果识别

基于GUI实现水果识别系统,限一个图片内存在一种水果 图像处理是一种利用计算机分析图像以达到预期结果的技术。图像处理一般指数字图像处理,而数字图像指由工业相机、摄像机、扫描仪等设备捕捉到的二维数组,数组中的元素称为像素&#xff0c…

XML 编码:结构化数据的基石

XML 编码:结构化数据的基石 引言 XML(可扩展标记语言)作为互联网上广泛使用的数据交换格式,已经成为结构化数据存储和传输的重要工具。本文旨在深入探讨XML编码的原理、应用场景以及编码规范,帮助读者更好地理解和运用XML。 XML编码概述 1. XML的起源 XML诞生于1998年…

虚拟机无法开启-关掉虚拟化

这个问题我之前解决过,没做笔记,这次记录下,最常见都上开启bois的cpu虚拟化。 其次是启动或关闭功能页面也需要选择,再就是和wsl都冲突问题,就是今天这个问题 您的主机不满足在启用 Hyper-V 或 Device/Credential Gua…

Python数据可视化科技图表绘制系列教程(二)

目录 表格风格图 使用Seaborn函数绘图 设置图表风格 设置颜色主题 图表分面 绘图过程 使用绘图函数绘图 定义主题 分面1 分面2 【声明】:未经版权人书面许可,任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博…

LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++

https://leetcode.cn/problems/search-a-2d-matrix/description/ 一、题目分析 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 ta…

猎板硬金镀层厚度:新能源汽车高压系统的可靠性基石

在新能源汽车的电池管理系统(BMS)和电机控制器中,硬金镀层厚度直接关系到高压环境下的电气稳定性与使用寿命。猎板针对车载场景开发的耐电迁移方案(金层 2.5μm,镍层 8μm),经 150℃/85% RH 高压…

亚马逊站内信规则2025年重大更新:避坑指南与合规策略

亚马逊近期对Buyer-Seller Messaging(买家-卖家站内信)规则进行了显著收紧,明确将一些曾经的“灰色操作”列为违规。违规操作轻则收到警告,重则导致账户暂停或绩效受限。本文为您全面解析本次规则更新的核心要点、背后逻辑&#x…

WPF可拖拽ListView

1.控件描述 WPF实现一个ListView控件Item子项可删除也可拖拽排序&#xff0c;效果如下图所示 2.实现代码 配合 WrapPanel 实现水平自动换行&#xff0c;并开启拖拽 <ListViewx:Name"listView"Grid.Row"1"Width"300"AllowDrop"True&…

相机--双目立体相机

教程 链接1 教程汇总 立体匹配算法基础概念 视频讲解摄像机标定和双目立体原理 两个镜头。 双目相机也叫立体相机--Stereo Camera&#xff0c;属于深度相机。 作用 1&#xff0c;获取图像特征&#xff1b; 2&#xff0c;获取图像深度信息&#xff1b; 原理 原理和标定 …

Unity3D仿星露谷物语开发59之定制角色衬衫

1、目标 自定义角色衬衫、裤子、手臂颜色。 2、概念 在Assets -> Sprites -> Output Textures下&#xff0c;Customised_farmer为目前角色所用的精灵表。 如果上面是输出纹理&#xff0c;那么输入纹理是什么呢&#xff1f;它位于Assets/Sprites/Sprite Textures/Chara…

【HarmonyOS 5】游戏开发教程

一、开发环境搭建 ‌工具配置‌ 安装DevEco Studio 5.1&#xff0c;启用CodeGenie AI助手&#xff08;Settings → Tools → AI Assistant&#xff09;配置游戏模板&#xff1a;选择"Game"类型项目&#xff0c;勾选手机/平板/折叠屏多设备支持 二、游戏引擎核心架构…

深度探索:如何用DeepSeek重构你的工作流

前言:AI时代的工作革命 在人工智能浪潮席卷的今天,DeepSeek作为国产大模型的代表之一,正以其强大的自然语言处理能力、代码生成能力和多模态交互特性,重新定义着人类的工作方式。根据IDC报告显示,2024年企业级AI应用市场规模已突破800亿美元,其中智能办公场景占比达32%,…

Linux 进程调度与管理:从内核管理到调度机制的深度解析

文章目录 引言一、进程基础&#xff1a;概念与核心数据结构1.1 进程的本质&#xff1a;程序的动态化身1.2 进程控制块&#xff08;PCB&#xff09;&#xff1a;内核管理的灵魂1.2.1 链表节点嵌入1.2.2 链表操作宏1.2.3 全局链表管理 1.3 进程查看与系统调用1.3.1 通过系统调用获…

信息学奥赛一本通 1570:【例 2】能量项链 | 1843:【06NOIP提高组】能量项链 | 洛谷 P1063 [NOIP 2006 提高组] 能量项链

【题目链接】 ybt 1570&#xff1a;【例 2】能量项链 ybt 1843&#xff1a;【06NOIP提高组】能量项链 洛谷 P1063 [NOIP 2006 提高组] 能量项链 【题目考点】 1. 动态规划&#xff1a;区间动规 2. 环形序列 解决方法&#xff1a;破环为链 模板题&#xff1a;洛谷 P1880 [N…

旅游微信小程序制作指南

想创建旅游微信小程序吗&#xff1f;知道旅游业企业怎么打造自己的小程序吗&#xff1f;这里有零基础小白也能学会的教程&#xff0c;教你快速制作旅游类微信小程序&#xff01; 旅游行业能不能开发微信小程序呢&#xff1f;答案是肯定的。微信小程序对旅游企业来说可是个宝&am…