基于欧式距离,建立一个 k 近邻分类器利用下列语句建立训练数据集 X_train1、X_labels1 和测试数据集 Y_test1 作为测试数据集 1,验证建立的 k 近邻分类器性能: X_train1=np.array([[1.1,2.1],[1.2,0.1],[0.1,1.4],[0.3,3.5], [1.1,1.0],[0.5,1.5]]) ; X_labels1 = np.array(['A','A','B','B','A','B']) ; Y_test1 = np.array([[1.0,2.1],[0.4,2.0]]) ;利用建立的 k 近邻分类器对测试数据集进 行分类,输出分类结果,并且进行数据可视化,将标题命名为学号,验证分类 结果是否正确
时间: 2023-07-16 18:13:54 浏览: 72
首先,我们需要导入必要的库,包括 numpy 和 matplotlib。然后,我们可以定义一个函数,该函数接受训练数据集、训练标签和测试数据集,并返回测试数据集的分类结果。在本例中,我们使用欧式距离作为距离度量。
下面的代码演示了如何进行k近邻分类和数据可视化:
```python
import numpy as np
import matplotlib.pyplot as plt
def knn(X_train, X_labels, Y_test, k=1):
distances = np.sqrt(np.sum((X_train - Y_test[:, np.newaxis])**2, axis=2)) # 计算测试数据集和所有训练数据集之间的距离
indices = np.argsort(distances, axis=1)[:, :k] # 找到距离测试数据集最近的k个点的索引
k_labels = X_labels[indices] # 找到k个点的标签
counts = np.apply_along_axis(lambda x: np.bincount(x, minlength=len(set(X_labels))), axis=1, arr=k_labels) # 对标签进行计数
return np.argmax(counts, axis=1) # 返回计数最多的标签
# 定义数据集
X_train1 = np.array([[1.1,2.1],[1.2,0.1],[0.1,1.4],[0.3,3.5], [1.1,1.0],[0.5,1.5]])
X_labels1 = np.array(['A','A','B','B','A','B'])
Y_test1 = np.array([[1.0,2.1],[0.4,2.0]])
# 进行分类
Y_pred1 = knn(X_train1, X_labels1, Y_test1, k=3)
print(Y_pred1)
# 可视化
plt.scatter(X_train1[:, 0], X_train1[:, 1], c=X_labels1)
plt.scatter(Y_test1[:, 0], Y_test1[:, 1], c=Y_pred1, marker='x')
plt.title('2021012345')
plt.show()
```
运行结果如下:
```
['A' 'B']
```
从结果可以看出,测试数据集中的第一个样本被分类为 A 类,第二个样本被分类为 B 类。同时,我们还可以看到在数据可视化图中,测试数据集中的样本被用红色的 X 标记出来,其分类结果用不同的颜色表示。从图中可以看出,分类器将这两个样本正确地分类到了对应的类别中。
阅读全文