用matlab仿真产生两类二维样本数据,一类产生 50 个样本作为训练样本;一类产生 100 个样本作为考试样本,两类样本服从正态分布,按最近邻法用训练样本对考试样本分类,计算平均错误率;
时间: 2023-11-17 10:06:04 浏览: 110
基于狮群算法优化最近邻实现数据分类附matlab代码.zip
好的,我来解答你的问题。
首先,我们需要用 Matlab 产生两类二维正态分布的样本数据。假设样本数据服从正态分布 $N(\mu_i,\Sigma_i)$,其中 $\mu_1=(2,2)$,$\mu_2=(-2,-2)$,$\Sigma_1=\Sigma_2=\begin{bmatrix}1 & 0\\0 & 1\end{bmatrix}$。我们可以用下面的 Matlab 代码生成两类样本数据:
```matlab
% 产生训练样本数据
rng(1); % 设置随机数种子,保证每次运行结果一致
N1 = 50; % 第一类样本数量
N2 = 50; % 第二类样本数量
mu1 = [2, 2]; % 第一类样本均值
mu2 = [-2, -2]; % 第二类样本均值
sigma1 = [1, 0; 0, 1]; % 第一类样本协方差矩阵
sigma2 = [1, 0; 0, 1]; % 第二类样本协方差矩阵
X1 = mvnrnd(mu1, sigma1, N1); % 产生第一类样本数据
X2 = mvnrnd(mu2, sigma2, N2); % 产生第二类样本数据
X = [X1; X2]; % 合并样本数据
y = [ones(N1, 1); -ones(N2, 1)]; % 标记样本类别,第一类为 1,第二类为 -1
% 产生考试样本数据
M = 100; % 考试样本数量
Xtest = mvnrnd(mu1, sigma1, M); % 产生第一类考试样本数据
Xtest = [Xtest; mvnrnd(mu2, sigma2, M)]; % 合并第二类考试样本数据
ytest = [ones(M, 1); -ones(M, 1)]; % 标记考试样本类别
```
接下来,我们可以使用最近邻法对考试样本进行分类。最近邻法是一种简单的分类算法,它的基本思想是:将待分类样本与训练样本中的每个样本进行比较,找出距离待分类样本最近的训练样本,将该训练样本的类别作为待分类样本的类别。根据最近邻法的定义,我们可以编写如下的 Matlab 代码实现分类:
```matlab
% 最近邻法分类
K = 1; % 选择 K=1,即只考虑最近的一个邻居
ytest_pred = zeros(2*M, 1); % 存储预测结果
for i = 1 : 2*M
x = Xtest(i, :);
% 计算 x 与训练样本的距离
d = sum((X - x).^2, 2);
% 找出距离 x 最近的 K 个训练样本
[~, idx] = sort(d);
idx = idx(1:K);
% 根据 K 个训练样本的类别进行投票
ytest_pred(i) = sign(sum(y(idx)));
end
```
最后,我们可以计算分类的平均错误率。平均错误率定义为被错误分类的样本数量占总样本数量的比例,即:
$$
\text{平均错误率} = \frac{1}{2M}\sum_{i=1}^{2M}[\hat{y}_i \neq y_i]
$$
其中,$\hat{y}_i$ 表示第 $i$ 个样本的预测类别,$y_i$ 表示第 $i$ 个样本的真实类别。我们可以用下面的 Matlab 代码计算平均错误率:
```matlab
% 计算平均错误率
err_rate = mean(ytest_pred ~= ytest);
disp(['平均错误率:', num2str(err_rate)]);
```
完整的 Matlab 代码如下:
```matlab
rng(1); % 设置随机数种子,保证每次运行结果一致
N1 = 50; % 第一类样本数量
N2 = 50; % 第二类样本数量
mu1 = [2, 2]; % 第一类样本均值
mu2 = [-2, -2]; % 第二类样本均值
sigma1 = [1, 0; 0, 1]; % 第一类样本协方差矩阵
sigma2 = [1, 0; 0, 1]; % 第二类样本协方差矩阵
% 产生训练样本数据
X1 = mvnrnd(mu1, sigma1, N1); % 产生第一类样本数据
X2 = mvnrnd(mu2, sigma2, N2); % 产生第二类样本数据
X = [X1; X2]; % 合并样本数据
y = [ones(N1, 1); -ones(N2, 1)]; % 标记样本类别,第一类为 1,第二类为 -1
% 产生考试样本数据
M = 100; % 考试样本数量
Xtest = mvnrnd(mu1, sigma1, M); % 产生第一类考试样本数据
Xtest = [Xtest; mvnrnd(mu2, sigma2, M)]; % 合并第二类考试样本数据
ytest = [ones(M, 1); -ones(M, 1)]; % 标记考试样本类别
% 最近邻法分类
K = 1; % 选择 K=1,即只考虑最近的一个邻居
ytest_pred = zeros(2*M, 1); % 存储预测结果
for i = 1 : 2*M
x = Xtest(i, :);
% 计算 x 与训练样本的距离
d = sum((X - x).^2, 2);
% 找出距离 x 最近的 K 个训练样本
[~, idx] = sort(d);
idx = idx(1:K);
% 根据 K 个训练样本的类别进行投票
ytest_pred(i) = sign(sum(y(idx)));
end
% 计算平均错误率
err_rate = mean(ytest_pred ~= ytest);
disp(['平均错误率:', num2str(err_rate)]);
```
运行以上代码,即可得到最近邻法分类的平均错误率。
阅读全文