感知器#
感知器(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]