MLP 多次感知器如何使用 二分类和多分类示例

多层感知器(MLP)是神经网络的一种基本类型,通常用于分类或回归任务。下面是一个简单的 Python 示例,演示如何使用多层感知器进行分类任务。我们将使用 scikit-learn 库中的 MLPClassifier 来创建一个多层感知器,并在鸢尾花数据集上进行训练和测试。

安装必要的库

如果你还没有安装 scikit-learn,你可以使用以下命令来安装它:

bash 复制代码
pip install scikit-learn

Python 代码示例

python 复制代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import classification_report, accuracy_score

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 标准化特征值
scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

# 创建多层感知器模型
mlp = MLPClassifier(hidden_layer_sizes=(10, 10, 10), max_iter=1000)

# 训练模型
mlp.fit(X_train, y_train)

# 进行预测
y_pred = mlp.predict(X_test)

# 输出模型性能
print(f"准确率: {accuracy_score(y_test, y_pred)}")
print("分类报告:")
print(classification_report(y_test, y_pred))

代码说明

  1. 加载数据 : 使用 load_iris 函数加载鸢尾花数据集,这是一个常用的多类别分类数据集。
  2. 划分数据集 : 使用 train_test_split 函数将数据集划分为训练集和测试集。
  3. 标准化特征值: MLP 对输入特征的缩放非常敏感,因此在训练前对数据进行标准化处理。
  4. 创建模型 : 使用 MLPClassifier 创建一个多层感知器模型。hidden_layer_sizes 参数定义了隐藏层的结构,在这个例子中,模型有三层隐藏层,每层包含 10 个神经元。
  5. 训练模型: 使用训练集训练模型。
  6. 预测和评估: 使用测试集进行预测,并输出模型的准确率和分类报告。

这个例子展示了如何使用多层感知器对数据进行分类任务。你可以调整 hidden_layer_sizes 参数或尝试其他数据集来进一步探索 MLP 的性能。

二分类问题示例

多层感知器(MLP)是一种前馈人工神经网络,它至少包含三层节点:输入层、隐藏层和输出层。下面是一个简单的例子,我们将构建一个具有一个隐藏层的MLP,用于二分类问题。

示例:二分类问题

假设我们有一些数据点,它们有两个特征和一个二进制标签(0 或 1)。我们的目标是使用MLP模型来预测一个新数据点的标签。

数据

以下是一些示例数据:

特征1 (x1) 特征2 (x2) 标签 (y)
0.5 0.6 0
0.75 0.7 1
0.2 0.3 0
0.8 0.9 1
0.4 0.1 0
MLP 结构

我们将构建一个具有以下结构的MLP:

  • 输入层:2个节点(对应两个特征)
  • 隐藏层:4个节点
  • 输出层:1个节点(二进制分类)
    我们将使用 Sigmoid 作为激活函数。
Python 实现

下面是使用 Python 和 numpy 实现的 MLP:

python 复制代码
import numpy as np
# Sigmoid 激活函数及其导数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
    return x * (1 - x)
# 训练数据
X = np.array([[0.5, 0.6], [0.75, 0.7], [0.2, 0.3], [0.8, 0.9], [0.4, 0.1]])
y = np.array([[0], [1], [0], [1], [0]])
# 随机初始化权重
np.random.seed(0)
weights_input_to_hidden = np.random.rand(X.shape[1], 4)
weights_hidden_to_output = np.random.rand(4, 1)
# 训练参数
learning_rate = 0.1
epochs = 10000
# 训练模型
for epoch in range(epochs):
    # 前向传播
    hidden_layer_input = np.dot(X, weights_input_to_hidden)
    hidden_layer_output = sigmoid(hidden_layer_input)
    
    final_output = np.dot(hidden_layer_output, weights_hidden_to_output)
    output = sigmoid(final_output)
    
    # 计算误差
    error = y - output
    
    # 反向传播
    d_output = error * sigmoid_derivative(output)
    
    error_hidden_layer = d_output.dot(weights_hidden_to_output.T)
    d_hidden_layer = error_hidden_layer * sigmoid_derivative(hidden_layer_output)
    
    # 更新权重
    weights_hidden_to_output += hidden_layer_output.T.dot(d_output) * learning_rate
    weights_input_to_hidden += X.T.dot(d_hidden_layer) * learning_rate
# 测试模型
new_data = np.array([[0.6, 0.8]])
hidden_layer_input = np.dot(new_data, weights_input_to_hidden)
hidden_layer_output = sigmoid(hidden_layer_input)
final_output = np.dot(hidden_layer_output, weights_hidden_to_output)
predicted_output = sigmoid(final_output)
print("预测结果:", predicted_output)
输出结果

假设输出结果如下:

预测结果: [[0.98850607]]
结果说明

这个结果表明,给定新的数据点 [0.6, 0.8],我们的 MLP 模型预测该数据点属于类别 1 的概率约为 98.85%。这意味着模型认为这个数据点更可能属于类别 1(标签为 1)。

通过这个例子,我们展示了如何使用 Python 和 numpy 实现一个简单的多层感知器,并且训练它来对数据进行分类。这个过程也说明了如何通过反向传播算法来更新网络权重,并使用训练好的模型进行预测。

多分类问题示例

多分类问题示例

假设我们有一个多分类问题,其中数据点有三个特征和一个标签,标签可以是三个不同的类别之一:'类别1'、'类别2'和'类别3'。我们的任务是使用多层感知器(MLP)来预测新数据点的类别。

数据

以下是一些示例数据:

特征1 (x1) 特征2 (x2) 特征3 (x3) 标签 (y)
0.2 0.3 0.5 类别1
0.8 0.9 0.7 类别2
0.5 0.6 0.4 类别3
0.1 0.2 0.3 类别1
0.9 0.8 0.6 类别2
MLP 结构

我们将构建一个具有以下结构的MLP:

  • 输入层:3个节点(对应三个特征)
  • 隐藏层:5个节点
  • 输出层:3个节点(对应三个类别)
    我们将使用 Sigmoid 作为激活函数,并在输出层使用 Softmax 函数来获取每个类别的概率。
Python 实现

下面是使用 Python 和 numpy 实现的 MLP:

python 复制代码
import numpy as np
# Sigmoid 激活函数及其导数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
    return x * (1 - x)
# Softmax 函数
def softmax(x):
    exp_x = np.exp(x - np.max(x))
    return exp_x / exp_x.sum(axis=0, keepdims=True)
# 标签转换为 one-hot 编码
def one_hot_encode(labels):
    n_labels = len(labels)
    n_unique_labels = len(np.unique(labels))
    one_hot_encode = np.zeros((n_labels, n_unique_labels))
    one_hot_encode[np.arange(n_labels), labels] = 1
    return one_hot_encode
# 训练数据
X = np.array([[0.2, 0.3, 0.5], [0.8, 0.9, 0.7], [0.5, 0.6, 0.4], [0.1, 0.2, 0.3], [0.9, 0.8, 0.6]])
y = np.array([0, 1, 2, 0, 1])  # 类别1, 类别2, 类别3
# 将标签转换为 one-hot 编码
y_one_hot = one_hot_encode(y)
# 随机初始化权重
np.random.seed(0)
weights_input_to_hidden = np.random.rand(X.shape[1], 5)
weights_hidden_to_output = np.random.rand(5, y_one_hot.shape[1])
# 训练参数
learning_rate = 0.1
epochs = 10000
# 训练模型
for epoch in range(epochs):
    # 前向传播
    hidden_layer_input = np.dot(X, weights_input_to_hidden)
    hidden_layer_output = sigmoid(hidden_layer_input)
    
    final_output = np.dot(hidden_layer_output, weights_hidden_to_output)
    output = softmax(final_output)
    
    # 计算误差
    error = y_one_hot - output
    
    # 反向传播
    d_output = error
    error_hidden_layer = d_output.dot(weights_hidden_to_output.T)
    d_hidden_layer = error_hidden_layer * sigmoid_derivative(hidden_layer_output)
    
    # 更新权重
    weights_hidden_to_output += hidden_layer_output.T.dot(d_output) * learning_rate
    weights_input_to_hidden += X.T.dot(d_hidden_layer) * learning_rate
# 测试模型
new_data = np.array([[0.6, 0.7, 0.5]])
hidden_layer_input = np.dot(new_data, weights_input_to_hidden)
hidden_layer_output = sigmoid(hidden_layer_input)
final_output = np.dot(hidden_layer_output, weights_hidden_to_output)
predicted_output = softmax(final_output)
print("预测结果概率:", predicted_output)
predicted_class = np.argmax(predicted_output)
print("预测类别:", predicted_class + 1)  # 加1是因为类别从1开始计数
输出结果

假设输出结果如下:

预测结果概率: [[0.01234568 0.95432184 0.03333248]]
预测类别: 2
结果说明

这个结果表明,给定新的数据

相关推荐
余生H31 分钟前
transformer.js(三):底层架构及性能优化指南
javascript·深度学习·架构·transformer
果冻人工智能1 小时前
2025 年将颠覆商业的 8 大 AI 应用场景
人工智能·ai员工
代码不行的搬运工1 小时前
神经网络12-Time-Series Transformer (TST)模型
人工智能·神经网络·transformer
石小石Orz1 小时前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
罗小罗同学1 小时前
医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22
深度学习·机器学习·transformer
孤独且没人爱的纸鹤1 小时前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
阿_旭1 小时前
TensorFlow构建CNN卷积神经网络模型的基本步骤:数据处理、模型构建、模型训练
人工智能·深度学习·cnn·tensorflow
羊小猪~~1 小时前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j
极客代码1 小时前
【Python TensorFlow】进阶指南(续篇三)
开发语言·人工智能·python·深度学习·tensorflow
zhangfeng11331 小时前
pytorch 的交叉熵函数,多分类,二分类
人工智能·pytorch·分类