热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【模式识别】实验二:K近邻算法(KNN)

KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理。实验报告图片版pdf版本可

KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理。



实验报告图片版

pdf版本可以戳这:模式识别实验报告:KNN K近邻算法
请添加图片描述


关键代码

KNN原理报告里有写,不作重复赘述。
本实验使用的编程环境是Jupyter,完整的程序代码可以戳这下载。
【模式识别】实验二:KNN,python程序代码与实验过程
这里仅贴上核心代码


MNIST数据集的导入

在本专栏之前一篇博文专门分析过,这里只上代码:

mnist = fetch_openml("mnist_784")
X, y = mnist['data'], mnist['target'] # X:data,y:label

特征标准化

特征标准化的好处: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):# 测试用,记录算法的时间# begin_t = t.time()#创建一个有5个邻居的KNN分类器对象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)
# print ("k=",k)
# print ('accuracy:%.2f%%'%(100*accuracy))return 100*accuracy# print("Total time: {:.2f}s".format(t.time()-begin_t))

KNN实现方式二:手动实现

def knn(k):accuracy = 0m = X_train.shape[0] # m 标记预测值数量8000 ; n 标记测试集数量 2000n = 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降维

# 使用Fisher进行降维
# 注&#xff1a;LDA最大降维数<分类数-1
# minsit为10分类&#xff0c;因此维度数可以取1-8
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
def mylda(X, y, demension):lda &#61; LDA(n_components&#61;demension)lda.fit(X, y)result_x &#61; lda.transform(X)return result_x

总结

KNN需要计算每一个样本到训练样本的距离&#xff0c;因此训练样本越多&#xff0c;程序运行越慢&#xff1b;
优势在于程序无需经过训练&#xff0c;可以直接将样本进行判别分类。


推荐阅读
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文介绍了如何使用 Python 的 Bokeh 库在图表上绘制菱形标记。Bokeh 是一个强大的交互式数据可视化工具,支持丰富的图形自定义选项。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文介绍如何使用 Python 编写程序,检查给定列表中的元素是否形成交替峰值模式。我们将探讨两种不同的方法来实现这一目标,并提供详细的代码示例。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文详细介绍了MySQL中的存储过程,包括其定义、优势与劣势,并提供了创建、调用及删除存储过程的具体示例,旨在帮助开发者更好地利用这一数据库特性。 ... [详细]
author-avatar
mobiledu2502897817
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有