KNN 算法


在模式识别领域中,最近邻居法(KNN算法,又译K-近邻算法)是一种用于分类和回归的非参数统计方法。在这两种情况下,输入包含特征空间中的k个最接近的训练样本。

本文记录 KNN 算法的学习,同时也是学习和熟悉 python 的过程。

导入包

from numpy import *
import operator

从文件中读取数据,将文本转换为矩阵,提取特征和类标

def file2matrix(fn):
    fr = open(fn)
    arrayLines = fr.readlines()
    numberOfLines = len(arrayLines)    #文件行数
    returnMat = zeros((numberOfLines, 3))    #行数*3的空矩阵
    classLabelVector = []
    index = 0
    for line in arrayLines:
        line = line.strip()    #strip()函数去掉参数中的字符,空参数则去掉空格
        listFromLine = line.split('\t')    #split()函数通过分隔符把 string 分段,返回一个 list
        returnMat[index, : ] = listFromLine[0:3]
        classLabelVector.append(listFromLine[-1])
        index += 1
    return returnMat, classLabelVector

看一下什么效果

testMat, testVector = file2matrix('datingTestSet.txt')
print 'testMat:'
print testMat
testMat:
[[  4.09200000e+04   8.32697600e+00   9.53952000e-01]
 [  1.44880000e+04   7.15346900e+00   1.67390400e+00]
 [  2.60520000e+04   1.44187100e+00   8.05124000e-01]
 ..., 
 [  2.65750000e+04   1.06501020e+01   8.66627000e-01]
 [  4.81110000e+04   9.13452800e+00   7.28045000e-01]
 [  4.37570000e+04   7.88260100e+00   1.33244600e+00]]

归一化数字特征值到0-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))    #tile()函数将 minVals 矩阵“重复”(m,1)次
    normDataSet = normDataSet/tile(ranges, (m, 1))
    return normDataSet, ranges, minVals

为了更好理解这个函数,我们试试每一步的输出

def autoNormTest(dataSet):
    minVals = dataSet.min(0)
    print 'minVals:'
    print minVals
    print '--------------------'
    maxVals = dataSet.max(0)
    print 'maxVals:'
    print maxVals
    print '--------------------'
    ranges = maxVals - minVals
    print 'ranges:'
    print ranges
    print '--------------------'
    normDataSet = zeros(shape(dataSet))
    print 'shape(dataSet):'
    print shape(dataSet)
    print '--------------------'
    print 'zeros(shape(dataSet)):'
    print normDataSet
    print '--------------------'
    m = dataSet.shape[0]
    print 'dataSet.shape[0]:'
    print m
    print '--------------------'
    normDataSet = dataSet - tile(minVals, (m, 1))
    print 'tile(minVals, (m, 1)):'
    print tile(minVals, (m, 1))
    print '--------------------'
    print 'dataSet - tile(minVals, (m, 1)):'
    print normDataSet
    print '--------------------'
    normDataSet = normDataSet/tile(ranges, (m, 1))
    print 'tile(ranges, (m, 1)):'
    print tile(ranges, (m, 1))
    print '--------------------'
    print 'normDataSet/tile(ranges, (m, 1)):'
    print normDataSet
    print '--------------------'
    return normDataSet, ranges, minVals

normDataSetTest, rangesTest, minValsTest = autoNormTest(testMat)
minVals:
[ 0.        0.        0.001156]
--------------------
maxVals:
[  9.12730000e+04   2.09193490e+01   1.69551700e+00]
--------------------
ranges:
[  9.12730000e+04   2.09193490e+01   1.69436100e+00]
--------------------
shape(dataSet):
(1000, 3)
--------------------
zeros(shape(dataSet)):
[[ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]
 ..., 
 [ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]]
--------------------
dataSet.shape[0]:
1000
--------------------
tile(minVals, (m, 1)):
[[ 0.        0.        0.001156]
 [ 0.        0.        0.001156]
 [ 0.        0.        0.001156]
 ..., 
 [ 0.        0.        0.001156]
 [ 0.        0.        0.001156]
 [ 0.        0.        0.001156]]
--------------------
dataSet - tile(minVals, (m, 1)):
[[  4.09200000e+04   8.32697600e+00   9.52796000e-01]
 [  1.44880000e+04   7.15346900e+00   1.67274800e+00]
 [  2.60520000e+04   1.44187100e+00   8.03968000e-01]
 ..., 
 [  2.65750000e+04   1.06501020e+01   8.65471000e-01]
 [  4.81110000e+04   9.13452800e+00   7.26889000e-01]
 [  4.37570000e+04   7.88260100e+00   1.33129000e+00]]
--------------------
tile(ranges, (m, 1)):
[[  9.12730000e+04   2.09193490e+01   1.69436100e+00]
 [  9.12730000e+04   2.09193490e+01   1.69436100e+00]
 [  9.12730000e+04   2.09193490e+01   1.69436100e+00]
 ..., 
 [  9.12730000e+04   2.09193490e+01   1.69436100e+00]
 [  9.12730000e+04   2.09193490e+01   1.69436100e+00]
 [  9.12730000e+04   2.09193490e+01   1.69436100e+00]]
--------------------
normDataSet/tile(ranges, (m, 1)):
[[ 0.44832535  0.39805139  0.56233353]
 [ 0.15873259  0.34195467  0.98724416]
 [ 0.28542943  0.06892523  0.47449629]
 ..., 
 [ 0.29115949  0.50910294  0.51079493]
 [ 0.52711097  0.43665451  0.4290048 ]
 [ 0.47940793  0.3768091   0.78571804]]
--------------------

现在再来看看之前的函数,打点注释:

def autoNorm(dataSet):    #输入是一个矩阵
    minVals = dataSet.min(0)    #min()函数输出矩阵中最小的行或列,参数为0输出行,为1输出列
    maxVals = dataSet.max(0)    #同上理
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))   #shape(dataSet) = (100,3),然后做一个(100,3)的空矩阵 
    m = dataSet.shape[0]    # m 是 dataSet 矩阵的行数
    normDataSet = dataSet - tile(minVals, (m, 1))    #tile()函数将 minVals 矩阵“重复”(m,1)次
    normDataSet = normDataSet/tile(ranges, (m, 1))
    return normDataSet, ranges, minVals

分类函数

def classify(sample, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]    #数据集的行数就是记录数
    '''计算距离'''
    diffMat = tile(sample, (dataSetSize,1)) - dataSet    #差值矩阵
    sqDiffMat = diffMat**2    #差值矩阵的平方
    sqDistances = sqDiffMat.sum(axis = 1)    #每一行项的和
    distances = sqDistances**0.5    #开方得到距离
    sortedDistIndicies = distances.argsort()    #整理索引
    '''选择距离最小的k个点'''
    classCount = {}
    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]

为了更好理解这个函数,我们试试每一步的输出

def classifyTest(sample, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]    #数据集的行数就是记录数
    print '记录总数:'
    print 'dataSet.shape[0]:'
    print dataSet.shape[0]
    print '--------------------'
    '''计算距离'''
    print '计算距离:'
    diffMat = tile(sample, (dataSetSize,1)) - dataSet    #差值矩阵
    print 'tile(sample, (dataSetSize,1)):'
    print tile(sample, (dataSetSize,1))
    print '--------------------'
    print 'diffMat:'
    print diffMat
    print '--------------------'
    sqDiffMat = diffMat**2    #差值矩阵的平方
    print 'sqDiffMat:'
    print sqDiffMat
    print '--------------------'
    sqDistances = sqDiffMat.sum(axis = 1)    #每一行项的和
    print 'sqDistances:'
    print sqDistances
    print '--------------------'
    distances = sqDistances**0.5    #开方得到距离
    print 'distances:'
    print distances
    print '--------------------'
    sortedDistIndicies = distances.argsort()    #整理索引
    print 'distances.argsort():'
    print distances.argsort()
    print '--------------------'
    print '--------------------'
    print '--------------------'
    '''选择距离最小的k个点'''
    print '选择距离最小的k个点:'
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        print '第%d近: '%(i+1)
        print 'voteIlabel:'
        print voteIlabel
        print '--------------------'
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
        print 'classCount.get(voteIlabel, 0)'
        print classCount.get(voteIlabel, 0)
        print '********************'
        
    '''从大到小排序'''
    print '从大到小排序:'
    print 'classCount:'
    print classCount
    sortedClassCount = sorted(classCount.items(), 
                              key = operator.itemgetter(1), 
                              reverse = True)
    print 'classCount.items():'
    print classCount.items()
    print 'sortedClassCount:'
    print sortedClassCount
    print '####################'
    return sortedClassCount[0][0]

'''测试用的数据:
矩阵: 3  5  7  5  4   标签: a
     4  6  2  9  0         b
     3  5  2  1  7         a
     3  6  7  3  1         a
     9  4  2  5  7         b
k 值取 3
sample 取 [4,6,3,1,5]
'''

mat = array(([3,5,7,5,4],
             [4,6,2,9,1],
             [3,5,2,1,7],
             [3,6,7,3,1],
             [8,4,2,5,7]), dtype = int)
lab = ['a','b','a','a','b']
k = 3
sam = [4,6,3,1,5]

classifyTest(sam, mat, lab, 3)
记录总数:
dataSet.shape[0]:
5
--------------------
计算距离:
tile(sample, (dataSetSize,1)):
[[4 6 3 1 5]
 [4 6 3 1 5]
 [4 6 3 1 5]
 [4 6 3 1 5]
 [4 6 3 1 5]]
--------------------
diffMat:
[[ 1  1 -4 -4  1]
 [ 0  0  1 -8  4]
 [ 1  1  1  0 -2]
 [ 1  0 -4 -2  4]
 [-4  2  1 -4 -2]]
--------------------
sqDiffMat:
[[ 1  1 16 16  1]
 [ 0  0  1 64 16]
 [ 1  1  1  0  4]
 [ 1  0 16  4 16]
 [16  4  1 16  4]]
--------------------
sqDistances:
[35 81  7 37 41]
--------------------
distances:
[ 5.91607978  9.          2.64575131  6.08276253  6.40312424]
--------------------
distances.argsort():
[2 0 3 4 1]
--------------------
--------------------
--------------------
选择距离最小的k个点:
第1近: 
voteIlabel:
a
--------------------
classCount.get(voteIlabel, 0)
1
********************
第2近: 
voteIlabel:
a
--------------------
classCount.get(voteIlabel, 0)
2
********************
第3近: 
voteIlabel:
a
--------------------
classCount.get(voteIlabel, 0)
3
********************
从大到小排序:
classCount:
{'a': 3}
classCount.items():
[('a', 3)]
sortedClassCount:
[('a', 3)]
####################





'a'

现在再来看看之前的函数,打点注释:

def classify(sample, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]    #数据集的行数就是记录数
    '''计算距离'''
    diffMat = tile(sample, (dataSetSize,1)) - dataSet    #差值矩阵
    sqDiffMat = diffMat**2    #差值矩阵的平方
    sqDistances = sqDiffMat.sum(axis = 1)    #每一行项的和
    distances = sqDistances**0.5    #开方得到距离
    sortedDistIndicies = distances.argsort()    #整理索引
    '''选择距离最小的k个点'''
    classCount = {}    #创建一个字典
    for i in range(k):    #k 就是 KNN 中的 K 值
        voteIlabel = labels[sortedDistIndicies[i]]    #选取第 i+1 近的点,对着 labels 查出他的label
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1    ##该 label 的计数 加一
    '''从大到小排序'''
    sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
                                                #将字典条目按照出现次数多少。从大到小排列
    return sortedClassCount[0][0]    #取出现次数最多的 label

针对约会网站的数据的测试代码

def datingClassTest():
    hoRatio = 0.20    #测试样例数据比例
    datingDataMat, datingLabels = file2matrix('datingTestSet.txt')
    normMat, ranges, minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    errCount = 0.0
    k = 4
    for i in range(numTestVecs):
        classifierResult = classify(normMat[i, : ], normMat[numTestVecs:m, : ], 
                                    datingLabels[numTestVecs:m], k)
        print("分类器返回: %s, 真实答案是: %s" %(classifierResult, datingLabels[i]))
        if(classifierResult != datingLabels[i]):
            errCount += 1.0
    print '--------------------'
    print("总错误率为: %f" %(errCount / float(numTestVecs)))

调用函数,进行测试

datingClassTest()
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: largeDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: didntLike
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: didntLike, 真实答案是: didntLike
分类器返回: smallDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: smallDoses, 真实答案是: smallDoses
分类器返回: largeDoses, 真实答案是: largeDoses
分类器返回: smallDoses, 真实答案是: smallDoses
--------------------
总错误率为: 0.060000

正确率为94%.