KNN算法学习总结
来源:互联网 发布:淘宝网汽车用品配件 编辑:程序博客网 时间:2024/06/06 03:00
前言
读完了集体智慧编程,初步了解了knn算法,可惜时间可能有点久远,当初没有进行总结吗,如今的印象也比较浅,所以写下这一片博客,用以总结和加深印象。ps:感觉自己还是不大会写博客,尽量按照自己能看懂的方式来记录吧。
正文
1. 理论
knn算法又被称为k近邻分类算法,主要内容是从训练集中寻找和需要测试的数据记录最相近的k条记录,然后根据他们来为测试集的数据确定的分类。
算法涉及3个主要因素。训练集,距离和相似度的衡量,k的大小。
2. 计算步骤
- 算距离 计算测试集数据和训练集所有数据的距离
- 圈定k个数据作为近邻
- 根据近邻的种类或者数值来确定测试数据的种类或者数值
距离和相似度的衡量、类别判定
距离衡量的方法包括欧氏距离,余弦夹角等
衡量相似度时可以根据距离远近赋予训练集数据一个合适的权重。
根据权重和分类计算出最有可能属于的分类。
或者纯粹根据量的多少来判定分类。(感觉根据量的多少来判断差错会比较大,收到数据集的影响可能会比较严重)。
以下为复制 来源:KNN算法理解
1、k值设定为多大?
k太小,分类结果易受噪声点影响;k太大,近邻中又可能包含太多的其>它类别的点。(对距离加权,可以降低k值设定的影响)
k值通常是采用交叉检验来确定(以k=1为基准)
经验规则:k一般低于训练样本数的平方根
2、类别如何判定最合适?
投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最>终的分类,所以加权投票法更恰当一些。
3、如何选择合适的距离衡量?
高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。
变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导>作用,因此应先对变量进行标准化。
4、训练样本是否要一视同仁?
在训练集中,有些样本可能是更值得依赖的。
可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。
5、性能问题?
kNN是一种懒惰算法,平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)。
懒惰的后果:构造模型很简单,但在对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。
已经有一些方法提高计算的效率,例如压缩训练样本量等。
6、能否大幅减少训练样本量,同时又保持分类精度?
浓缩技术(condensing)
编辑技术(editing)
然后去试一下Digit Recognition,码完了回来补代码
血与泪的教训,安装python 一定要安装64位的,32位做运算害人不浅。。。。
早上代码跑起来,回去估计就收集到相关的数据了,下午点名完之后进行总结和整理。 收到的教训:
1. 好好写gc模块
2. 64位的python
3. 对于数据库的运用是自己以后应当加强的
就这样吧,或许还有攒钱买内存条和固态了。
import csvfrom numpy import mat,shape,zeros,tile,argsort,arrayimport numpyimport operatorimport gcdef loadTrainData(): l=[] with open('train.csv') as file: lines=csv.reader(file) for line in lines: l.append(line) l.remove(l[0]) l=array(l) label=l[:,0] data=l[:,1:] del l gc.collect() return nomelizing(toInt(data)),toInt(label)def toInt(array): array=mat(array) m,n=shape(array) newArray=zeros((m,n)) for i in xrange(m): for j in xrange(n): newArray[i,j]=int(array[i,j]) return newArraydef nomelizing(array): m,n=shape(array) for i in xrange(m): for j in xrange(n): if array[i,j]!=0: array[i,j]=1 return arraydef loadTestData(): l=[] with open('test.csv') as file: lines=csv.reader(file) for line in lines: l.append(line) l.remove(l[0]) data=array(l) del l gc.collect() return nomelizing(toInt(data))def classify(inX,dataSet,lables,k): inX=mat(inX) dataSet=mat(dataSet) lables=mat(lables) dataSetSize=dataSet.shape[0] diffMat=tile(inX,(dataSetSize,1))-dataSet del inX del dataSet gc.collect() sqDiffMat=array(diffMat)**2 sqDistance=sqDiffMat.sum(axis=1) del sqDiffMat gc.collect() distances=sqDistance**0.5 del sqDistance print 9 sortedDistIndicies=distances.argsort() classCount={} for i in range(k): voteIlable=lables[0,sortedDistIndicies[i]] classCount[voteIlable]=classCount.get(voteIlable,0)+1 sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0]def saveResult(result): with open('result.csv','wb') as myFile: myWriter=csv.writer(myFile) for i in result: tmp=[] tmp.append(i) myWriter.writerow(tmp)def handwritingClassTest(): trainData,trainLabel=loadTrainData() print 's1' testData=loadTestData() print's2' m,n=shape(testData) print 's3' resultList=[] print 's4' for i in range(m): classifierResult = classify(testData[i], trainData, trainLabel, 5) resultList.append(classifierResult) print classifierResult del classifierResult gc.collect() print resultList saveResult(resultList)
开始自己用的32位python,老是超内存,所以gc模块乱写的,来源:
大数据竞赛平台——Kaggle 入门
完结
最后再补充一些吧,刚上完计算机网络脑子不是很好用没法接着写代码了:
可以稍微进行优化,依据距离远近来给不同的项一个权重值,权重函数有很多,算是一个优化方向吧。
如果还有其它可以优化的再做补充。
- KNN算法学习总结
- 学习KNN算法体会和总结
- KNN算法总结
- KNN算法总结
- KNN算法 总结
- KNN算法总结
- KNN算法的总结
- KNN近邻算法总结
- 《机器学习》 KNN算法
- 机器学习:KNN算法
- [统计学习]KNN算法
- 机器学习-KNN 算法
- 【机器学习】kNN算法
- 机器学习 -- kNN算法
- 机器学习---kNN算法
- knn算法学习笔记
- 机器学习--kNN算法
- KNN 算法学习小结
- angualar创建自定义指令处理数据变化
- jQuery基础
- centos安装maven
- Python 7) 正则表达式(re包)
- LightOJ-1019-Brush (V)
- KNN算法学习总结
- Android笔记
- 学习笔记14
- Spring认知
- js框架封装(一)——框架介绍
- 玩具工厂-LintCode
- Toolbar+DrawerLayout+Fragment结合使用
- Android动态权限管理及封装
- codeforces 835B The number on the board