用python3来实现对机器学习实战上面的实例

3人阅读 评论(0) 收藏 举报
分类:

这是我对机器学习实战中的kNN算法实现,以及对代码的理解。

首先我是用的数据集是机器学习实战中的实例,我是用python3实现的。代码以及文件全部在我的GitHub

首先我们这个算法用的是欧氏距离公式,
我们平常所用的就是欧式距离公式,欧氏距离也可以用来求多个维度的点的距离。

  1. 首先让我们引入所需要的包
    from numpy import *
    import operator
  1. 做一个测试集
    def createDataSet():
        group = array([[1.0, 1.1],[1.0, 1.1],[0, 0], [0, 0.1]])
        labels = ['A', 'A', 'B', 'B']
        return group, labels
  1. 测试一下这个代码
    group, labels = createDataSet()
    print(group)
    print(labels)
  • 输出结果
    [[1.  1.1]
    [1.  1.1]
    [0.  0. ]
    [0.  0.1]]
    ['A', 'A', 'B', 'B']
  1. knn分类算法
    def classify0(inX, dataSet, labels, k):
        '''
        inX表示输入向量
        dataSet是我们输入的续联样本集
        labels表示向量标签
        k 表示我们需要选出最小的k个值
        '''
        dataSetSize = dataSet.shape[0]  #dataSetsize表示dataSet数据集中的第一位的长度
        diffMat = tile(inX, (dataSetSize, 1)) - dataSet #tile方法,这句话的含义表示生成一个n行的数组,其中每行都是inX,并且与训练集相减
        #求出距离
        sqDiffMat = diffMat ** 2    
        sqDistance = sqDiffMat.sum(axis = 1)
        distances = sqDistance ** 0.5
        print(distances)
        sortedDistIndicies = distances.argsort() #argsort()方法表示,对距离从大到小排序,并且返回对应的序号
        print(sortedDistIndicies)
        classCount ={ }

        # 选出距离最小的k个值
        for i in range(k):
            voteIlabel = labels[sortedDistIndicies[i]]
            classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
        sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
        return sortedClassCount[0][0]
  • 运用前面的数据集做一下测试
    print(classify0([0, 0], group, labels, 3))
  • 输出结果是:
    [1.48660687 1.48660687 0.         0.1       ]
    [2 3 0 1]
    B
  1. 输入文件得到训练的数据集
    def file2matrix(filename):
    fr = open(filename) #打开文件
    arrayOLines = fr.readlines() #得到文件的所有行
    numberOfLines = len(arrayOLines) #得到文件的行数
    returnMat = zeros((numberOfLines, 3)) #生成一个numberOfLine行,3列的全为0的矩阵
    classLabelVector  = []
    index = 0
    for line in arrayOLines:
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] =  listFromLine[0:3]  #取出特征数据
        classLabelVector.append(listFromLine[-1])#取出数据对应的类别,也就是标签
        index += 1
    return returnMat, classLabelVector
  1. 对数据归一化处理
    def autoNorm(dataSet):
        minVals = dataSet.min(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
  • 其中 normalDataSet全是小于或等于一的数

    1. 对数据算法进行最终的测试
    def datingClassTest():
        hoRatio = 0.10  #在数据中取出0.1的比例作为测试数据
        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):
            #利用knn算法分类
            classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m,:],\
                                        datingLabels[numTestVecs:m], 3)
            print("the classfier came back with: %s, the real answer is: %s"\
                %(classifierResult, datingLabels[i]))
            #统计错误的个数
            if classifierResult != (datingLabels[i]):errorCount += 1.0
        print('the total error rate is: %f' %(errorCount/float(numTestVecs)))
    datingClassTest()
  • 结果
    the classfier came back with:largeDoses, the real answer is: largeDoses
    the classfier came back with:smallDoses, the real answer is: smallDoses
    the classfier came back with:didntLike, the real answer is: didntLike
                                    .
                                    .
                                    .
    the classfier came back with:didntLike, the real answer is: didntLike
    the classfier came back with:largeDoses, the real answer is: didntLike
    the total error rate is: 0.050000

我们得到了错误率为5%,这个算法还行

查看评论

【机器学习实战-python3】利用PCA简化数据

本章是涉及降维主题的两章中的第一章。在降维中,我们对数据进行了预处理。之后,采用其他机器学习技术对其进行处理。 本篇的数据和代码参见:https://github.com/stonycat/ML-i...
  • sinat_17196995
  • sinat_17196995
  • 2017-05-14 21:58:55
  • 904

Python3:《机器学习实战》之朴素贝叶斯(2)使用Python进行文本分类

Python3:《机器学习实战》之朴素贝叶斯(2)使用Python进行文本分类 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://gith...
  • u011475210
  • u011475210
  • 2017-09-10 15:40:26
  • 3748

机器学习实战 第一章 源码(Python3版本)

  • 2017年08月03日 07:49
  • 379B
  • 下载

机器学习实战(Python3版)

水平有限,若有错误还请不吝赐教! 最近在学机器学习,因为Python2跟Python3的差距,所以,我选择直接学习Python3来完成对机器学习实战的内容,此类博客会持续更新 (等我完成本书内容,代...
  • Yugi_2000
  • Yugi_2000
  • 2017-10-11 10:08:03
  • 406

机器学习实战-python3决策树实例

工具:PythonCharm 书中的代码是python2的,而我用的python3,结合实践过程,这里会标注实践时遇到的问题和针对python3的修改。  实践代码和训练测试数据可以参考这里  htt...
  • tian544556
  • tian544556
  • 2017-12-09 20:33:48
  • 160

《机器学习实战》书本代码python3改写

  • 2018年02月23日 17:20
  • 1.35MB
  • 下载

【机器学习实战-python3】k-近邻算法

虽然现在深度学习大火,但是个人想利用最近的时间系统地学一下机器学习的基础方法,结合Machine Learning in action 一书,在此记录学习实践过程。 工具:PythonCharm ...
  • sinat_17196995
  • sinat_17196995
  • 2017-02-13 19:37:32
  • 2530

【机器学习实战-kNN(k-近邻)】python3实现-书本知识【1】

说明:本文内容为【Peter Harrington -机器学习实战】一书的学习总结笔记。 基本概念: kNN是一种使用欧式定理计算各个特征之间的距离而进行分类的方法,欧式定理: 简述:求点(x1,y...
  • guoweifyj
  • guoweifyj
  • 2016-11-28 12:28:50
  • 852

机器学习实战 第三章 源码(Python3版本)

  • 2017年08月03日 08:31
  • 7KB
  • 下载

Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)

本文将从k-邻近算法的思想开始讲起,使用python3一步一步编写代码进行实战训练。并且,我也提供了相应的数据集,对代码进行了详细的注释。除此之外,本文也对sklearn实现k-邻近算法的方法进行了讲...
  • c406495762
  • c406495762
  • 2017-07-15 16:04:39
  • 27313
    个人资料
    等级:
    访问量: 0
    积分: 10
    排名: 0
    文章分类
    文章存档