关闭

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

标签: python机器学习算法
289人阅读 评论(0) 收藏 举报
分类:

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)+1
sortedClassCount=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
_2
5
>>>c.__next__()
_3
_2
4

上面例子在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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1217次
    • 积分:43
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档