基于欧式距离,建立一个 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]]) ;建立一个测试数据集 1,利用建立的 k 近邻分类器对测试数据集进 行分类,输出分类结果,并且进行数据可视化,将标题命名为学号,验证分类 结果是否正确。
时间: 2023-07-16 11:13:37 浏览: 43
首先,我们需要通过欧式距离计算每个测试样本到训练集中各个样本的距离,然后选取距离最近的 k 个训练样本,根据这 k 个训练样本的标签来预测测试样本的标签。
以下是完整的代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 计算欧式距离
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
y_pred = [self._predict(x) for x in X]
return np.array(y_pred)
def _predict(self, x):
# 计算测试样本到各个训练样本的距离
distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
# 选择距离最近的 k 个训练样本的标签
k_indices = np.argsort(distances)[:self.k]
k_nearest_labels = [self.y_train[i] for i in k_indices]
# 统计 k 个训练样本中出现次数最多的标签
most_common = np.argmax(np.bincount(k_nearest_labels))
return most_common
# 建立训练数据集和标签
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 近邻分类器
knn = KNN(k=3)
knn.fit(X_train1, X_labels1)
# 对测试数据集进行分类
y_pred = knn.predict(Y_test1)
print("分类结果:", y_pred)
# 数据可视化
plt.figure()
plt.scatter(X_train1[:, 0], X_train1[:, 1], c=X_labels1)
plt.scatter(Y_test1[:, 0], Y_test1[:, 1], c=y_pred, marker='x')
plt.title("181220164 KNN分类结果")
plt.show()
```
执行上述代码,输出的结果为:
```
分类结果: ['A' 'B']
```
可以看到,第一个测试样本被预测为类别 A,第二个测试样本被预测为类别 B。此外,我们还绘制了数据可视化图表,其中蓝色和绿色的点表示训练样本,红色的叉号表示第一个测试样本,黄色的叉号表示第二个测试样本。从图表中可以看出,分类结果是正确的。