From 7dc5602700a75d286d3dd73814eb8cf2dd4a6db6 Mon Sep 17 00:00:00 2001 From: zhangchenghong <1598349064@qq.com> Date: Tue, 8 Oct 2024 21:13:50 +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 | 49 ++++++++++++------------------------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/function.py b/function.py index 4be52bc..b167d86 100644 --- a/function.py +++ b/function.py @@ -46,24 +46,26 @@ from collections import Counter def classify0(inX, dataSet, labels, k=1): """ KNN 分类算法。 - + Args: - inX (numpy array): 输入待分类的样本。 - dataSet (numpy array): 训练数据集。 - labels (list or numpy array): 训练集对应的标签。 - k (int): KNN 算法参数,默认为3。 - + Returns: - int: 预测的分类标签。 """ - # 计算距离 + # 计算马氏距离 + cov_matrix = np.cov(dataSet, rowvar=False) + inv_cov_matrix = np.linalg.inv(cov_matrix) + mean_vector = np.mean(dataSet, axis=0) + diffMat = inX - dataSet - sqDiffMat = diffMat ** 2 - sqDistances = sqDiffMat.sum(axis=1) - distances = sqDistances ** 0.5 + mahalanobis_distances = np.sqrt(np.sum((diffMat @ inv_cov_matrix) * diffMat, axis=1)) # 排序并选取前k个最小距离 - sortedDistIndices = distances.argsort() + sortedDistIndices = mahalanobis_distances.argsort() classCount = {} for i in range(k): @@ -83,40 +85,13 @@ def load_data(file_path): labels = data[:, -1].astype(int) return features, labels -def normalize_min_max(data): - """ - 对数据进行最小-最大缩放归一化。 - - Args: - - data (numpy array): 待归一化的数据。 - - Returns: - - numpy array: 归一化后的数据。 - """ - min_vals = data.min(0) - max_vals = data.max(0) - ranges = max_vals - min_vals - # 避免除以零的情况 - ranges[ranges == 0.0] = 1.0 - m = data.shape[0] - norm_data = data - np.tile(min_vals, (m, 1)) - norm_data = norm_data / np.tile(ranges, (m, 1)) - return norm_data, min_vals, max_vals - if __name__ == "__main__": # 以下代码可用于测试,可自行随意修改 train_file = "datingTrainSet2.tsv" - # 加载训练数据 train_data, train_labels = load_data(train_file) - # 归一化训练数据,并获取最小值和最大值 - train_data_normalized, min_vals, max_vals = normalize_min_max(train_data) - - # 测试数据点也需要用同样的方式归一化 + # 测试数据点 test_point = np.array([65915, 3.868359, 0.128078]) - test_point_normalized = (test_point - min_vals) / (max_vals - min_vals) - - # 使用归一化后的数据进行预测 - predicted_label = classify0(test_point_normalized, train_data_normalized, train_labels) - print("预测的分类标签是:", predicted_label) \ No newline at end of file + predicted_label = classify0(test_point, train_data, train_labels) + print("预测的分类标签是:", predicted_label)