diff --git a/function.py b/function.py index 06141c5..0081b20 100644 --- a/function.py +++ b/function.py @@ -41,7 +41,7 @@ name = "程悦" # 这里写自己的代码实现 -def classify0(inX, dataSet, labels, k=3): +def classify0(inX, dataSet, labels, k=9): """ KNN 分类算法。 @@ -54,20 +54,22 @@ def classify0(inX, dataSet, labels, k=3): Returns: - int: 预测的分类标签。 """ - + # 计算协方差矩阵并求逆矩阵 + cov_matrix = np.cov(dataSet, rowvar=False) + inv_cov_matrix = np.linalg.inv(cov_matrix) - # 计算输入样本与训练集中每个样本的欧几里得距离 - distances = distance.cdist(dataSet, [inX], metric='euclidean').flatten() + # 计算输入样本与训练集样本的马氏距离 + distances = [distance.mahalanobis(inX, data_point, inv_cov_matrix) for data_point in dataSet] - # 按距离排序并选择前k个最小的距离 + # 按距离排序并选择前 k 个最近的邻居 k_indices = np.argsort(distances)[:k] k_nearest_labels = [labels[i] for i in k_indices] - # 计算多数标签 + # 统计最近邻居中最多的标签 label_counts = Counter(k_nearest_labels) most_common_label = label_counts.most_common(1)[0][0] - return most_common_label + return most_common_label def load_data(file_path): @@ -88,10 +90,10 @@ if __name__ == "__main__": train_data, train_labels = load_data(train_file) test_data, test_labels = load_data(test_file) - # 特征缩放 - scaler = StandardScaler() - train_data = scaler.fit_transform(train_data) - test_data = scaler.transform(test_data) + # # 特征缩放 + # scaler = StandardScaler() + # train_data = scaler.fit_transform(train_data) + # test_data = scaler.transform(test_data) # 测试 classify0 函数 test_sample = test_data[0] # 使用测试集中的第一个样本进行测试