diff --git a/function.py b/function.py index bd59f45..784c2f5 100644 --- a/function.py +++ b/function.py @@ -1,7 +1,6 @@ import numpy as np import os from sklearn.preprocessing import StandardScaler - """ 实验说明: - 自行编写实现数据加载与 kNN 的手写数字分类算法。 @@ -43,11 +42,15 @@ def classify(input_vector, dataSet, labels, k=2): - int: 预测的分类标签。 """ dataSet_size = dataSet.shape[0] - # 计算欧氏距离 + # 计算马氏距离 + cov_matrix = np.cov(dataSet.T) + inv_cov_matrix = np.linalg.inv(cov_matrix) diff_mat = np.tile(input_vector, (dataSet_size, 1)) - dataSet - sq_diff_mat = diff_mat ** 2 - sq_distances = sq_diff_mat.sum(axis=1) - distances = np.sqrt(sq_distances) + distances = [] + for i in range(dataSet_size): + distance = np.sqrt(np.dot(np.dot(diff_mat[i], inv_cov_matrix), diff_mat[i].T)) + distances.append(distance) + distances = np.array(distances) # 对距离进行排序 sorted_indices = distances.argsort() class_count = {} @@ -58,6 +61,7 @@ def classify(input_vector, dataSet, labels, k=2): return sorted_class_count[0][0] + def img_to_vector(filename): """ 将二值图像转换为向量。 @@ -104,7 +108,6 @@ def load_dataset(directory): if __name__ == "__main__": - # 以下代码可用于测试,可自行随意修改 train_data, train_labels = load_dataset("trainingDigits") test_data = ( @@ -146,5 +149,3 @@ if __name__ == "__main__": train_data, train_labels, ) - - print(f"预测的标签: {predicted_label}") \ No newline at end of file