From a86348a74121bf9ec727e533629c07f57dfc9364 Mon Sep 17 00:00:00 2001 From: 202210423203 <2579478480@qq.com> Date: Tue, 15 Oct 2024 20:00:05 +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 | 50 ++++++++++---------------------------------------- 1 file changed, 10 insertions(+), 40 deletions(-) diff --git a/function.py b/function.py index b734d88..86fe43e 100644 --- a/function.py +++ b/function.py @@ -41,31 +41,20 @@ name = "赵昊龙" # 这里写自己的代码实现 -def euclidean_distance(inX, dataSet): - # 将inX转换为numpy数组 +import numpy as np + +def mahalanobis_distance(inX, dataSet, cov_mat): + inX = np.array(inX).reshape(1, -1) - # 计算inX和dataSet中每一行的差的平方和 - sq_diff = (inX - dataSet) ** 2 - # 计算每行的和,然后开方得到欧氏距离 - sq_distances = sq_diff.sum(axis=1) - distances = np.sqrt(sq_distances) + diff = inX - dataSet + distances = np.sqrt(diff @ cov_mat @ diff.T) return distances def classify0(inX, dataSet, labels, k=5): - """ - KNN 分类算法。 - - 参数: - inX (numpy array): 待分类的样本。 - dataSet (numpy array): 训练数据集。 - labels (list or numpy array): 训练集对应的标签。 - k (int): kNN 算法参数,默认值为5。 - - 返回: - int: 预测的分类标签。 - """ - # 计算待分类样本与数据集中每个样本的距离 - distances = euclidean_distance(inX, dataSet) + # 计算训练数据集的协方差矩阵 + cov_mat = np.cov(dataSet.T) + # 计算待分类样本与数据集中每个样本的马氏距离 + distances = mahalanobis_distance(inX, dataSet, cov_mat) # 获取距离最小的k个样本的索引 sortedDistIndices = distances.argsort() # 为分类计数器初始化 @@ -80,16 +69,6 @@ def classify0(inX, dataSet, labels, k=5): return sortedClassCount[0][0] def load_data(file_path): - """ - 加载 TSV 格式数据文件。 - - 参数: - file_path (str): 数据文件的路径。 - - 返回: - features (numpy.ndarray): 数据特征。 - labels (numpy.ndarray): 数据标签。 - """ data = np.loadtxt(file_path, delimiter="\t") features = data[:, :-1] labels = data[:, -1].astype(int) @@ -100,12 +79,3 @@ if __name__ == "__main__": train_file = "datingTrainSet2.tsv" train_data, train_labels = load_data(train_file) print(classify0([65915, 3.868359, 0.128078], train_data, train_labels)) - -if __name__ == "__main__": - # 以下代码可用于测试,可自行随意修改 - - train_file = "datingTrainSet2.tsv" - - train_data, train_labels = load_data(train_file) - - print(classify0([65915, 3.868359, 0.128078], train_data, train_labels))