机器学习方法原理及编程实现--01.K近邻法(实现MNIST数据)
2018-03-28 14:06
411 查看
文章列表
1.机器学习方法原理及编程实现–01.K近邻法(实现MNIST数据).
2.机器学习方法原理及编程实现–01. .
3.机器学习方法原理及编程实现–01. .
4.机器学习方法原理及编程实现–01. .
5.机器学习方法原理及编程实现–01..
6.机器学习方法原理及编程实现–01..
…
KNN
1 距离度量
2 K值的选择
3 分类决策规则
Knn实际上是一种特征空间划分问题,但对不同的测试实例,特征空间是不同的。在特征空间中,对于每个测试实例,距离该点比其他点更近的所有点组成的区域叫做单元(cell),每个训练实例拥有一个单元,所有训练实例点的单元构成对特征空间的一个划分。
其中p≥1,当p=1时,称为曼哈顿距离;当p=2时,称为欧式距离;
式中的I为指示函数,及yi=ci时为1,否则为0。所有多数表决规则的误分类最小等价于经验风险最小化。k一般选取一个较小的值,通常采用交叉验证选择最优的k。此外还需注意的是:对用不同取值范围的特征值是,常常采用数值归一化的方法进行预处理。
KNN优缺点:
优点:便于理解
缺点:
KNN算法效率不高,每次对测试向量进行分类时,需要保存所有训练数据,而且还需要计算测试向量与训练向量之间的间距。
KNN并没有得到任意数据的基础结构信息,无法从中知晓平均实例样本与典型实例样本的特征。
训练数据越多,KNN测试准确率越高,但计算时间也急速增加。
最简单的K近邻法是线性扫描,也就是上面实现的方法,需要计算输入实例与所有训练数据的距离,当训练数据量较大时特别费时。为了提高搜索效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数,如kd树。
相应代码实现如下:
文件路径:https://pan.baidu.com/s/1OUB90duLVdRwyS_ZOF4myQ
1.机器学习方法原理及编程实现–01.K近邻法(实现MNIST数据).
2.机器学习方法原理及编程实现–01. .
3.机器学习方法原理及编程实现–01. .
4.机器学习方法原理及编程实现–01. .
5.机器学习方法原理及编程实现–01..
6.机器学习方法原理及编程实现–01..
…
KNN
1 距离度量
2 K值的选择
3 分类决策规则
1 KNN
K近邻法(k-nearest neighbor,kNN)是一种基本的分类与回归方法。K近邻法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。K近邻法没有显示的学习过程,在对测试数据进行分类时需根据距离度量对所有训练数据计算出k个最邻近的实例,再通过分类决策(如多数表决等)输出类别。3个加粗带下划线的部分为k近邻的3个基本要素。Knn实际上是一种特征空间划分问题,但对不同的测试实例,特征空间是不同的。在特征空间中,对于每个测试实例,距离该点比其他点更近的所有点组成的区域叫做单元(cell),每个训练实例拥有一个单元,所有训练实例点的单元构成对特征空间的一个划分。
1.1 距离度量
特征空间中两个实例点的距离是两个实例点相似程度的反映。K近邻模型的特征空间一般是n维实数向量空间,常用 范数来衡量:其中p≥1,当p=1时,称为曼哈顿距离;当p=2时,称为欧式距离;
1.2 K值的选择
K值较小时,输出结果会对邻近实例点比较敏感,如果实例点恰巧是噪声,输出会出错;k较大时,距离较远的点也会对输出结果产生影响。一般而言,k越大模型越简单,如果k为所有训练实例的个数,那么模型将直接选取训练数据中类别最多的类作为输出。1.3 分类决策规则
多数表决用的比较多,相应的无分类率为:式中的I为指示函数,及yi=ci时为1,否则为0。所有多数表决规则的误分类最小等价于经验风险最小化。k一般选取一个较小的值,通常采用交叉验证选择最优的k。此外还需注意的是:对用不同取值范围的特征值是,常常采用数值归一化的方法进行预处理。
KNN优缺点:
优点:便于理解
缺点:
KNN算法效率不高,每次对测试向量进行分类时,需要保存所有训练数据,而且还需要计算测试向量与训练向量之间的间距。
KNN并没有得到任意数据的基础结构信息,无法从中知晓平均实例样本与典型实例样本的特征。
训练数据越多,KNN测试准确率越高,但计算时间也急速增加。
最简单的K近邻法是线性扫描,也就是上面实现的方法,需要计算输入实例与所有训练数据的距离,当训练数据量较大时特别费时。为了提高搜索效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数,如kd树。
相应代码实现如下:
import sys; import numpy as np sys.path.append("./../Basic/") import LoadData as ld def KNN(inX, dataSet, labels, k, iNormNum): subtractMat = np.ones([dataSet.shape[0], 1])*np.array(inX).reshape([1, inX.shape[1]]) - dataSet distances = ((subtractMat**iNormNum).sum(axis=1))**(1.0/iNormNum) sortedDistIndicies = distances.argsort() classCount={} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 sortedClassCount = sorted(classCount.items(), key=lambda s: s[1], reverse=True) return sortedClassCount[0][0] if __name__ == '__main__': iTrainNum = 60000 iTestNum = 100 iTrainNum = 6000 iTestNum = 100 trainDataSet = ld.getImageDataSet('./../MNISTDat/train-images-idx3-ubyte', iTrainNum, 1, 784) trainLabels = ld.getLabelDataSet('./../MNISTDat/train-labels-idx1-ubyte', iTrainNum) testDataSet = ld.getImageDataSet('./../MNISTDat/t10k-images-idx3-ubyte', iTestNum, 1, 784) testLabels = ld.getLabelDataSet('./../MNISTDat/t10k-labels-idx1-ubyte', iTestNum) iErrorNum = 0 for iTestInd in range(iTestNum): KNNResult = KNN(testDataSet[iTestInd].reshape([1,784]), trainDataSet, trainLabels, 5, 2) if (KNNResult != testLabels[iTestInd]): iErrorNum += 1.0 print("process:%d/%d_totalErrorNum:%d predict_label: %d, real_label: %d" % (iTestInd, iTestNum, iErrorNum, KNNResult, testLabels[iTestInd])) print("\ntotal_error_number: %d" % iErrorNum) print("\nerror_rate: %f" % (iErrorNum/float(iTestNum)))
文件路径:https://pan.baidu.com/s/1OUB90duLVdRwyS_ZOF4myQ
相关文章推荐
- 编程实现可靠数据传输原理Go-Back-N
- 机器学习方法原理及编程实现--03.朴素贝叶斯分类器(实现MNIST数据分类)
- 基于ASP.NET AJAX框架实现表单验证编程原理
- 如何在 Windows Mobile (WinCE 5.0) 中用Vc++编程查找并连接周围的蓝牙(Bluetooth)设备并实现数据通信
- VC++下命名管道编程的原理及实现
- 利用反射原理和IExtenderProvider来实现WebControl与后台类的自动数据交换
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- 分布式编程->XML Webservice实现原理及相关知识
- 仿基因编程原理及其C++实现
- 如何在 Windows Mobile (WinCE 5.0) 中用Vc++编程查找并连接周围的蓝牙(Bluetooth)设备并实现数据通信
- VC++下命名管道编程的原理及实现
- 仿基因编程原理及其C++实现
- 仿基因编程原理及其C++实现
- 应用MapX编程实现地图数据查询
- Wildfish框架实现原理之数据层
- asp.net ajax客户端编程+jquery:实现泛型数据的客户端数据调用、添加、删除
- VC++下命名管道编程的原理及实现
- 分布式编程->XML Webservice实现原理及相关知识
- 编程实现网页表单数据的自动提交
- 仿基因编程原理及其C++实现