写一篇“优化课堂所讲Knn的流程,并封装为预测函数(如predict),模仿sklearn风格,将iris.csv拆分训练集合和测试集,通过预测结果,给出分类的预测准确性。 使用NumPy 完成KD 树的构建 测试数据集为:X = np.array([[2, 3], [5, 4], [9, 6], [4, 7], [8, 1], [7, 2]]) #每个样本有两个特征 y = np.array(['苹果', '苹果', '香蕉', '苹果', '香蕉', '香蕉']) #每个样本对应的标签 ”的心得
时间: 2023-05-27 18:08:00 浏览: 104
优化课堂所讲的Knn流程如下:
1. 导入需要的库,包括numpy和pandas。
2. 读取iris.csv数据集,并进行拆分,分为训练集和测试集。这里可以使用train_test_split函数进行拆分,拆分比例为70%的训练集和30%的测试集。
3. 对训练集进行数据预处理,包括特征提取和标准化。这里可以使用StandardScaler函数进行标准化处理。
4. 使用NumPy完成KD树的构建。KD树是一种多维空间的数据结构,可以用于快速地进行最近邻搜索。
5. 定义KNN模型,包括预测函数predict。这里需要注意的是,KNN模型的预测过程包括两步:首先找到最近的K个邻居,然后根据这些邻居的类别进行投票,决定预测结果。
6. 对测试集进行预测,并计算预测准确性。预测准确性可以使用sklearn中的accuracy_score函数进行计算。
以下是代码实现:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
# 读取数据集
data = pd.read_csv('iris.csv')
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data.iloc[:, :-1], data.iloc[:, -1], test_size=0.3, random_state=42)
# 数据预处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# KD树的构建
class KDNode:
def __init__(self, point=None, split=None, left=None, right=None):
self.point = point
self.split = split
self.left = left
self.right = right
class KDTree:
def __init__(self, data):
def build_tree(left, right, split):
if left >= right:
return None
mid = (left + right) // 2
axis = split % k
data.sort(key=lambda x: x[axis])
return KDNode(data[mid], axis, build_tree(left, mid, split+1), build_tree(mid+1, right, split+1))
k = len(data[0])
self.root = build_tree(0, len(data), 0)
def distance(point1, point2):
return np.sqrt(np.sum(np.square(point1 - point2)))
def knn_search(root, point, k):
knn_list = []
def travel(node):
if node:
dist = distance(node.point, point)
if len(knn_list) < k:
knn_list.append((dist, node.point))
else:
max_index = np.argmax([knn[0] for knn in knn_list])
if dist < knn_list[max_index][0]:
knn_list[max_index] = (dist, node.point)
axis = node.split
if point[axis] - knn_list[0][0] <= node.point[axis]:
travel(node.left)
if point[axis] + knn_list[0][0] >= node.point[axis]:
travel(node.right)
travel(root)
return knn_list
# KNN模型
class KNN:
def __init__(self, k):
self.k = k
self.kd_tree = None
def fit(self, X, y):
data = np.hstack((X, y[:, np.newaxis]))
self.kd_tree = KDTree(data)
def predict(self, X):
y_pred = []
for x in X:
knn_list = knn_search(self.kd_tree.root, x, self.k)
knn_label = [knn[1][-1] for knn in knn_list]
y_pred.append(np.bincount(knn_label).argmax())
return np.array(y_pred)
# 测试KNN模型
X = np.array([[2, 3], [5, 4], [9, 6], [4, 7], [8, 1], [7, 2]])
y = np.array([0, 0, 1, 1, 2, 2])
knn = KNN(k=3)
knn.fit(X, y)
X_test = np.array([[1, 4], [6, 5], [8, 2]])
y_pred = knn.predict(X_test)
print('KNN模型预测结果:', y_pred)
# 计算预测准确性
acc = accuracy_score(y_test, knn.predict(X_test))
print('KNN模型预测准确性:', acc)
阅读全文