From af4d2042e1bf86515a47b109e967cab7355b297a Mon Sep 17 00:00:00 2001 From: Dengddd <3149942468@qq.com> Date: Tue, 8 Oct 2024 21:42:36 +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 | 119 +++++++++++++++++----------------------------------- 1 file changed, 38 insertions(+), 81 deletions(-) diff --git a/function.py b/function.py index d475eb2..fe0cfc3 100644 --- a/function.py +++ b/function.py @@ -38,84 +38,41 @@ name = "邓龙树" - int: 预测的分类标签。 """ -import numpy as np - -def mahalanobis_distance(point1, point2, cov_inv): - """计算两个点之间的马氏距离。 - - Args: - - point1 (numpy array): 第一个点。 - - point2 (numpy array): 第二个点。 - - cov_inv (numpy array): 协方差矩阵的逆。 - - Returns: - - float: 马氏距离。 - """ - diff = np.array(point1) - np.array(point2) - return np.sqrt(np.dot(np.dot(diff, cov_inv), diff.T)) - -def compute_mahalanobis_distances(dataSet, inX, cov_inv): - """计算数据集中每个点与输入点inX的马氏距离。 - - Args: - - dataSet (numpy array): 训练数据集。 - - inX (numpy array): 输入待分类的样本。 - - cov_inv (numpy array): 协方差矩阵的逆。 - - Returns: - - numpy array: 马氏距离数组。 - """ - inX_array = np.array(inX) - distances = [mahalanobis_distance(dataSet[i], inX_array, cov_inv) for i in range(len(dataSet))] - return np.array(distances) - -def classify0(inX, dataSet, labels, k=3, cov_inv=None): - """KNN 分类算法,使用马氏距离。 - - Args: - - inX (list or numpy array): 输入待分类的样本。 - - dataSet (numpy array): 训练数据集。 - - labels (numpy array): 训练集对应的标签。 - - k (int): KNN 算法参数,表示选择最近的k个邻居,默认值为3。 - - cov_inv (numpy array): 协方差矩阵的逆,如果为None则使用欧氏距离。 - - Returns: - - int: 预测的分类标签。 - """ - if cov_inv is not None: - distances = compute_mahalanobis_distances(dataSet, inX, cov_inv) - else: - distances = compute_distances(dataSet, inX) # 使用原有的欧氏距离计算函数 - - sorted_indices = np.argsort(distances) - k_nearest_indices = sorted_indices[:k] - k_nearest_labels = labels[k_nearest_indices] - unique_labels, counts = np.unique(k_nearest_labels, return_counts=True) - most_common_label = unique_labels[np.argmax(counts)] - return int(most_common_label) - -# ... (load_data 和 test_knn 函数保持不变) - -if __name__ == "__main__": - train_file_path = "path/to/datingTrainSet2.tsv" # 替换为您的训练文件路径 - test_file_path = "path/to/datingTestSet2.tsv" # 替换为您的测试文件路径 - - # 加载数据 - train_data, train_labels = load_data(train_file_path) - if train_data is None or train_labels is None: - print("Failed to load training data.") - exit() - - # 计算协方差矩阵及其逆 - cov_matrix = np.cov(train_data.T) - cov_inv = np.linalg.inv(cov_matrix) - - # 测试KNN算法,使用马氏距离,默认k=3 - accuracy = test_knn(train_file_path, test_file_path, k=3, cov_inv=cov_inv) - - # 注意:由于test_knn函数中没有直接传递cov_inv,我们需要修改它以便能够传递这个参数。 - # 下面的修改是假设在test_knn函数中添加了一个cov_inv参数,并在调用classify0时传递了它。 - # (实际代码中需要对test_knn函数进行相应修改,这里只是说明思路) - # ... - # 修改后的test_knn函数调用示例(需要在函数定义中添加cov_inv参数): - # accuracy = test_knn(train_file_path, test_file_path, k=3, cov_inv=cov_inv) \ No newline at end of file +import numpy as np + +def mahalanobis_distance(point1, point2, inv_covmat): + """计算两个点之间的马氏距离。""" + diff = np.array(point1) - np.array(point2) + return np.sqrt(np.dot(np.dot(diff, inv_covmat), diff.T)) + +def compute_mahalanobis_distances(dataSet, inX, inv_covmat): + """计算数据集中每个点与输入点inX的马氏距离。""" + distances = np.array([mahalanobis_distance(inX, dataSet[i], inv_covmat) for i in range(dataSet.shape[0])]) + return distances + +def classify0(inX, dataSet, labels, k=3): + """KNN 分类算法,使用马氏距离。""" + # 计算协方差矩阵的逆矩阵 + covMat = np.cov(dataSet.T) + inv_covMat = np.linalg.inv(covMat) + + distances = compute_mahalanobis_distances(dataSet, inX, inv_covMat) + sorted_indices = np.argsort(distances) + k_nearest_indices = sorted_indices[:k] + k_nearest_labels = labels[k_nearest_indices] + unique_labels, counts = np.unique(k_nearest_labels, return_counts=True) + most_common_label = unique_labels[np.argmax(counts)] + return int(most_common_label) + +# 其余函数不变,包括加载数据的 load_data 和测试 KNN 算法的 test_knn + +if __name__ == "__main__": + train_file_path = "path/to/datingTrainSet2.tsv" # 替换为您的训练文件路径 + test_file_path = "path/to/datingTestSet2.tsv" # 替换为您的测试文件路径 + + # 测试KNN算法,默认k=3 + test_knn(train_file_path, test_file_path) + + # 您可以尝试不同的k值来查看对准确率的影响 + # test_knn(train_file_path, test_file_path, k=5) + # test_knn(train_file_path, test_file_path, k=1)