机器学习实战-第二章代码+注释-KNN

#-*- coding:utf-8 -*-
#https://blog.csdn.net/fenfenmiao/article/details/52165472
from numpy import * #科学计算包

import operator #运算符模块
import matplotlib
import matplotlib.pyplot as plt
#matplotlib.pyplot是一些命令行风格函数的集合

from os import listdir #列出给定目录的文件名

def createDataSet():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = [‘A‘, ‘A‘, ‘B‘, ‘B‘]
    return group, labels

def classify0(inX, dataSet, labels, k) :
    dataSetSize = dataSet.shape[0]  #查看矩阵或者数组的维数     c.shape[1] 为第一维的长度,c.shape[0] 为第二维的长度 此处为4

    #(dataSetSize, 1)使数组重复完是四行一样的  而不是在1行中。
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet     #numpy.tile(A,reps) tile共有2个参数,A指待输入数组,reps则决定A重复的次数。整个函数用于重复数组A来构建新的数组。
    sqDiffMat = diffMat ** 2    #幂  (x1 - x2)的幂
    sqDistance = sqDiffMat.sum(axis = 1)    #每行相加    横着相加
    distances = sqDistance ** 0.5   #开根号
    sortedDistIndicies = distances.argsort()    #argsort是排序,将元素按照由小到大的顺序返回下标
    classCount = {} #dict字典数据类型,字典是Python中唯一内建的映射类型
    for i in range(k) :
        voteIlabel = labels[sortedDistIndicies[i]]
        #get是取字典里的元素,如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,如果没有就返回0(后面写的),这行代码的意思就是算离目标点距离最近的k个点的类别,这个点是哪个类别哪个类别就加1
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    #key=operator.itemgetter(1)的意思是按照字典里的第一个排序,{A:1,B:2},要按照第1个(AB是第0个),即‘1’‘2’排序。reverse=True是降序排序
    sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(0), reverse = True)
    return sortedClassCount[0][0]

def file2matrix(filename):
    fr = open(filename)
    # 一次读取整个文本数据,并且自动将文件内容分析成一个行的列表,比readline()快 ,后面的img2vector就是使用的readline(),因为要逐行逐个读取,可以对比一下
    arrayOLines = fr.readlines()
    numberOfLines = len(arrayOLines)
    #返回来一个给定形状和类型的用0填充的数组;
    returnMat = zeros((numberOfLines, 3))   #文件有几行就是几行,设置为3列(可调)
    classLabelVector = []
    index = 0
    for line in  arrayOLines :
        line = line.strip() #去掉回车符
        listFromLine = line.split(‘\t‘) #分成了4列数据,得到了4个列表
        #将数据前三列提取出来,存放到returnMat的NumPy矩阵中,也就是特征矩阵
        returnMat[index, :] = listFromLine[0 : 3]    #前3个列表元素是爱伦要的特征,取出来去填充returnMat
        #classLabelVector.append(int(listFromLine[-1]))
        if listFromLine[-1] == ‘didntLike‘:
            classLabelVector.append(1)
        elif listFromLine[-1] == ‘smallDoses‘:
            classLabelVector.append(2)
        elif listFromLine[-1] == ‘largeDoses‘:
            classLabelVector.append(3)
        index += 1
    return returnMat, classLabelVector

#归一化
def autoNorm(dataSet) :
    #min(0)返回该矩阵中每一列的最小值
    #min(1)返回该矩阵中每一行的最小值
    #max(0)返回该矩阵中每一列的最大值
    #max(1)返回该矩阵中每一行的最大值
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    #得到数据集的行数  shape方法用来得到矩阵或数组的维数
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    normDataSet = dataSet - tile(minVals, (m, 1))
    normDataSet = normDataSet / tile(ranges, (m, 1))
    return normDataSet, ranges, minVals

def datingClassTest() :
    hoRatio = 0.10
    datingDataMatm, datingLabels = file2matrix(‘F:\jxq\Desktop\datingTestSet.txt‘)
    normMat, ranges, minVals = autoNorm(datingDataMat)   #归一化
    m = normMat.shape[0]    #二维数组维度大小
    numTestVecs = int(m * hoRatio)  #训练样本从第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 doses‘, ‘in large doses‘]
    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 year?"))
    datingDataMat, datingLables = file2matrix(‘F:\jxq\Desktop\datingTestSet.txt‘)
    normMat, ranges, minVals = autoNorm(datingDataMat)
    inArr = array([ffMiles, percentTats, iceCream])
    classifierResult = classify0((inArr-minVals)/ranges, normMat, datingLables, 3)
    print ("You will probably like this person:", resultList[classifierResult - 1]) #索引从0开始,索引减去1才能索引到对应的resultList

def img2vector(filename) :
    returnVect = zeros((1, 1024))   # 用于保存1x1024的向量
    fr = open(filename)
    for i in range(32) :
        lineStr = fr.readline()
        for j in range(32) :
            returnVect[0, 32*i+j] = int(lineStr[j]) # 字符需要强制类型转换成整数

    return returnVect

def handwritingClassTest() :
    hwLabels = []
    #获取目录内容
    trainingFileList = listdir(‘F:\\jxq\\Documents\\Tencent Files\\834810071\\FileRecv\\machinelearninginaction-master\\machinelearninginaction-master\\Ch02\\digits\\trainingDigits‘)
    m = len(trainingFileList)
    trainingMat = zeros((m, 1024))
    for i in range(m) :
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split(‘.‘)[0] #无后缀文件名
        classNumStr = int(fileStr.split(‘_‘)[0]) #获取文件内的数字
        hwLabels.append(classNumStr)
        #图片转换为向量
        trainingMat[i, :] = img2vector(‘F:\\jxq\\Documents\\Tencent Files\\834810071\\FileRecv\\machinelearninginaction-master\\machinelearninginaction-master\\Ch02\\digits\\trainingDigits\\%s‘ %fileNameStr)
    testFileList = listdir(‘F:\\jxq\\Documents\\Tencent Files\\834810071\\FileRecv\\machinelearninginaction-master\\machinelearninginaction-master\\Ch02\\digits\\testDigits‘)
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split(‘.‘)[0]
        classNumStr = int(fileStr.split(‘_‘)[0])
        vectorUnderTest = img2vector(‘F:\\jxq\\Documents\\Tencent Files\\834810071\\FileRecv\\machinelearninginaction-master\\machinelearninginaction-master\\Ch02\\digits\\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 error is: %d" %errorCount)
    print("\nthe total error rate is: %f" %(errorCount/float(mTest)))

if __name__ == ‘__main__‘:
    #filename = ‘F:\jxq\Desktop\datingTestSet.txt‘
    #datingDataMat, datingLabels = file2matrix(filename)
    ‘‘‘
    print(datingDataMat)
    print(datingLabels)
    fig = plt.figure()  #figure()来创建多个图
    ax = fig.add_subplot(111)   #参数349的意思是:将画布分割成3行4列,图像画在从左到右从上到下的第9块
    #后两个是颜色
    ax.scatter(datingDataMat[:, 1], datingDataMat[:, 2], 15.0*array(datingLabels), 15.0*array(datingLabels))    #绘制散点图  X[:,0]就是取所有行的第0个数据, X[:,1] 就是取所有行的第1个数据
    ‘‘‘
    ‘‘‘
    normMat, range, minVals = autoNorm(datingDataMat)
    print(normMat)
    print(range)
    print(minVals)
    ‘‘‘
    #datingClassTest()
    #plt.show()
    #classifyPerson()
    #testVector = img2vector(‘F:\\jxq\\Documents\\Tencent Files\\834810071\\FileRecv\\machinelearninginaction-master\\machinelearninginaction-master\\Ch02\\digits\\testDigits\\0_13.txt‘)
    #print(testVector[0, 0:31])
    #print(testVector[0, 32:63])
    handwritingClassTest()

原文地址:https://www.cnblogs.com/NEU-2015/p/9201153.html

时间: 2024-07-30 21:39:40

机器学习实战-第二章代码+注释-KNN的相关文章

机器学习实战第二章----KNN

tile的使用方法 tile(A,n)的功能是把A数组重复n次(可以在列方向,也可以在行方向) argsort()函数 argsort()函数返回的是数组中值从大到小的索引值 dict.get()函数 语法:dict.get(key, default=None) key----字典中要查找的键 default----如果指定的简直不存在时,返回该默认值 add_subplot()基础用法 import matplotlib.pyplot as plt from numpy import * fi

机器学习实战——第二章之改进约会网站的配对效果

三种类型:不喜欢的-1,魅力一般的-2,极具魅力的-3. 样本特征:每年获得的飞行常客里程数,玩视频游戏所耗时间百分比,每周消费的冰淇淋公升数. 1 from numpy import * 2 import matplotlib 3 import matplotlib.pyplot as plt 4 5 ''' 6 输入文本文件名字符串,输出训练样本矩阵和类标签向量 7 ''' 8 def file2matrix(filename): 9 fr = open(filename) 10 array

机器学习实战——第二章

k-近邻算法(kNN):测量不同特征值之间的距离方法进行分类. kNN的工作原理:存在一个样本数据集合(训练样本集),并且样本集中每个数据都存在标签,输入没有标签的新数据后,将新数据的每个特征与样本集数据对应的特征进行比较,然后算法提取样本集中特征最相似数据的分类标签.一般来说,只选择样本数据集中前k个最相似的数据. 伪代码: 1)计算已知类别数据集中的点与当前点之间的距离: 2)按照距离递增次序排序: 3)选取与当前点距离最小的k个点: 4)确定前k个点所在类别的出现频率: 5)返回前k个点出

《The Django Book》实战--第二章--动态网页基础

这章演示了一些最基本的Django开发动态网页的实例,由于版本不一样,我用的是Django 1.,6.3,有些地方按书上的做是不行的,所以又改了一些,写出来让大家参考. 这是一个用python写的一个显示当前时间的网页. 1.开始一个项目. 在命令行中(指定要保存项目代码的盘或文件夹下)输入 python ...\django-admin.py startproject djangobook  (虽然在环境变量Path中加入了django-admin.py的地址,但是在前面还是要加上路径名,不知

.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证

原文:.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证 内容:本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 在这一篇文章中我们希望使用OpenID Connect这种方式来验证我们的MVC程序(需要有IdentityServer4),我们首先需要干什么呢?那就是搞一个UI,这样非常美观既可以看到我们的身份验证效果,那么Iden

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

机器学习实战python3 K近邻(KNN)算法实现

台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python3 写一遍.python3 与python2 不同的地方会在程序中标出. 代码及数据:https://github.com/zle1992/MachineLearningInAction/tree/master/ch2 k-近邻算法优点:精度高.对异常值不敏感.无数据输入假定.缺点:计算复杂度高.空间复杂度高

机器学习实战ByMatlab(一)KNN算法

KNN 算法其实简单的说就是"物以类聚",也就是将新的没有被分类的点分类为周围的点中大多数属于的类.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本的特征空间中最为临近(欧式距离进行判断)的K个点大都属于某一个类,那么该样本就属于这个类.这就是物以类聚的思想. 当然,实际中,不同的K取值会影响到分类效果,并且在K个临近点的选择中,都不加意外的认为这K个点都是已经分类好的了,否则该算法也就失去了物以类聚的意义了. KNN算法的不足点: 1.当样本不平衡时,比如一个类的

C#基础入门学习-第二节-代码注释的使用以及常用技巧

1.在当前解决方案中含有一个项目,如何在添加一个项目? (1)方案1,在解决方案管理器中的解决方案名称上点击鼠标右键,选择增加,选择新建项目,输入项目名称即可 (2)方案2,在VS菜单中选择文件,新建,项目,输入项目名称,解决方案选择,增加到解决方案即可 2.在多个项目中如何运行某个项目? (1)我们在解决方案管理器中查看那个项目文件名是黑色,代表那个是当前的项目,在调试的时候会运行该项目,如果我们想运行其它项目,在其它项目点击右键 设为启动项目即可,或者解决方案,右键属性,单启动项目,选择要启