k-近邻算法 python实现(学习笔记no.1)
来源:互联网 发布:小满软件怎么样 编辑:程序博客网 时间:2024/05/01 22:49
参考书目《机器学习实战》
花了两个晚上把k-近邻算法学习了一下,书讲的很不错,但是python代码读起来有点麻烦,主要是很多用法习惯和我的基本不一样。基本上都是按照原理揣摩着作者的源码重写的,现在将部分代码重写如下。
k-近邻算法原理其实很简单,说白了就是“物以类聚,人以群分”。想看你是个什么人,就看和你关系很好的人是什么人。举个例子,假如和你关系最好的五个人有四个都是大学霸,那你是学霸的可能性就很高了。
k-近邻算法就和例子一样,首先通过某种方法(欧拉距离等),计算出未知样本和已知样本集中各个样本的距离,然后选取距离最近的几个样本,这几个样本中出现频率最高的类别就认为是未知样本的类别了。
用科学的语言描述就是:
这里计算使用的是欧拉距离
计算两个样本点xA,xB间的距离
考虑到样本比重的问题,一般会对样本做归一化处理
好了,终于可以上代码了
读入读出,分类,归一化,功能函数
import numpy as npfrom array import arrayimport operatordef classify0 (ninX, ndataSet, labels, k): ''' define:用于分类 inX:用于分类的输入向量,应为numpy数组 dataSet:输入的训练样本集,应为numpy数组 labels:标签向量 k:用于选择最近邻居的数目 return: 分类 ''' #计算分类向量和样本集各点的欧拉距离,利用了广播 ndistance = np.sqrt(np.sum(np.square(ninX.reshape(1,-1) - ndataSet),1)) #确定前K个最小元素所在的主要分类 sortDisIndicies = np.argsort(ndistance) dic = {} for i in range(0,k,1): votelabel = labels[sortDisIndicies[i]] #dic.get(D,K),如果字典dic含有D,则返回当前D的个数,否则返回K dic[votelabel] = dic.get(votelabel,0)+1 sortedDic = sorted(dic.items(),key = operator.itemgetter(1),reverse = True) return sortedDic[0][0]def file2matrix(filename): ''' define:用于读入数据 filename:文件名称 return:读入文件的数据 ''' a=array('d') b=array('d') #with语句来自动帮我们调用close()方法 with open(filename, 'r', encoding = 'ANSI') as f: #以只读的方式打开文件 for line in f.readlines(): #依次读取每行 line = line.strip() #去掉每行头尾空白 line = line.split() if not len(line): #判断是否是空行 continue #是的话,跳过不处理 for word in line[0:3]: a.append(float(word)) #将分类存入数组 b.append(int(line[3])) #将数据转换为numpy的数组 na = np.frombuffer(a,dtype = float) na = np.reshape(na,(-1,3)) nb = np.frombuffer(b,dtype = float) return na,nbdef autoNorm(dataSet): ''' define:对数据做归一化处理 dataSet:需要做归一化的数据集 return:归一化的数据集 ''' minVals = np.min(dataSet,0) maxVals = np.max(dataSet,0) #求取最大最小值间的距离 ranges = maxVals - minVals #利用广播进行计算 newDataSet = (dataSet-minVals)/ranges return newDataSet,ranges,minVals
测试函数
import numpy as npfrom first.kNN import file2matrix, autoNorm, classify0def datingClassTest(): ''' define:读入文件并检测 ''' #获取数据文件 datingDataMat,datinglabels = file2matrix('C:/Users/Desktop/datingTestSet2.txt') #对数据归一化处理 normMat,ranges,minvals = autoNorm(datingDataMat) #用来检测的数据,取0.1 numTestVecs = int(0.1*normMat.shape[0]) errorCount = 0.0 for i in range(0,numTestVecs): #训练并检测结果 classifierResult = classify0(normMat[i,:], normMat[numTestVecs:,:],\ datinglabels[numTestVecs:], 3) #print("the classifier came back with: %d, the real answer is: %d" \ # % (classifierResult, datinglabels[i])) #检测错误率 if(classifierResult != datinglabels[i]): errorCount += 1.0 print("the total error rate is:%f" % (errorCount/float(numTestVecs)))datingClassTest()
基本就是这样了。明天继续第二章决策树
阅读全文
0 0
- k-近邻算法 python实现(学习笔记no.1)
- python机器学习实战1:实现k-近邻算法
- 机器学习笔记1-k近邻算法的实现
- 机器学习算法的python实现(1)---k近邻算法(kNN)
- k-近邻算法(Python实现)
- K-近邻算法(kNN)python实现
- K-近邻算法python实现
- Python实现k-近邻算法
- k-近邻算法-python实现
- 机器学习笔记(1)K-近邻算法
- 用Python实现机器学习算法---k近邻算法
- 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
- 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
- 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
- k-近邻算法(k-NN)及其Python实现
- 【python实战】k-近邻算法(1)
- 机器学习实战笔记(Python)-01-K近邻算法(KNN)
- 《机器学习实战》学习笔记:k-近邻算法实现
- 2、ES6 === destructuring 解构
- Django开发环境搭建
- POJ 1292 Will Indiana Jones Get There? 笔记
- xml 解析
- 中国最强的人工智能学术会议来了
- k-近邻算法 python实现(学习笔记no.1)
- 数组数据类型定义
- PHP反射机制
- 欢迎使用CSDN-markdown编辑器
- 制作开机LOGO就是这么简单!
- php设计模式总结-工厂模式
- APP调起微信支付,JAVA服务端统一下单
- Leetcode——92. Reverse Linked List II && 25. Reverse Nodes in k-Group
- kotlin代码教程