感知器(Perceptron)是一个经典的机器学习算法,常用于二分类问题。它是神经网络的基础,最早由Frank Rosenblatt在1958年提出。今天,我们将用C#实现一个简单的感知器算法,让你理解感知器的工作原理,并能够亲自编码一个可用的模型。
一、感知器算法概述
感知器是一种线性分类器,其核心思想是通过调整权重(weights)和偏置(bias),使得模型能够根据输入数据进行分类。感知器通过迭代优化这些参数,最终得到一个超平面来分割不同类别的数据。
1. 感知器模型的工作原理
感知器的基本结构如下:
-
输入层:接收输入数据。
-
加权求和:每个输入与对应的权重相乘,并加上偏置项。
-
激活函数:将加权和通过一个阈值(通常为零)转换为输出。
感知器的输出 ( y ) 可以通过以下公式表示: [ y = \text{sign}(w_1x_1 + w_2x_2 + ... + w_nx_n + b) ]
-
( w ):权重向量
-
( x ):输入向量
-
( b ):偏置
-
(\text{sign}) 是符号函数,输出1或-1
感知器的目标是找到最优的权重和偏置,使得分类误差最小。
2. 感知器的训练过程
感知器的训练过程就是不断调整权重和偏置,以最小化预测值和真实标签之间的差异。更新规则如下:
-
如果预测正确,权重保持不变。
-
如果预测错误,则更新权重和偏置: [ w = w + \eta \cdot (y{\text{true}} - y{\text{pred}}) \cdot x ] [ b = b + \eta \cdot (y{\text{true}} - y{\text{pred}}) ] 其中,(\eta) 是学习率,( y{\text{true}} ) 和 ( y{\text{pred}} ) 分别是实际标签和预测标签。
二、用C#实现感知器
现在,让我们用C#来实现一个简单的感知器算法,应用于经典的“与(AND)”或“或(OR)”二分类问题。
1. 感知器类的实现
我们首先定义一个感知器类,包含初始化权重、训练模型和预测函数。
using System;
public class Perceptron
{
private double[] weights;
private double bias;
private double learningRate;
public Perceptron(int inputSize, double learningRate = 0.1)
{
weights = new double[inputSize];
bias = 0;
this.learningRate = learningRate;
}
// 激活函数
private int Activate(double sum)
{
return sum >= 0 ? 1 : -1; // 阈值函数
}
// 训练感知器
public void Train(double[][] inputs, int[] labels, int epochs)
{
for (int epoch = 0; epoch < epochs; epoch++)
{
for (int i = 0; i < inputs.Length; i++)
{
// 计算加权和
double sum = 0;
for (int j = 0; j < weights.Length; j++)
{
sum += inputs[i][j] * weights[j];
}
sum += bias;
// 获取预测结果
int prediction = Activate(sum);
// 更新权重和偏置
if (prediction != labels[i])
{
for (int j = 0; j < weights.Length; j++)
{
weights[j] += learningRate * (labels[i] - prediction) * inputs[i][j];
}
bias += learningRate * (labels[i] - prediction);
}
}
}
}
// 预测
public int Predict(double[] input)
{
double sum = 0;
for (int i = 0; i < weights.Length; i++)
{
sum += input[i] * weights[i];
}
sum += bias;
return Activate(sum);