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

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

相关推荐
小馒头学python几秒前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯10 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
正义的彬彬侠13 分钟前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
Debroon22 分钟前
RuleAlign 规则对齐框架:将医生的诊断规则形式化并注入模型,无需额外人工标注的自动对齐方法
人工智能
羊小猪~~29 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
AI小杨30 分钟前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测
晨曦_子画35 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
道可云37 分钟前
道可云人工智能&元宇宙每日资讯|2024国际虚拟现实创新大会将在青岛举办
大数据·人工智能·3d·机器人·ar·vr
人工智能培训咨询叶梓1 小时前
探索开放资源上指令微调语言模型的现状
人工智能·语言模型·自然语言处理·性能优化·调优·大模型微调·指令微调
zzZ_CMing1 小时前
大语言模型训练的全过程:预训练、微调、RLHF
人工智能·自然语言处理·aigc