更新 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
+22 -26
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,56 +37,54 @@ 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分类算法。
Args: Args:
- inX (numpy array): 输入待分类的样本(形状应为 (1, n) 或 (n,))。 - inX (numpy array): 输入待分类的样本(形状应为 (1, n) 或 (n,))。
- dataSet (numpy array): 训练数据集(形状应为 (m, n))。 - dataSet (numpy array): 训练数据集(形状应为 (m, n))。
- labels (numpy array): 训练集对应的标签。 - labels (numpy array): 训练集对应的标签。
- k (int): 选择最近邻的个数。 - k (int): 选择最近邻的个数。
Returns: Returns:
- 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的形状
# 计算马氏距离 inX_reshaped = inX.reshape(1, -1)
distances = [mahalanobis(inX_scaled[0], dataSet_scaled[i], inv_cov_mat) for i in range(dataSet_scaled.shape[0])]
# 计算每个训练样本与输入样本之间的马氏距离
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]
# 获取前k个训练样本的标签 # 获取前k个训练样本的标签
k_nearest_labels = labels[k_indices] k_nearest_labels = labels[k_indices]
# 找出最常见的标签 # 找出最常见的标签
most_common = np.bincount(k_nearest_labels).argmax() most_common = np.bincount(k_nearest_labels).argmax()
return most_common return most_common
def load_data(file_path): def load_data(file_path):