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
结果说明

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

相关推荐
罗宇超MS6 小时前
如何看待企业自建AI知识库?
人工智能·alm
土星云SaturnCloud7 小时前
液冷“内卷”:在局部优化与系统重构之间,寻找第三条路
服务器·人工智能·ai·计算机外设
智界前沿7 小时前
集之互动AI创意视频解决方案:商业级可控,让品牌创意从“灵感”直达“落地”
人工智能·aigc
baby_hua7 小时前
20251024_PyTorch深度学习快速入门教程
人工智能·pytorch·深度学习
brave and determined7 小时前
CANN训练营 学习(day9)昇腾AscendC算子开发实战:从零到性能冠军
人工智能·算法·机器学习·ai·开发环境·算子开发·昇腾ai
SelectDB7 小时前
Apache Doris 4.0.2 版本正式发布
数据库·人工智能
Solar20257 小时前
TOB企业智能获客新范式:基于数据驱动与AI的销售线索挖掘与孵化架构实践
人工智能·架构
AI营销实验室7 小时前
原圈科技如何以多智能体赋能AI营销内容生产新范式
人工智能
视***间7 小时前
智驱万物,视联未来 —— 视程空间以 AI 硬科技赋能全场景智能革新
人工智能·边缘计算·视程空间·ai算力开发板