不调用sklearn模块,自己实现最近邻算法,并计算在测试集上的准确率
时间: 2024-10-24 18:12:43 浏览: 12
在Python中,不依赖`sklearn`库,我们可以自定义一个简单的最近邻(K-Nearest Neighbors, KNN)算法。首先,我们需要一个数据结构来存储训练样本和它们对应的标签,以及一个距离度量函数(如欧氏距离)。以下是基本步骤:
1. **准备数据**:
- 将数据分为训练集和测试集。
- 训练集中保存特征值和对应的类别。
2. **实现KNN类**:
- 定义一个类,包含计算距离、找到最近邻居、预测新数据点类别等功能。
- `find_neighbors` 函数接收一个新的数据点和阈值k,返回其k个最接近的训练样本及其类别。
```python
class KNN:
def __init__(self, k=3):
self.k = k
self.train_data = None
self.train_labels = None
def fit(self, X_train, y_train):
self.train_data = X_train
self.train_labels = y_train
def euclidean_distance(self, x1, x2):
# 自己实现欧氏距离计算
pass
def predict(self, X_test):
predictions = []
for test_point in X_test:
distances = [(self.euclidean_distance(test_point, train), label)
for train, label in zip(self.train_data, self.train_labels)]
top_k_neighs = sorted(distances)[:self.k]
most_common_class = Counter([dist[1] for dist in top_k_neighs]).most_common(1)[0][0]
predictions.append(most_common_class)
return predictions
```
3. **评估模型**:
- 使用预测结果和实际测试标签比较,计算准确率。
```python
def accuracy_score(y_true, y_pred):
correct_count = sum([1 for i in range(len(y_true)) if y_true[i] == y_pred[i]])
return correct_count / len(y_true)
X_train, X_test, y_train, y_test = ... # 分割数据
knn = KNN()
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"测试集上的准确率为: {acc * 100}%")
```
阅读全文