如何在Matlab中绘制类似示例图的感知机数据集
修正感知机实验数据集生成与可视化代码
你这段Matlab代码在数据集生成和分类逻辑上存在不少问题,没法正确输出符合要求的感知机实验数据。我帮你调整优化,完全贴合你需要的规则:
问题分析
原代码的核心问题:
- 分类标签
Y的生成逻辑完全错误,没有遵循sin(x₁) > x₂的判断规则 x₂的生成写法冗余混乱,分组逻辑和分类规则不匹配- 绘图时的点分组没有对应正确的分类结果
修正后的完整代码
clc; close all; clear all; % 设置样本总数 I = 400; % 生成符合范围要求的数据集 x1 = rand(I, 1) * 2*pi; % x₁ ∈ [0, 2π] x2 = rand(I, 1) * 2 - 1; % x₂ ∈ [-1, 1],通过缩放平移rand的[0,1]区间得到 X = [x1, x2]; % 按照规则生成分类标签:sin(x₁) > x₂时标记为1,否则标记为-1(可按需换成0/1) Y = ones(I, 1); Y(sin(x1) <= x2) = -1; % 提取两类数据的索引,用于绘图 class1_points = Y == 1; % 满足sin(x₁) > x₂的点 class2_points = Y == -1; % 不满足条件的点 % 可视化数据集与分类边界 figure; plot(X(class1_points, 1), X(class1_points, 2), 'bx', 'DisplayName', 'sin(x₁) > x₂'); hold on; plot(X(class2_points, 1), X(class2_points, 2), 'go', 'DisplayName', 'sin(x₁) ≤ x₂'); % 添加参考正弦曲线,清晰展示分类边界 x_ref = linspace(0, 2*pi, 1000); plot(x_ref, sin(x_ref), 'r-', 'DisplayName', 'y = sin(x)'); % 完善图表标注 grid on; xlabel('x₁'); ylabel('x₂'); title('感知机实验数据集可视化'); legend;
代码说明
- 数据集生成:
x1直接通过rand(I,1)*2*pi生成[0,2π]区间的随机数,写法简洁准确x2用rand(I,1)*2 -1将[0,1]区间的随机数缩放平移到[-1,1],比原代码逻辑更清晰
- 分类标签:
- 先初始化所有标签为1,再把不满足
sin(x₁) > x₂的点标签设为-1,严格匹配你的分类规则
- 先初始化所有标签为1,再把不满足
- 可视化优化:
- 按分类标签提取对应点,确保绘图点和分类结果完全对应
- 添加了参考正弦曲线,直观展示两类点的划分边界
- 补充了坐标轴标签、标题和图例,让图表可读性更强
运行这段代码后,你就能得到完全符合要求的数据集,清晰看到两类点被正弦曲线划分的效果,可以直接用于后续的感知机实验环节。
内容的提问来源于stack exchange,提问作者azor0707id
相关产品推荐
相关产品推荐

