博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【机器学习算法-python实现】KNN-k近邻算法的实现(附源代码)
阅读量:6614 次
发布时间:2019-06-24

本文共 1997 字,大约阅读时间需要 6 分钟。

(转载请注明出处:)

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 divisionfrom numpy import *import operatordef 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.代码下载

你可能感兴趣的文章
Centos7的安装及基本优化
查看>>
我的友情链接
查看>>
企业数据备份流程
查看>>
JNI之C++调用Java类
查看>>
vmware12
查看>>
thinkphp基础学习简单条件查询
查看>>
XenApp / XenDesktop 7.6 初体验六 Remote PC Access
查看>>
Django CSRF 简述
查看>>
翻编-JavaScript有关的10个怪癖和秘密
查看>>
Discuz!X论坛开发(五)二次开发 教你识别程序目录和文件列表for discuzx!1--NO.4
查看>>
Swift编写的一些完整的app
查看>>
[转]Apache与Tomcat的区别
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
JVM常用分析工具JPS/JINFO/JSTACK/JSTAT/JMAP详解
查看>>
FTP学习笔记
查看>>
基于heartbeat v1+ldirectord实现LVS集群高可用
查看>>
CSS控制文字,超出部分显示省略号
查看>>
[CSS] 用伪元素:after实现分割线和气泡
查看>>
我的友情链接
查看>>