K-邻近算法(kNN)python3.X

来源:互联网 发布:央视市场研究 知乎 编辑:程序博客网 时间:2024/06/10 00:29

k-邻近算法(kNN)学习笔记

  • 机器学习主要任务
    在机器学习(Machine Learning)的主要任务就是实现数据的分类,通过给算法输入大量已分类的数据作为算法训练集,使机器能够找到特征与目标变量之间的关系,对未知特征的数据做出正确的判断,这就是分类。机器学习的另外一个重要的任务就是回归,用来预测数值型数据。

  • kNN(K-邻近算法)概念
    k-邻近算法是给算法一个训练样本集,每个样本集都给出了明确的特征和明确的标签。然后输入需要分类的数据,利用算法计算出该数据和样本集各个点之间的距离,取前k个距离最近的点,这就是k-邻近算法的k的含义。最后选择k个最相似数据中出现最多的类型作为新数据的数据类型,这样就是实现了数据分类。

  • k-邻近算法
    在输入训练样本集后,输入需要分类的数据,计算得到该数据与样本集各个点的距离集合,然后对这些数据进行排序。然后选取前k个距离数据(也就是和训练样本集最相似的K个点),得到其中类型出现最多的类型,得到该新数据的分类。代码如下:

    1. 数据输入
      该程序利用 readlines() 读取文本文件,里面包含了训练样本集的特征(程序有3个特征值)和目标类型,然后分别存储在两个列表中。
def file2matrix(filename):    fr=open(filename)    arrayOLines=fr.readlines() #读取文件    numberOfLines=len(arrayOLines)    retuanMat=zeros((numberOfLines,3))#存储特征数据    classLabelVector=[]    index =0    for line in arrayOLines:        line =line.strip()        listFromLine=line.split('\t')        retuanMat[index,:]=listFromLine[0:3]        classLabelVector.append(listFromLine[3])#存储类型数据        index+=1    return retuanMat,classLabelVector

2.k-邻近主程序
先计算预测点和训练数据点的全部距离,然后进行排序,选取最相近的前k个点。

def classify0 (inX, dataSet, labels, k):    dataSetSize=dataSet.shape[0]    diffMat=tile(inX, (dataSetSize,1))-dataSet    sqDiffMat=diffMat**2    sqDistance=sqDiffMat.sum(axis=1)    distances=sqDistance**0.5    sortedDistIndicies=distances.argsort()    #以上算法为计算距离算法和排序算法    classCount={}    for i in range(k):        voteIlabel=labels[sortedDistIndicies[i]] #选择距离最短的k个点classCount[voteIlabel]=classCount.get(voteIlabel,0)+1sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)    return sortedClassCount[0][0]

3.读取文件的yield用法
在函数中含有yield的函数叫做生成器。如下例子:

def count(n):    print("_1")    while n>0:        print("_2")        yield n        n-=1        print("_3")>>>count(5)#yield生成函数序列,返回一个“generator”类型<generator object count at 0x04D5FF58>>>>c=count(5)>>>c.__next__()#生成器函数只有在调用__next()__方法的时候才开始执行函数里面的语句_1_25>>>c.__next__()_3_24

上面例子在python3.4中全部编译通过,yield生成函数在next()方法下开始执行,遇到yield时停止运行,下次调用next()方法时从yield开始继续执行。

  • 调用readlines()读取数据是一次读取整个文件,如果内存太小那么电脑就会卡顿的很厉害,所以就需要考虑利用上面的yield生成器来读取数据。可以用以下代码实现:
def open_txt(filename)    with open(filename,'r+') as f:    line=f.readline()    while line:            yield line.strip()            line=f.readline()
0 0
原创粉丝点击