kNN算法

import numpy as np
import operator
import os
def createDataset():
        group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
        lables=[‘A‘,‘A‘,‘B‘,‘B‘]
        return  group,lables

def classify0(inX,dataSet,labels,k):
        dataSetSize=dataSet.shape[0]
        diffMat=np.tile(inX,(dataSetSize,1))-dataSet
        sqDiffMat=diffMat**2
        sqDistances=sqDiffMat.sum(axis=1)
        distances=sqDistances**0.5
        sortDistancesIndex=distances.argsort()
        classCount={}#TODO  toOrder dectionary
        for i in range(k):
                voteIlabel=labels[sortDistancesIndex[i]]
                classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
        sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
        return sortedClassCount[0][0]
def filematrix(filename):
        fr=open(filename)
        arrayOfLines=fr.readlines()
        numberOfLines=len(arrayOfLines)
        returnMat=np.zeros((numberOfLines,3))
        classLableVector=[]
        index=0
        for line in arrayOfLines:
            line=line.strip()
            listFromLine=line.split(‘\t‘)
            returnMat[index,:]=listFromLine[0:3]
            classLableVector.append(int(listFromLine[-1]))
            index+=1
        return returnMat,classLableVector

def autoNorm(dataSet):
        minVals=dataSet.min(0)
        maxVals=dataSet.max(0)
        rangs=maxVals-minVals
        dtRow=dataSet.shape[0]
        normDataset=dataSet-np.tile(minVals,(dtRow,1))
        resultDataset=normDataset/np.tile(rangs,(dtRow,1))
        return resultDataset,rangs,minVals
def datingClassTest():
        hoRatio=0.10
        errorCount=0.0
        datingMat,datingLabels=filematrix(‘dts.txt‘);
        normMat,normRang,normMin=autoNorm(datingMat)
        dataRows=normMat.shape[0]
        testDataRows=int(dataRows*hoRatio)
        for i in range(testDataRows):
                classfileterResult=classfy0(normMat[i,:],normMat[testDataRows:dataRows,:],datingLabels[testDataRows:dataRows],3)
                print("这次分类结果是: %d,这个真实的结果为:%d"%(classfileterResult,datingLabels[i]))
                if(classfileterResult!= datingLabels[i]):errorCount+=1.0
                print("这次分类的总错误率为:%f"%(errorCount/float(testDataRows)))

def classifyPerson():
    resultList = [‘没有魅力‘, ‘魅力一般‘, ‘很有魅力‘]
    percentTats = float(input("每天所玩电子游戏的占比?"))
    ffMiles = float(input("每年的飞行里程数?"))
    iceCream = float(input("每周吃多少冰淇淋(升)?"))
    datingDataMat, datingLabels = filematrix(‘dts.txt‘)
    normMat, ranges, minVals = autoNorm(datingDataMat)
    inArr = np.array([ffMiles, percentTats, iceCream])
    classifierResult = classify0((inArr - minVals)/ranges, normMat, datingLabels,3)
    print (‘这个人让人感觉: ‘, resultList[classifierResult - 1])

# 2:手写识别系统
#将一个32*32的二进制图像矩阵转换成1*1024的向量

def img2vector(filename):
    returnVect = np.zeros((1,1024))
    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 = os.listdir(‘trainingDigits‘)   #获取目录内容
    m = len(trainingFileList)
    trainingMat = np.zeros((m, 1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]              #分割得到标签  从文件名解析得到分类数据
        fileStr = fileNameStr.split(‘.‘)[0]
        classStr = int(fileStr.split(‘_‘)[0])
        hwLabels.append(classStr)                 #测试样例标签
        trainingMat[i,:] = img2vector(‘trainingDigits/%s‘ % fileNameStr)
    testFileList = os.listdir(‘testDigits‘)
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split(‘.‘)[0]
        classStr = 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, classStr))
        if(classifierResult != classStr): errorCount += 1.0
    print ("\nthe total numbers of errors is : %d" % errorCount)
    print ("\nthe total error rate is: %f" % (errorCount/float(mTest)))
时间: 2024-10-13 16:05:55

kNN算法的相关文章

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

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

KNN算法--物以类聚,人以群分

KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归.如果K=1,那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产生的模型可以将新数据分到一个明确的类

Python KNN算法

机器学习新手,接触的是<机器学习实战>这本书,感觉书中描述简单易懂,但对于python语言不熟悉的我,也有很大的空间.今天学习的是k-近邻算法. 1. 简述机器学习 在日常生活中,人们很难直接从原始数据本身获得所需信息.而机器学习就是把生活中无序的数据转换成有用的信息.例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有多大的作用,然而当某几个特定单词同时出现时,再辅以考虑邮件的长度及其他因素,人们就可以更准确地判定该邮件是否为垃圾邮件. 机器学习分为监督学习和无监督学习,其中: (1)监督学

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但

k-Means和KNN算法简述

k-means 算法 k-means 算法接受输入量 k :然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类中的对象相似度较小.聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的. k-means 算法的工作过程说明如下:首先从n个数据对象任意选择 k 个对象作为初始聚类中心:而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类:然后再计算每个所获新聚类

KNN算法的感受 1

本来预计的打算是一天一个十大挖掘算法,然而由于同时要兼顾数据结构面试的事情,所以 很难办到,但至少在回家前要把数据挖掘十大算法看完,过个好年,在course上学习老吴的课程还是帮了我很大的忙,虽然浪费了时间,但是也无形中帮助我 很多,所以说还是很值得的,今天就总结KNN算法的一部分,这部分老吴的课程中没有太多涉及到,所以我又重新关注了一下,下面是我的总结,希望能对大家有 所帮组. 介绍环镜:python2.7  IDLE  Pycharm5.0.3 操作系统:windows 第一步:因为没有nu

MLlearning(1)——kNN算法

这篇文章讲kNN(k近邻,k-Nearest Neighbour).这是一种lazy-learning,实现方便,很常用的分类方法.约定n为样本集中的样本数,m为样本的维度,则这个算法的训练复杂度为0,未加优化(线性扫描)的分类时间复杂度为,kd-Tree优化后复杂度可降为. 思路.优点及缺陷 该方法的思路是:如果一个样本在特征空间中的 k 个最相似即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.kNN 算法中,所选择的邻居都是已经正确分类的对象.该方法在分类决策上只

KNN算法与Kd树

最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知样本的类别,以全部训练样本作为代表点,计算未知样本与所有训练样本的距离,并以最近邻者的类别作为决策未知样本类别的唯一依据.但是,最近邻算法明显是存在缺陷的,比如下面的例子:有一个未知形状(图中绿色的圆点),如何判断它是什么形状? 显然,最近邻算法的缺陷--对噪声数据过于敏感,为了解决这个问题,我们可

KNN算法的理解

一.算法 1.kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. 最简单平庸的分类器或许是那种死记硬背式的分类器,记住全部的训练数据.对于新的数据则直接和训练数据匹配,假设存在同样属性的训练数据,则直接用它的分类来作为新数据的分类.这样的方式有一个明显的缺点,那就是非常可能无法找到全然匹配的训练记录. kNN算法则是从训练集中找到和新数据最接近的k条记录.然后依据他们的主要分类来决定新数据的类别.该算法涉及3个主要因素:训练集.距离或相似的衡量

KNN算法理解

一.算法概述 1.kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. 最简单平庸的分类器或许是那种死记硬背式的分类器,记住全部的训练数据,对于新的数据则直接和训练数据匹配,假设存在同样属性的训练数据,则直接用它的分类来作为新数据的分类.这样的方式有一个明显的缺点,那就是非常可能无法找到全然匹配的训练记录. kNN算法则是从训练集中找到和新数据最接近的k条记录,然后依据他们的主要分类来决定新数据的类别.该算法涉及3个主要因素:训练集.距离或相似的