<<机器学习实战>>---KNN

理论

K-近邻算法是一种基于计算向量距离的方法来判断的算法,具体描述见书,下面把我这次学习到的python语法及代码贴下来

语法

1.shape()查看矩阵或者数组的维数,shape[1] 为第一维的长度,c.shape[0] 为第二维的长度
2.tile(orginal, (a,b))将原来的矩阵行复制b倍,列复制a倍

  1. **是乘方的意思
  2. get() 函数返回指定键的值,如果值不在字典中返回默认值。dict.get(key, default=None)

5.sorted()方法升序排列,key参数的值为一个函数,此函数只有一个参数且返回一个值用来进行比较。这个技术是快速的因为key指定的函数将准确地对每个元素调用。
6.Operator 模块函数有itemgetter,attrgetter用复杂对象的某些值来对复杂对象的序列排序,参数reverse(True or False)来表示升序或降序排序
7.Python 字典(Dictionary) items()方法用于返回字典dict的(key,value)元组对的列表
8.zeros(x,y)构建x*y维值为0的矩阵
9.Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
10.Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串 str.split(str="", num=string.count(str)).
11.classLabelVector.append(int(listFromLine[-1])) # 把该样本对应的标签放至标签集,顺序与样本集对应。 python语言中可以使用-1表示列表中的最后一列元素
12.figure()返回一个Figure对象
13.add_subplot返回一个Axes对象,参数111表示画布分割为1行1列,图像画在第一块
14.ax.scatter(datingDataMat[:,1], datingDataMat[:,2])#散点图使用datingDataMat矩阵的第二、第三列数据
15.list[start:end(not include):step] list索引的起始位,结束位,步长
16.其中dataSet.min(0)中的参数0使得函数可以从列中选取最小值,而不是选取当前行的最小值。
17.a = np.array([[1,5,3],[4,2,6]])
print(a.min()) #无参,所有中的最小值
print(a.min(0)) # axis=0; 每列的最小值
print(a.min(1)) # axis=1;每行的最小值
结果:
1
[1 2 3]
[1 2]
18.对于ndarray的切片,格式为[x1:x2, y1:y2],截取行数为[x1,x2),列数为[y1,y2)。左边闭空间,右边开空间。 如果要截取某一行,格式为[x,:],截取某一列:[:,y] 其他截取以此类推
19.readline()是不是调用一次下一次调用就会自动读取下一行,readlines是读取全部形成一个list
20.listdir可 以 列 出 给 定 目 录 的 文 件 名 。

  1. 语法:str.split(str="", num=string.count(str))[n]
    参数说明:
    str: 表示为分隔符,默认为空格,但是不能为空('')。若字符串中没有分隔符,则把整个字符串作为列表的一个元素
    num:表示分割次数。如果存在参数num,则仅分隔成
    num + 1
    个子字符串,并且每一个子字符串可以赋给新的变量
    [n]: 表示选取第n个分片
    注意:当使用空格作为分隔符时,对于中间为空的项会自动忽略

输入

trainingDigits
testDigits
是将图像以数字0和1矩阵储存的文本文件

代码

from numpy import  *
import operator
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from os import listdir

def createDataSet():
    # array =
    # # tuple(array)
    group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    # tuple(array)
    labels = ['A', 'A', 'B', 'B']
    return group, labels


def  classify0(intX, dataSet, labels, k):  #返回前K个可能性的类别
    dataSetSize = dataSet.shape[0]
    #shape()查看矩阵或者数组的维数,shape[1] 为第一维的长度,c.shape[0] 为第二维的长度
    diffMat = tile(intX, (dataSetSize, 1)) - dataSet
    #tile(orginal, (a,b))将原来的矩阵行复制b倍,列复制a倍
    sqDiffMat = diffMat ** 2
    #  **是乘方的意思
    #相加为一个列向量
    sqDistances = sqDiffMat .sum(axis = 1)
    #开方
    distances = sqDistances ** 0.5
    #从小到大排序,返回该值在原来值中的索引
    sortedDistIndicies = distances.argsort()
    classCount = {}
    #计算在邻居中哪一类最多
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
        # get() 函数返回指定键的值,如果值不在字典中返回默认值。dict.get(key, default=None)
    sortedClassCount = sorted(classCount.items(),  key = operator.itemgetter(1), reverse = True)
    #sorted()方法升序排列,key参数的值为一个函数,此函数只有一个参数且返回一个值用来进行比较。这个技术是快速的因为key指定的函数将准确地对每个元素调用。
    #Operator 模块函数有itemgetter,attrgetter用复杂对象的某些值来对复杂对象的序列排序,参数reverse(True or False)来表示升序或降序排序
    #Python 字典(Dictionary) items()方法用于返回字典dict的(key,value)元组对的列表
    return sortedClassCount[0][0]

def file2matrix(filename): # 从文件中读入训练数据,并存储为矩阵
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)
    returnMat = zeros((numberOfLines, 3))
    #zeros(x,y)构建x*y维值为0的矩阵
    classLabelVector = []
    index = 0
    for line in arrayOLines:
        line = line.strip()
        #Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
        listFromLine = line.split('\t')
        #Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串  str.split(str="", num=string.count(str)).
        returnMat[index, :] = listFromLine[0:3]# 把分割好的数据放至数据集,其中index是该样本数据的下标,就是放到第几行
       # labels = {'didntLike': 1, 'smallDoses': 2, 'largeDoses': 3}
        classLabelVector.append(int(listFromLine[-1])) # 把该样本对应的标签放至标签集,顺序与样本集对应。 python语言中可以使用-1表示列表中的最后一列元素
        index += 1
    return returnMat, classLabelVector

#datingDataMat,datingLabels = file2matrix('C:/Users/LRT/PycharmProjects/M_learn/datingTestSet.txt')
# print(datingDataMat,datingLabels)

def matpt():#画散点图
    fig = plt.figure()#figure()返回一个Figure对象
    ax = fig.add_subplot(111)#add_subplot返回一个Axes对象,参数111表示画布分割为1行1列,图像画在第一块
    #ax.scatter(datingDataMat[:,1], datingDataMat[:,2])#散点图使用datingDataMat矩阵的第二、第三列数据
    #list[start:end(not include):step]   list索引的起始位,结束位,步长
    ax.scatter(datingDataMat[:,1], datingDataMat[:,0], 15.0*array(datingLabels), 15.0*array(datingLabels))#利用变量datingLabels存储的类标签属性,在散点图上绘制了色彩不等、尺寸不同的点
    plt.show()


def autoNorm(dataSet):   #归一化特征值
    minVals = dataSet.min(0)#其中dataSet.min(0)中的参数0使得函数可以从列中选取最小值,而不是选取当前行的最小值。
# a = np.array([[1,5,3],[4,2,6]])  
# print(a.min()) #无参,所有中的最小值  
# print(a.min(0)) # axis=0; 每列的最小值  
# print(a.min(1)) # axis=1;每行的最小值 
# 结果:
# 1
# [1 2 3]
# [1 2]
    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, ranges, minVals)

def datingClassTest():
    hoRatio = 0.50      #hold out 10%
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')       #load data setfrom file
    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)  #normMat前numTestVecs数量的列作为测试集,后numTestVecs数量的列为训练集
        #  对于ndarray的切片,格式为[x1:x2, y1:y2],截取行数为[x1,x2),列数为[y1,y2)。左边闭空间,右边开空间。  
        #  如果要截取某一行,格式为[x,:],截取某一列:[:,y]  
        #  其他截取以此类推 
        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)))
    print(errorCount)

# datingClassTest()

def classifyPerson():   #预测约会对象喜欢程度函数
    resultList = ['not at all', 'in small doses', 'in large doses']
    percenTags = float( input("percentage of time spent playing video game?"))
    ffMiles = float(input("frequent filer miles earned per year?"))
    iceCream = float(input("liters of ice cream consumed per years?"))
    datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')
    normMat, ranges, minVals = autoNorm(datingDataMat)
    inArr = array([ffMiles, percenTags, iceCream])
    #numpy中封装的array有很强大的功能,里面存放的都是相同的数据类型
    classifierResult = classify0((inArr-minVals)/ranges, normMat, datingLabels, 3)
    print("you will probably like this person", resultList[classifierResult - 1])


# classifyPerson()


def img2vector(filename):   #将图像转化为向量
    returnVect = zeros((1, 1024))
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()#readline()是不是调用一次下一次调用就会自动读取下一行,readlines是读取全部形成一个list
        for j in range(32):
            returnVect[0, 32 * i + j] = int(lineStr[j])
    return returnVect

# testVector = img2vector('testDigits/0_13.txt')
# print(testVector[0, 0:31])


def handwritingClassTest():
    hwLabels = []
    trainingFileList = listdir('trainingDigits')           #load the training set      listdir可 以 列 出 给 定 目 录 的 文 件 名 。
    m = len(trainingFileList)
    trainingMat = zeros((m,1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]     #take off .txt
        classNumStr = int(fileStr.split('_')[0])
        # 语法:str.split(str="", num=string.count(str))[n]
        # 参数说明:
        # str:   表示为分隔符,默认为空格,但是不能为空('')。若字符串中没有分隔符,则把整个字符串作为列表的一个元素
        # num:表示分割次数。如果存在参数num,则仅分隔成
        # num + 1
        # 个子字符串,并且每一个子字符串可以赋给新的变量
        # [n]:   表示选取第n个分片
        # 注意:当使用空格作为分隔符时,对于中间为空的项会自动忽略
        hwLabels.append(classNumStr)
        trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)
    testFileList = listdir('testDigits')        #iterate through the test set
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]     #take off .txt
        classNumStr = int(fileStr.split('_')[0])
        vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
        classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
        print ("the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr))
        if (classifierResult != classNumStr): errorCount += 1.0
    print ("\nthe total number of errors is: %d" % errorCount)
    print ("\nthe total error rate is: %f" % (errorCount/float(mTest)))

handwritingClassTest()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,685评论 0 11
  • 在挖掘分析的过程当中对字符串的处理是极为重要的,且出现也较为频繁,R语言作为当前最为流行的开源数据分析和可视化平台...
    果果哥哥BBQ阅读 5,793评论 0 8
  • KNN (k-近邻算法) 其工作原理是: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都有存在标签...
    z3r0me阅读 185评论 0 0
  • 有多喜欢你? “像喜欢春天的熊一样。在一个风和日丽的春天里,你走在森林中,突然蹦出来一头毛茸茸的可爱极了的小熊,小...
    白莴笋阅读 673评论 0 0
  • 文/文逸林 (一) 剪一段美好时光 相约好了去诗意的远方 趁着春光明媚 趁着心情舒畅 拾捡一段墨香 独自徘徊在唐诗...
    文逸林阅读 542评论 0 4