机器学习实战之K近邻

手撕代码,已经全部调试正确,可以直接copy使用的哦;;;;诶,这个复制代码好像不咋好用(注意缩进)

#!/usr/bin/python

#-*- coding:UTF-8-*- from numpy import * #科学计数包

import operator #运算符模块

from os import listdir #从os模块中导入listdir,他可以列出给定目录的文件名

#creat DataSet

def creatDataSet():

    group = array([[1. ,1.1],[1. ,1.],[0. ,0.],[0.,0.1]])

    labels = ['A', 'A', 'B', 'B']

    return group ,labels

#classify these datasets

def classify0(inX, dataSet, labels, k):

    dataSetSize = dataSet.shape[0]

    #shape[0]返回行数,shape[1]返回列数,行数就是样本数量,此处为4

    diffMat = tile(inX, (dataSetSize, 1)) - dataSet #要分类的新数据和原始数据做差

    #about tile():

#1.tile()是numpy下的一个函数

#2.tile(A, reps)返回一个shape =reps的矩阵,矩阵的每个元素是A(reps的数字从后往前分布对应A的第N个维度的重复次数)

#3.可以理解为行方向重复多少次,列方向重复多少次

    sqDiffMat = diffMat ** 2 #对差求平方

    sqDistances = sqDiffMat.sum(axis = 1) #这样就求出每个新数据点和原始数据点的距离的平方

    distances = sqDistances ** 0.5 #这里求得才是距离

    sortedDisIndicies = distances.argsort()#距离升序排序

#about argsort():

#argsort()函数返回的是数组值从小到大排序的索引值,也就是原数组的下标(remember下表从0开始算) #存放分类结果以及投票次数

    classCount = {} #建立空字典 {key, value},key是label, value 是label的次数

    for i in range(k):

        voteLabel = labels[sortedDisIndicies[i]]

        classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

#voteLabel 不在classCount中时返回0.若在就读取当前的value值+1

      sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True) #sorted(iterable, cmp=None, key=None, reverse=False)

#return new sorted list返回列表 #cmp:用于比较的函数,比较什么由key决定 #key:用列表的某个属性或者函数进行作为关键字,迭代集合中的一项 、

#operator.itemgetter(1)表示获得对象的第一个域的值,这里是指value #reverse:排序规则,True降序,False 升序

       return sortedClassCount[0][0]

if __name__ == "__main__":

    dataSet,labels =creatDataSet()

    inX = [0.1, 0.1]

    className = classify0(inX, dataSet,labels,3)

    print "the class of test sample is %s" %className

#-*- coding:UTF-8-*-

from numpyimport *#科学计数包

import operator#运算符模块

from osimport listdir#从os模块中导入listdir,他可以列出给定目录的文件名

#creat DataSet

def creatDataSet():

group = array([[1. ,1.1],[1. ,1.],[0. ,0.],[0.,0.1]])

labels = ['A','A','B','B']

return group ,labels

#classify these datasets

def classify0(inX, dataSet, labels, k):

dataSetSize = dataSet.shape[0]#shape[0]返回行数,shape[1]返回列数,行数就是样本数量,此处为4

    diffMat = tile(inX, (dataSetSize,1)) - dataSet#要分类的新数据和原始数据做差

    # about tile():

    #1.tile()是numpy下的一个函数

    #2.tile(A, reps)返回一个shape =reps的矩阵,矩阵的每个元素是A(reps的数字从后往前分布对应A的第N个维度的重复次数)

    #3.可以理解为行方向重复多少次,列方向重复多少次

    sqDiffMat = diffMat **2      #对差求平方

    sqDistances = sqDiffMat.sum(axis =1)#这样就求出每个新数据点和原始数据点的距离的平方

    distances = sqDistances **0.5          #这里求得才是距离

    sortedDisIndicies = distances.argsort()#距离升序排序

    #about argsort():

    #argsort()函数返回的是数组值从小到大排序的索引值,也就是原数组的下标(remember下表从0开始算)

    #存放分类结果以及投票次数

    classCount = {}#建立空字典  {key, value},key是label, value 是label的次数

    for iin range(k):

voteLabel = labels[sortedDisIndicies[i]]

classCount[voteLabel] = classCount.get(voteLabel,0) +1

        #voteLabel 不在classCount中时返回0.若在就读取当前的value值+1

    sortedClassCount =sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse =True)

#sorted(iterable, cmp=None, key=None, reverse=False)

    #return new sorted list返回列表

    #cmp:用于比较的函数,比较什么由key决定

    #key:用列表的某个属性或者函数进行作为关键字,迭代集合中的一项

    #  operator.itemgetter(1)表示获得对象的第一个域的值,这里是指value

    #reverse:排序规则,True降序,False 升序

    return sortedClassCount[0][0]

if __name__ =="__main__":

dataSet,labels =creatDataSet()

inX = [0.1,0.1]

className = classify0(inX, dataSet,labels,3)

print "the class of test sample is %s" %className

你可能感兴趣的:(机器学习实战之K近邻)