帮我写一段matlab代码,利用sigmoid函数,基于梯度下降法实现与门感知器
时间: 2024-05-01 20:17:16 浏览: 99
以下是基于sigmoid函数和梯度下降法的与门感知器的MATLAB代码:
```matlab
% 初始化输入和期望输出
X = [0, 0; 0, 1; 1, 0; 1, 1];
Y = [0; 0; 0; 1];
% 初始化权重和偏置
w = rand(2, 1);
b = rand();
% 设置学习率和迭代次数
alpha = 0.1;
epochs = 10000;
% 定义sigmoid函数
sigmoid = @(x) 1 ./ (1 + exp(-x));
% 开始训练
for i = 1:epochs
% 正向传播
z = X * w + b;
a = sigmoid(z);
% 反向传播
dz = a - Y;
dw = X' * dz;
db = sum(dz);
% 更新权重和偏置
w = w - alpha * dw;
b = b - alpha * db;
% 计算损失函数
J = -(Y' * log(a) + (1 - Y)' * log(1 - a));
% 输出训练过程
if mod(i, 1000) == 0
disp(['Epoch: ', num2str(i), ' Loss: ', num2str(J)]);
end
end
% 测试模型
testX = [0, 0; 0, 1; 1, 0; 1, 1];
testY = [0; 0; 0; 1];
testZ = testX * w + b;
testA = sigmoid(testZ);
testA(testA >= 0.5) = 1;
testA(testA < 0.5) = 0;
disp(['Test Accuracy: ', num2str(sum(testA == testY) / length(testY) * 100), '%']);
```
这段代码首先初始化了输入和期望输出,并随机初始化了权重和偏置。接着,定义了sigmoid函数并设置了学习率和迭代次数。在训练阶段,代码通过正向传播计算输出,在反向传播中计算梯度并更新权重和偏置。每1000个epoch输出一次损失函数。在测试阶段,代码用训练好的模型预测测试数据,并输出测试准确率。
阅读全文