From b55bd5673785049f9ec5b84f8340c2679998b274 Mon Sep 17 00:00:00 2001 From: zhe <2904040094@qq.com> Date: Wed, 16 Oct 2024 20:35:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20function.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- function.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/function.py b/function.py index 6dc8874..ffac6f2 100644 --- a/function.py +++ b/function.py @@ -1,8 +1,7 @@ # function.py import numpy as np from collections import Counter -from scipy.spatial.distance import mahalanobis -from sklearn.covariance import EmpiricalCovariance # 用于计算协方差矩阵 +from sklearn.preprocessing import StandardScaler # 用于数据标准化 """ 挑战说明: - 自行编写实现 KNN 分类算法。 @@ -59,18 +58,13 @@ def classify0(inX, dataSet, labels, k=2): # 确保输入样本inX是numpy数组 inX = np.array(inX) - # 将训练数据集转换为numpy数组(如果尚未转换) - dataSet = np.array(dataSet) + # 标准化数据(使用训练数据的均值和标准差来转换输入数据和训练数据) + scaler = StandardScaler().fit(dataSet) + dataSet_scaled = scaler.transform(dataSet) + inX_scaled = scaler.transform([inX]) - # 计算训练数据集的均值向量和协方差矩阵 - mean_vector = np.mean(dataSet, axis=0) - cov_matrix = EmpiricalCovariance().fit(dataSet).covariance_ - - # 计算输入样本与所有训练样本之间的马氏距离 - # 注意:mahalanobis函数要求输入样本和均值向量的形状匹配,因此我们需要reshape inX - # 同时,我们需要为每个训练样本单独计算距离,因此我们需要循环或使用列表推导式 - distances = [mahalanobis(inX.reshape(1, -1), x_train.reshape(1, -1), VI=np.linalg.inv(cov_matrix)) - for x_train in dataSet] + # 计算输入样本与所有训练样本之间的欧几里得距离 + distances = [np.sqrt(np.sum((inX_scaled[0] - x_train) ** 2)) for x_train in dataSet_scaled] # 根据距离对训练样本进行排序,并获取前k个最近邻的索引 k_indices = np.argsort(distances)[:k]