更新 function.py
Gitea Actions Challenge Test / Challenge-Actions (push) Successful in 12s

This commit is contained in:
2024-10-11 11:48:02 +08:00
parent b11350ea23
commit 2f548c9aeb
+15 -19
View File
@@ -1,8 +1,6 @@
# function.py # function.py
import numpy as np import numpy as np
import sklearn from scipy.linalg import inv
from sklearn.preprocessing import StandardScaler
from numpy.linalg import inv, LinAlgError
from scipy.spatial.distance import mahalanobis from scipy.spatial.distance import mahalanobis
""" """
挑战说明: 挑战说明:
@@ -39,27 +37,23 @@ name = "吴俊煯"
- int: 预测的分类标签。 - int: 预测的分类标签。
""" """
def preprocess_data(data, use_pca=False, pca_components=None):
def preprocess_data(data):
""" """
对数据进行预处理,包括归一化和可选的降维。 计算数据的均值向量和协方差矩阵的逆。
Args: Args:
- data (numpy array): 输入数据集(形状应为 (m, n))。 - data (numpy array): 输入数据集(形状应为 (m, n))。
- use_pca (bool): 是否使用PCA降维。
- pca_components (int): 如果使用PCA,则指定要保留的主成分数量。
Returns: Returns:
- tuple: 预处理后的数据、scaler对象和(可选的)pca对象。 - tuple: 均值向量、协方差矩阵的逆。
""" """
scaler = StandardScaler() mean_vec = np.mean(data, axis=0)
data_scaled = scaler.fit_transform(data) cov_mat = np.cov(data, rowvar=False)
mean_vec = np.mean(data_scaled, axis=0)
cov_mat = np.cov(data_scaled, rowvar=False)
inv_cov_mat = inv(cov_mat) 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): def classify_mahalanobis(inX, dataSet, labels, k=4):
""" """
使用马氏距离的KNN分类算法。 使用马氏距离的KNN分类算法。
@@ -74,11 +68,13 @@ def classify_mahalanobis(inX, dataSet, labels, k=4):
- int: 预测的分类标签。 - int: 预测的分类标签。
""" """
# 预处理数据 # 预处理数据
dataSet_scaled, scaler, mean_vec, inv_cov_mat = preprocess_data(dataSet) mean_vec, inv_cov_mat = preprocess_data(dataSet)
inX_scaled = scaler.transform(inX.reshape(1, -1))
# 计算马氏距离 # 将输入样本转换为二维数组格式以匹配dataSet的形状
distances = [mahalanobis(inX_scaled[0], dataSet_scaled[i], inv_cov_mat) for i in range(dataSet_scaled.shape[0])] 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个训练样本的索引
k_indices = np.argsort(distances)[:k] k_indices = np.argsort(distances)[:k]