KNN算法理解

  深度学习自学一段时间,了解了一些基本知识,CNN,DBN,LSTM等神经网络模型,学习了Python的基本语法,最近又看了《机器学习实战》这本书。

一、K-近邻算法理论理解

  KNN是通过测量不同的属性值之间的距离进行分类,如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
  譬如:一组数据,已知每一行的分类属性,求给定[0,0],的分类情况

group=array([[1.,1.1],[1.,1.],[0.,0.],[0.,0.1]])
labels=['A','A','B','B']
predictlabel0=classify0([0,0],group,labels,3)

  直接更直观的图片解释
分类
  利用python对简单的数据进行了分类实现。
  KNN算法的思想总结:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

二、python算法实现
from numpy import *
import operator
#KNN实现,最邻近算法,自己代码实现
def classify0(inX,dataset,labels,K):  #inX是:预测的数据
    dateSetSize=dataset.shape[0]
    diffMat=tile(inX,(dateSetSize,1))   #tile: [[0.,0.],[0.,0.],[0.,0.],[0.,0.]]  重复[0.,0.],dataSetSize=4,行4次,列1次
    diffMat=diffMat-dataset
    sqDiffMat=diffMat**2
    sqDistances=sqDiffMat.sum(axis=1)
    distances=sqDistances**0.5    sortedDisIndicies=distances.argsort()#argsort函数返回的是数组值从小到大的索引值
    classCount={}
    for i in range(K):     voteIlabel=labels[sortedDisIndicies[i]]       classCount[voteIlabel]=classCount.get(voteIlabel,0)+1    sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    #iteritems()返回一个迭代器,items函数,将一个字典以列表的形式返回,因为字典是无序的,所以返回的列表也是无序的。
    #operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号
    #sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
    return sortedClassCount[0][0]
group=array([[1.,1.1],[1.,1.],[0.,0.],[0.,0.1]])
labels=['A','A','B','B']
label0=classify0([0,0],group,labels,3)
print label0

输出结果显示:B

三、KNN约会问题
#KNN约会问题
#输入处理数据之前,将待处理数据的格式变为分类器可以接受的格式。
#处理输入格式问题
def file2matrix(filename):
    fr=open(filename)
    arrayOLines=fr.readlines()
    numberOfLines=len(arrayOLines)   #得到文件行数
    returnMat=zeros((numberOfLines,3))
    #生成numberOfLines 这么多行,3列的0矩阵     #创建返回numpy矩阵
    classLabelVector=[]
    index=0
    for line in arrayOLines:
        line=line.strip()  #函数line.strip()截取掉所有的回车字符
        listFromLine=line.split('\t')   #使用tab字符\t将上一步得 到的整行数据分割成一个元素列表
        returnMat[index,:]=listFromLine[0:3]   #解析文件数据到列表
        classLabelVector.append(int(listFromLine[-1]))  #最后一列存储在向量classLabelVector中
        index+=1
    return returnMat,classLabelVector

# reload(KNN)
# datingDataMat,datingLabels=file2matrix('datingTestSet.txt')

# import matplotlib
# import matplotlib.pyplot as plt
# fig=plt.figure()
# ax=fig.add_subplot(211)
# # ax.set_title('')
# plt.xlabel(u"玩视频游戏所耗时间百分比",fontproperties='SimHei')
# plt.ylabel(u"每周消费的冰激凌公升数",fontproperties='SimHei')
# ax.scatter(datingDataMat[:,1],datingDataMat[:,2])
# # plt.show()


# bx=fig.add_subplot(212)
# bx=fig.add_subplot(111)
# # bx.set_title('')
# plt.xlabel(u"每年获取的飞行常客里程数",fontproperties='SimHei')
# plt.ylabel(u"玩视频游戏所耗时间百分比",fontproperties='SimHei')
# bx.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))
# # fig.legend((bx),('buxihuan','taoyan','huhfsd'),'upper right')
# plt.show()



#归一化
def autoNorm(dataSet):  #归一化,将数字特征值转化到0到1的区间
    minVals=dataSet.min(0)   #参数0使得函数可以从列中选取最小值
    maxVals=dataSet.max(0)
    ranges=maxVals-minVals
    normDataSet=zeros(shape(dataSet))
    m=dataSet.shape[0]
    normDataSet=dataSet-tile(minVals,(m,1))
    normDataSet=normDataSet/tile(ranges,(m,1))   #特征值相除
    #此时已经归一化数据
    return normDataSet,ranges,minVals

# normMat,ranges,minVals=autoNorm(datingDataMat)
# print normMat
# print ranges
# print minVals


#分类器针对约会网站的测试代码
def datingClassTest():
    hoRatio=0.05   #可以修改,然后对准备率(错误率降低)有很大提高
    datingDataMat,datingLabels=file2matrix('datingTestSet.txt')
    normMat,ranges,minVals=autoNorm(datingDataMat)
    m=normMat.shape[0]
    numTestVecs=int(m*hoRatio)
    errorCount=0.0
    for i in range(numTestVecs):
        classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],\
                                   datingLabels[numTestVecs:m],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))


#分类
def classifyPerson():
    resultList=['not at all','in small dones','in large dones']
    percentTats=float(raw_input(\
        "percentage of time spent playing video games?"))
    ffMiles=float(raw_input("frequent flier miles earned per year?"))
    iceCream=float(raw_input("liters of ice cream consumed per years?"))
    datingDataMat,datingLabels=file2matrix('datingTestSet.txt')
    normMat,ranges,minVals=autoNorm(datingDataMat)
    inArr=array([ffMiles,percentTats,iceCream])
    classifierResult=classify0((inArr-\
                                minVals)/ranges,normMat,datingLabels,3)
    print "you will probably like this person:",\
                    resultList[classifierResult-1]



# datingClassTest()

classifyPerson()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值