感知器

感知器#

感知器(Perceptron)是Frank Rosenblatt在1957年就职于康奈尔航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。感知器是一种最简单的神经网络模型。

假设我们有一个输入特征向量 \(x\),包含 \(n\) 个特征值 \((x1, x2, …, xn)\),以及对应的权重向量 \(w(w1, w2, …, wn)\) 和偏置 \(b\)

感知器的数学表达如下:

\( z = w · x + b \\ \hat{y} = sign(z) \)

其中,\(z\) 代表加权输入(加权特征和偏置的总和),\(sign()\)是符号函数,根据\(z\) 的正负返回1或-1,\(\hat{y}\) 是感知器的预测输出。

感知器的训练目标是根据训练数据调整权重和偏置,使得感知器能够正确分类样本。训练过程中,我们通过与真实标签y进行比较并计算误差来更新权重和偏置。

感知器的更新规则如下:

\( w_{new} = w_{old} + η * (y - \hat{y}) * x \\ b_{new} = b_{old} + η * (y - \hat{y}) \)

其中,\(η\) 是学习率,控制每次更新的步长大小。

通过反复迭代上述更新过程,感知器可以逐渐调整权重和偏置,以找到一个能够正确分类训练数据的超平面(线性决策边界)。

需要注意的是,感知器算法只适用于线性可分的数据。对于线性不可分的数据集,感知器算法将无法收敛。

感知器可用于分类和回归。

下面是用感知器对鸢尾花分类的示例:

from sklearn.linear_model import Perceptron
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

# 加载Iris数据集
iris = load_iris()
X, y = iris.data, iris.target

# 数据预处理:特征缩放
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 创建感知器模型
perceptron = Perceptron()

# 在训练集上拟合模型
perceptron.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = perceptron.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
准确率: 0.9666666666666667

下面手写一个感知器进行回归

import numpy as np

# 定义训练数据
X = np.array([[1], [2], [3], [4], [5]])  # 输入特征
y = np.array([2, 4, 6, 8, 10])           # 目标值

# 定义感知器模型
class Perceptron:
    def __init__(self):
        self.w = None   # 权重
        self.b = None   # 偏置

    def fit(self, X, y, epochs=10, learning_rate=0.01):
        n_samples, n_features = X.shape
        self.w = np.zeros(n_features)
        self.b = 0

        for _ in range(epochs):
            for i in range(n_samples):
                y_pred = self.predict(X[i])
                error = y[i] - y_pred
                self.w += learning_rate * error * X[i]
                self.b += learning_rate * error

    def predict(self, x):
        return np.dot(x, self.w) + self.b

# 创建感知器对象并拟合数据
perceptron = Perceptron()
perceptron.fit(X, y)

# 进行预测
x_test = np.array([[6], [7]])  # 预测新的输入样本
y_pred = perceptron.predict(x_test)
print("预测结果:", y_pred)
预测结果: [11.716452   13.58681458]