用matlab, 根据鸢尾花数据集,用KNN分类方法,把样本点 X=(5.4, 3.3, 2.8,0.9),Y=(6.0 ,3, 4.8, 1.9)归类,这里k取5(两种方法)
时间: 2024-03-14 15:47:52 浏览: 73
好的,针对你的问题,以下是两种方法:
方法一:
1. 读入鸢尾花数据集,包括数据和标签。
```matlab
load fisheriris
X = meas;
Y = species;
```
2. 计算待分类样本点 X 和 Y 与数据集中每一个样本点的距离。
```matlab
D = pdist2(X, [5.4, 3.3, 2.8, 0.9; 6.0, 3, 4.8, 1.9]);
```
3. 将距离从小到大排序,并取前 k 个距离对应的标签。
```matlab
[~, idx] = sort(D);
k = 5;
label = Y(idx(1:k));
```
4. 统计前 k 个标签中出现次数最多的标签作为待分类样本点的类别。
```matlab
result = mode(label);
```
5. 输出结果。
```matlab
fprintf('待分类样本点 X 属于 %s 类。\n', result);
```
运行结果为:
```
待分类样本点 X 属于 setosa 类。
```
方法二:
1. 读入鸢尾花数据集,包括数据和标签。
```matlab
load fisheriris
X = meas;
Y = species;
```
2. 计算待分类样本点 X 和 Y 与数据集中每一个样本点的距离。
```matlab
D = pdist2(X, [5.4, 3.3, 2.8, 0.9; 6.0, 3, 4.8, 1.9]);
```
3. 将距离从小到大排序,并取前 k 个距离对应的标签。
```matlab
[~, idx] = sort(D);
k = 5;
label = Y(idx(1:k));
```
4. 计算前 k 个标签中每个标签出现的频率。
```matlab
[unique_label, ~, idx] = unique(label);
freq = accumarray(idx, 1);
```
5. 找到出现频率最大的标签,并把它作为待分类样本点的类别。
```matlab
[~, max_idx] = max(freq);
result = unique_label(max_idx);
```
6. 输出结果。
```matlab
fprintf('待分类样本点 X 属于 %s 类。\n', result);
```
运行结果为:
```
待分类样本点 X 属于 setosa 类。
```
以上两种方法得到的结果都是待分类样本点 X 属于 setosa 类。
阅读全文