From f109eafd181c11aba4da21d54c56792f32e031ce Mon Sep 17 00:00:00 2001 From: Xionghaoran <719929980@qq.com> Date: Mon, 14 Oct 2024 17:20:31 +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 | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/function.py b/function.py index 8b99efe..449e448 100644 --- a/function.py +++ b/function.py @@ -41,7 +41,7 @@ name = "熊浩燃" # 这里写自己的代码实现 -def classify0(inX, dataSet, labels, k=0): +def classify0(inX, dataSet, labels, k=3): """ KNN 分类算法。 @@ -54,19 +54,21 @@ def classify0(inX, dataSet, labels, k=0): Returns: - int: 预测的分类标签。 """ -# 计算距离 - distances = np.linalg.norm(dataSet - inX, axis=1) +# 计算协方差矩阵的逆 + cov_matrix = np.cov(dataSet, rowvar=False) + inv_cov_matrix = np.linalg.inv(cov_matrix) - # 获取距离最小的 k 个样本的索引 - k_indices = np.argsort(distances)[:k] + # 计算马氏距离 + diff = dataSet - inX + distances = np.sqrt(np.sum(diff @ inv_cov_matrix * diff, axis=1)) - # 获取这 k 个样本的标签 - k_nearest_labels = [labels[i] for i in k_indices] + # 按距离排序并返回 k 个最近的标签 + sorted_indices = distances.argsort() + nearest_labels = [labels[i] for i in sorted_indices[:k]] - # 进行投票 - most_common = np.bincount(k_nearest_labels).argmax() - - return most_common + # 找出出现次数最多的标签 + label_counts = np.bincount(nearest_labels) + return label_counts.argmax() def load_data(file_path): """ @@ -80,11 +82,6 @@ def load_data(file_path): if __name__ == "__main__": # 以下代码可用于测试,可自行随意修改 - train_file = "datingTrainSet2.tsv" train_data, train_labels = load_data(train_file) - - # 测试分类 - sample = np.array([65915, 3.868359, 0.128078]) - predicted_label = classify0(sample, train_data, train_labels) - print(f"Predicted label: {predicted_label}") \ No newline at end of file + print(classify0(np.array([65915, 3.868359, 0.128078]), train_data, train_labels)) \ No newline at end of file