knn函数python python中knn函数

如何以Python代码实例展示kNN算法的实际运用给样本数据集T={2,4,10,12,3,20,22,21,11,24} t={18},K=4 1. N={2,4,10,12},d1=16,d2=14,d3=8,d4=6 2.d={3},比较,N={4,10,12,3},d1=14,d2=8,d3=6,d4=15 3.d={20},比较,N={4,10,12,20},d1=14,d2=8,d3=6,d4=2 4.d={22},比较,N={10,12,20,22},
新手学习PYTHON中KNN算法的手写识别出现问题 求助参考了其他博主的代码 想试着运行 然后去理解 。结果一直报错,希望大神帮帮忙 。
import numpy as np
import os
import kNN
def img2vector(filename):
"""函数将以文本格式出现的32*32的0-1图片,转变成一维特征数组 , 返回一维数组
Keyword argument:
filename -- 文本格式的图片文件
"""
imgvect = np.zeros((1, 1024))
fr = open(filename)
for i in range(32):
linestr = fr.readline()
for j in range(32):
imgvect[0, 32*ij] = int(linestr[j])
return imgvect
def handwriteClassfiy(testfile, trainfile, k):
"""函数将trainfile中的文本图片转换成样本特征集和样本类型集,用testfile中的测试样本测试 , 无返回值
Keyword argument:
testfile -- 测试图片目录
trainfile -- 样本图片目录
"""
trainFileList = os.listdir(trainfile)
trainFileSize = len(trainFileList)
labels = []
trainDataSet = np.zeros((trainFileSize, 1024))
for i in range(trainFileSize):
filenameStr = trainFileList[i]
digitnameStr = filenameStr.split('.')[0]
digitLabels = digitnameStr.split('_')[0]
labels.append(digitLabels)
trainDataSet[i, :] = img2vector(trainfile'/'filenameStr)
testFileList = os.listdir(testfile)
testNumber = len(testFileList)
errorcount = 0.0
for testname in testFileList:
testdigit = img2vector(testfile'/'testname)
classifyresult = kNN.classfiy(testdigit, trainDataSet, labels, k)
testStr = testname.split('.')[0]
testDigitLabel = testStr.split('_')[0]
if classifyresult != testDigitLabel:
errorcount= 1.0
#print('this test real digit is:%s, and the result is: %s' % (testDigitLabel, classifyresult))
print('k = %d, errorRatio is: %f' % (k, errorcount/float(testNumber)))
return
if __name__ == '__main__':
filename = 'C:/Users/lx/Desktop/MachineLearning-master/kNN/use Python and NumPy/testDigits/0_1.txt'
traindir= 'C:/Users/lx/Desktop/MachineLearning-master/kNN/use Python and NumPy/trainingDigits'
testdir = 'C:/Users/lx/Desktop/MachineLearning-master/kNN/use Python and NumPy/testDigits'
handwriteClassfiy(testdir, traindir, 3)
错误提示Traceback (most recent call last):
File "kNN.py", line 56, in module
handwriteClassfiy(testdir, traindir, 3)
File "kNN.py", line 43, in handwriteClassfiy
classifyresult = kNN.classfiy(testdigit, trainDataSet, labels, k)
AttributeError: module 'kNN' has no attribute 'classfiy'
你这个文件是不是就叫 kNN.py ?如果是的话那你这个里面根本就没有 classfiy 这个属性,当然会报错 。
另外,import kNN 是 import 自己?
python 提示res is not defined应该是哪里格式不对,它提示的不一定是错误所在地方 。
注释函数knn,运行函数distance查错
没有问题就接着运行下面的,逐一调试
如何用python实现knn算法1. 数据分类:离散型标签 2. 数据回归:连续型标签 近邻算法的准则是:寻找接近新数据点的训练样本的数目,根据训练样本的信息来预测新数据点的某些信息 。
python之k-近邻算法(sklearn版) 上文借用了numpy和pandas等模块自编了k-近邻算法 python之k-近邻算法(非sklearn版) knn函数python , 这次借用sklearn轮子来实现一下
数据还是用上篇文章的数据来
上篇文章knn函数python我们是利用KNN.py中的自编函数panduan在读取数据的过程中来实现的 , 而这种转变在sklearn中已经有轮子调用了
这里再补充一点:对于类别数据(对于特征值也是适用的),可以分为 标称特征(nominal feature) 和 有序特征(ordinal feature) .
对于我们这里的数据largeDoses , smallDoses,didntLike应该是对应着有序特征
如果在这里'喜欢的类别'本身不带有有序的含义的话,即largeDoses,smallDoses,didntLike三个类别没有序别之分,可以借用sklearn里的功能
可以看到借用sklearn是比较方便的
但是 。。。。。但是 。。。。以上的0,1,2在算法看来依然是有顺序的,所以我们可以利用 独热编码(one-hot encoding) ,即创建一个新的虚拟特征(dummy feature)
也可以利用pandas里的功能
————————————————————————————————————
特征缩放(feature scaling)对于除了决策树和随机森林两个算法没用以外,对其knn函数python他算法和优化算法来讲都是必不可少的
即上篇文章所涉及到的
对于线性模型来讲,标准化更加好,一是符合线性模型对权重的处理,二是保留了异常值的信息
———————————————————————————————————
上篇文章对于此类问题的处理见 datingClassTest 函数
K-近邻算法被称之为 惰性算法 ,和其他机器学习算法不一样 , 因为他仅仅是对训练数据集有记忆功能,而不是从训练集中通过学习得到一个判别函数,即不需要训练 , 看过上篇文章的小伙伴应该会有体会 。缺点是计算复杂度会随着样本数量的增长而呈线性增长,除非数据集中特征数量有限
PyOD主要算法(KNN、IForest 和 MCD)的原理及使用 Python Outlier Detection(PyOD)是当下最流行的Python异常检测工具库(toolkit) 。该工具库的主要亮点包括:
对于特征空间中的一个样本,如果与之最相似的(即特征空间中距离最近的)k个样本中的大多数都属于某一类别,则该样本的分类结果也是这个类别 。
① 什么叫做KD_tree
K:K邻近查询中的k;D:空间是D维空间(Demension)tree:二叉树
② 建树过程
K-D tree的建立就是分裂空间的过程
首先 , 我们对整个区间 [1 , 15] 建树:先计算区间中所有点在第一维(也就是 x 坐标)上的方差:
平均值 : ave_1 =5.4
方差 : varance_1 =9.04
再计算区间中所有点在第二维(也就是 y 坐标)上的方差:
平均值:ave_2 =6.8
方差:varance_2 =10.96
明显看见,varance_2varance_1,那么我们在本次建树中 , 分裂方式 :split_method =2,再将所有的点按照第2维的大小 从小到大排序 , 得到了新的点的一个排列:
(4,2) (1,4)(5,8)(7,9) (10,11)
取中间的点作为分裂点 sorted_mid =(5,8)作为根节点,再把区间 [1 , 2] 建成左子树 , [4 , 5] 建成右子树,此时,直线 : y = 8 将平面分裂成了两半,前面一半给左儿子,后面一半给了右儿子,如图:
建左子树 [1, 3] 的时候可以发现,这时候 第一维的方差大,分裂方式就是1,把区间 [ 1, 2 ] 中的点按照 第一维 的大小 , 从小到大排序,取 中间点(1,4)根节点 , 再以区间 [ 2, 2] 建立右子树 得到节点 (4,2)
建右子树 [4 , 5] 的时候可以发现,这时还是第一维的方差大,于是,我们便得到了这样的一颗二叉树 也就是 K-D tree,它把平面分成了如下的小平面,使得每个小平面中最多有一个点 :
③ 查询过程:
查询 , 其实相当于我们要将一个点“添加”到已经建好的 K-D tree 中,但并不是真的添加进去,只是找到他应该 处于的子空间 即可,所以查询就显得简单的 。
每次在一个区间中查询的时候 , 先看这个区间的 分裂方式 是什么,也就是说,先看这个区间是按照哪一维来分裂的,这样如果这个点对应的那一维上面的值比根节点的?。驮诟诘愕淖笞邮魃辖胁檠僮鳎?如果是大的话,就在右子树上进查询操作 。
每次回溯到了根节点(也就是说,对他的一个子树的查找已经完成了)的时候,判断一下 , 以该点为圆心,目前 找到的最小距离为半径 , 看是否和分裂区间的那一维所构成的平面相交,要是相交的话,最近点可能还在另一个子树上,所以还要再查询另一个子树,同时,还要看能否用根节点到该点的距离来更新我们的最近距离 。为什么是这样的,我们可以用一幅图来说明:
① 原理
为了改进KDtree的二叉树树形结构,并且沿着笛卡尔坐标进行划分的低效率,ball tree将在一系列嵌套的超球体上分割数据 。也就是说: 使用超球面而不是超矩形划分区域。虽然在构建数据结构的花费上大过于KDtree,但是在 高维 甚至很高维的数据上都表现的很高效 。
球树递归地将数据划分为 由质心C和半径r定义的节点 ,使得节点中的每个点都位于由r和C定义的超球内 。通过使用三角不等式来减少邻居搜索的候选点数量 。
② 建树过程
选择一个距离当前圆心最远的观测点A,和距离A最远的观测点B,将圆中所有离这两个点最近的观测点都赋给这两个簇的中心,然后计算每一个簇的中心点和包含所有其所属观测点的最小半径 。对包含n个观测点的超圆进行分割,只需要线性的时间 。
③ 查询
使用ball tree时,先自上而下找到包含target的叶子结点(c, r),从此结点中找到离它最近的观测点 。这个距离就是 最近邻的距离的上界。检查它的 兄弟结点 中是否包含比这个上界更小的观测点 。方法是: 如果目标点距离兄弟结点的圆心的距离d兄弟节点所在的圆半径R前面的上界r , 则这个兄弟结点不可能包含所要的观测点。否则,检查这个兄弟结点是否包含符合条件的观测点 。
用一个随机超平面来切割数据空间, 直到每个子空间里面只有一个数据点为止 。切割次数的多少可用来区分异常 。
iForest 由t个iTree孤立树组成,每个iTree是一个二叉树,其实现步骤如下:
可以看到d最有可能是异常,因为其最早就被孤立(isolated)了 。
获得t个iTree之后,iForest 训练就结束,然后我们可以用生成的iForest来评估测试数据了 。对于一个训练数据x,我们令其遍历每一棵iTree,然后计算x最终落在每个树第几层(x在树的高度) , 得到x在每棵树的高度平均值 。获得每个测试数据的average path length后,我们可以设置一个阈值 , 低于此阈值的测试数据即为异常 。
IForest具有线性时间复杂度 。
IForest不适用于特别高维的数据 。
最小协方差行列式(Minimum Covariance Determinant)
论文《Minimum covariance determinant and extensions》中有更详细描述 。
论文《A Fast Algorithm for the Minimum Covariance Determinant Estimator》有更详细描述 。
【knn函数python python中knn函数】knn函数python的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python中knn函数、knn函数python的信息别忘了在本站进行查找喔 。

    推荐阅读