zoukankan      html  css  js  c++  java
  • 【机器学习算法-python实现】KNN-k近邻算法的实现(附源代码)

    (转载请注明出处:http://blog.csdn.net/buptgshengod)

    1.背景

        今后博主会每周定时更新机器学习算法及其python的简单实现。今天学习的算法是KNN近邻算法。KNN算法是一个监督学习分类器类别的算法。

        

         什么是监督学习,什么又是无监督学习呢。监督学习就是我们知道目标向量的情况下所使用的算法,无监督学习就是当我们不知道详细的目标变量的情况下所使用的。而监督学习又依据目标变量的类别(离散或连续)分为分类器算法和回归算法。

        

           k-Nearest Neighbor。k是算法中的一个约束变量,整个算法的整体思想是比較简单的,就是将数据集的特征值看作是一个个向量。我们给程序一组特征值,如果有三组特征值,就能够看做是(x1,x2,x3)。系统原有的特征值就能够看做是一组组的(y1,y2,y3)向量。通过求两向量间的距离,我们找出前k个距离最短的y的特征值对。这些y值所相应的目标变量就是这个x特征值的分类。

    公式:


    2.python基础之numpy

       
         numpy是python的一个数学计算库,主要是针对一些矩阵运算,这里我们会大量用到它。 介绍一下本章代码中用到的一些功能。

    arry:是numpy自带的数组表示,比方本例中的4行2列数字能够这样输入

    group=array([[9,400],[200,5],[100,77],[40,300]])


    shape:显示(行,列)例:shape(group)=(4,2)


    zeros:列出一个同样格式的空矩阵,例:zeros(group)=([[0,0],[0,0],[0,0],[0,0]])


    tile函数位于python模块 numpy.lib.shape_base中,他的功能是反复某个数组。比方tile(A,n),功能是将数组A反复n次,构成一个新的数组


    sum(axis=1)矩阵每一行向量相加


    3.数据集


     


    4.代码

        
    代码分三个函数,各自是

    创建数据集:

    createDataset

    from __future__ import division
    from numpy import *
    import operator
    
    
    
    def createDataset():
            group=array([[9,400],[200,5],[100,77],[40,300]])
            
            labels=['1','2','3','1']
            return group,labels  

    数据归一化:

    autoNorm

    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))
        #print normDataSet
        normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide
       # print normDataSet
        return normDataSet, ranges, minVals

    分类函数:

    classify

    def classify(inX, dataSet, labels, k):
        dataSetSize = dataSet.shape[0]
        diffMat = tile(inX, (dataSetSize,1)) - dataSet
        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
        sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
        return sortedClassCount[0][0]


    5.显示结果

     


      


    6.代码下载










  • 相关阅读:
    OpenStack Trail 部署文档(二)基础服务部署
    OpenStack Trail 部署文档(一)环境规划
    OpenStack Trail 部署文档
    配置kubectl在Mac(本地)远程连接Kubernetes集群
    elasticsearch*3 + Es-Head + kibana Docker集群
    Flex 布局教程:语法篇
    PHP 数组 array_merge 和 数组 + 加号操作的区别
    Redis分布式锁
    Mysql中Exists和In的使用
    让PHP7达到最高性能的几个Tips
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4251335.html
Copyright © 2011-2022 走看看