作者:mobiledu2502897817 | 来源:互联网 | 2023-09-16 16:48
KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理。
实验报告图片版
pdf版本可以戳这:模式识别实验报告:KNN K近邻算法
关键代码
KNN原理报告里有写,不作重复赘述。
本实验使用的编程环境是Jupyter,完整的程序代码可以戳这下载。
【模式识别】实验二:KNN,python程序代码与实验过程
这里仅贴上核心代码
MNIST数据集的导入
在本专栏之前一篇博文专门分析过,这里只上代码:
mnist = fetch_openml("mnist_784")
X, y = mnist['data'], mnist['target']
特征标准化
特征标准化的好处:1、提高精度。2、提高计算速度
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_splitscaler = StandardScaler()
X_standardized = scaler.fit_transform(X1)
数据筛选
shuffle_index = np.random.permutation(60000)
X1, y1 = X[shuffle_index[:10000]], y[shuffle_index[:10000]]
对KNN来说,数据筛选是很有必要的。MNIST总共7w条数据,全部都跑会跑到天荒地老~
因此本实验随机筛选了10000条数据。
KNN实现方式一:调用sklearn的KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import learning_curve
from sklearn import metricsdef knn(k):knn = KNeighborsClassifier(n_neighbors=k, n_jobs=-1)model = knn.fit(X_train, y_train)predictions = model.predict(X_test)accuracy = metrics.accuracy_score(y_test, predictions)
return 100*accuracy
KNN实现方式二:手动实现
def knn(k):accuracy = 0m = X_train.shape[0] n = X_test.shape[0]for i in range(n):count = np.zeros(10)prediction = 0distance = np.zeros((m,2))for t in range(m):distance[t,0] = y_train[t] distance[t,1] = np.sqrt(sum(np.power(X_train[t] - X_test[i], 2))) order = distance[np.lexsort(distance.T)] for j in range(k):a = order[j,0]a = a.astype(int)count[a] += 1 prediction = count.argmax() if prediction == y_test[i]:accuracy += 1Accuracy = accuracy/nreturn 100*Accuracy
简要描述下算法思路:
1、逐次遍历测试集,对每个样本计算其和训练集的欧式距离。
2、将每个训练样本到该样本欧式距离排序,选取前K个训练样本。
3、统计这K个样本的标签,测试样本的标签即为这K个样本的最多的标签。
LDA降维
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
def mylda(X, y, demension):lda = LDA(n_components=demension)lda.fit(X, y)result_x = lda.transform(X)return result_x
总结
KNN需要计算每一个样本到训练样本的距离,因此训练样本越多,程序运行越慢;
优势在于程序无需经过训练,可以直接将样本进行判别分类。