From 2f548c9aeb85df218a0c5751e4a00d87591469fc Mon Sep 17 00:00:00 2001 From: wujunjie <297081150@qq.com> Date: Fri, 11 Oct 2024 11:48:02 +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 | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/function.py b/function.py index 6e7abe7..595e542 100644 --- a/function.py +++ b/function.py @@ -1,8 +1,6 @@ # function.py import numpy as np -import sklearn -from sklearn.preprocessing import StandardScaler -from numpy.linalg import inv, LinAlgError +from scipy.linalg import inv from scipy.spatial.distance import mahalanobis """ 挑战说明: @@ -39,56 +37,54 @@ name = "吴俊煯" - int: 预测的分类标签。 """ -def preprocess_data(data, use_pca=False, pca_components=None): + + +def preprocess_data(data): """ - 对数据进行预处理,包括归一化和可选的降维。 + 计算数据的均值向量和协方差矩阵的逆。 Args: - data (numpy array): 输入数据集(形状应为 (m, n))。 - - use_pca (bool): 是否使用PCA降维。 - - pca_components (int): 如果使用PCA,则指定要保留的主成分数量。 Returns: - - tuple: 预处理后的数据、scaler对象和(可选的)pca对象。 + - tuple: 均值向量、协方差矩阵的逆。 """ - scaler = StandardScaler() - data_scaled = scaler.fit_transform(data) - mean_vec = np.mean(data_scaled, axis=0) - cov_mat = np.cov(data_scaled, rowvar=False) + mean_vec = np.mean(data, axis=0) + cov_mat = np.cov(data, rowvar=False) inv_cov_mat = inv(cov_mat) - return data_scaled, scaler, mean_vec, inv_cov_mat - + return mean_vec, inv_cov_mat -# 这里写自己的代码实现 def classify_mahalanobis(inX, dataSet, labels, k=4): """ 使用马氏距离的KNN分类算法。 - + Args: - inX (numpy array): 输入待分类的样本(形状应为 (1, n) 或 (n,))。 - dataSet (numpy array): 训练数据集(形状应为 (m, n))。 - labels (numpy array): 训练集对应的标签。 - k (int): 选择最近邻的个数。 - + Returns: - int: 预测的分类标签。 """ # 预处理数据 - dataSet_scaled, scaler, mean_vec, inv_cov_mat = preprocess_data(dataSet) - inX_scaled = scaler.transform(inX.reshape(1, -1)) - - # 计算马氏距离 - distances = [mahalanobis(inX_scaled[0], dataSet_scaled[i], inv_cov_mat) for i in range(dataSet_scaled.shape[0])] - + mean_vec, inv_cov_mat = preprocess_data(dataSet) + + # 将输入样本转换为二维数组格式以匹配dataSet的形状 + inX_reshaped = inX.reshape(1, -1) + + # 计算每个训练样本与输入样本之间的马氏距离 + distances = [mahalanobis(inX_reshaped[0], dataSet[i], inv_cov_mat) for i in range(dataSet.shape[0])] + # 按距离排序,并获取前k个训练样本的索引 k_indices = np.argsort(distances)[:k] - + # 获取前k个训练样本的标签 k_nearest_labels = labels[k_indices] - + # 找出最常见的标签 most_common = np.bincount(k_nearest_labels).argmax() - + return most_common def load_data(file_path):