手撕《机器学习实战》2----KNN算法

最近是忙炸了
抽空学习下《机器学习实战》这本书里的K近邻算法,K近邻还有另一个名字,叫懒惰算法。因为它压根不用训练模型,直接上例子就可以去预测。训练过程=测试过程

原理:存在一个样本数据集,也称作训练样本集,并且样本中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据(最近邻)的分类标签。一般来说,我们只选择样本集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数,最后,选择k个最相似的数据中出现次数最多的分类,作为新数据的分类。

优点:精度高,对异常数据不敏感(你的类别是由邻居中的大多数决定的,一个异常邻居并不能影响太大),无数据输入假定;算法简单,容易理解,无复杂机器学习算法。

缺点:计算复杂度高(需要计算新的数据点与样本集中每个数据的“距离”,以判断是否是前k个邻居),空间复杂度高(巨大的矩阵)。

适用数据范围:数值型和标称型。

一、 先举个K-NN四行两列数据的小例子

二、 在约会网站上使用K近邻算法

#导入numpy库,operator
import numpy as np
import operator

#创建函数
def createDataSet():
    #四组二维特征
    group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    #四组特征的标签如下
    labels = ['A','A','B','B']
    return group,labels
    
def classify0(inx,group,labels,k):
    #训练数据集行数
    datasetSize = group.shape[0]
    #在行向量方向上重复inx共datasetSize次,在列向量方向上重复inx共1次
    diffMat = np.tile(inx,(datasetSize,1)) - group
    #二维特征相减去之后的平方
    sqDiffMat = diffMat**2
    #遍历所有行,相加
    sqDistances = sqDiffMat.sum(axis=1)
    #开方,计算出距离
    distances = sqDistances**0.5
    #返回distances的索引值,后续sortedDistIndicies[i]要用到
    sortedDistIndicies = distances.argsort()
    #定义一个记录类别次数的字典
    classCount={}
    for i in range(k):
        #遍历前k个,记录次数
        votellabel = labels[sortedDistIndicies[i]]
        classCount[votellabel]= classCount.get(votellabel,0)+1
    #key=operator.itemgetter(1)根据字典的值进行排序
    #key=operator.itemgetter(0)根据字典的键进行排序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #返回次数最多的类别,即所要分类的类别
    return sortedClassCount[0][0]
    

if __name__ == '__main__':
    #创建数据集
    group,labels = createDataSet()
    #测试集
    test=[0.5,1.1]
    test_class = classify0(test,group,labels,3)
    #打印分类结果
    print(test_class)
A

例子:在约会网站上使用K近邻算法

1. 读取文件中的数据

2. 归一化特征变量中的数据

3. K-NN分类器

4. 拿出所有数据集中10%的数据,用K-NN方法去分类

5. 通过约会网站的分类器,预测你是否喜欢某个人

# 1.读取文件中的数据
def file2matrix(filename):
    #打开文件
    fr = open(filename)
    #读取文件所有内容
    arrayOfLines = fr.readlines()
    #得到文件行数
    numberOfLines = len(arrayOfLines)
    #返回numpy矩阵,numberOfLines行,3列的零元素矩阵
    returnMat = np.zeros((numberOfLines,3))
    #返回分类的标签向量
    classLabelVector = []
    #行的索引值
    index = 0
    for line in arrayOfLines:
        #删除空白字符
        line = line.strip()
        #将字符串根据“\t”分隔符进行分开切
        listFromLine = line.split('\t')
        #将数据前三列提取出来,存放到returnMat的numpy矩阵中,也就是不含标签变量,只有特征变量。
        #一行一行的存储
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(listFromLine[-1])
        index += 1
    return returnMat,classLabelVector

returnMat,classLabelVector=file2matrix('datingTestSet.txt')      
print(returnMat)
print(classLabelVector)
print(returnMat.shape)

[[4.0920000e+04 8.3269760e+00 9.5395200e-01]
 [1.4488000e+04 7.1534690e+00 1.6739040e+00]
 [2.6052000e+04 1.4418710e+00 8.0512400e-01]
 ...
 [2.6575000e+04 1.0650102e+01 8.6662700e-01]
 [4.8111000e+04 9.1345280e+00 7.2804500e-01]
 [4.3757000e+04 7.8826010e+00 1.3324460e+00]]
['largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'largeDoses', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'largeDoses', 'smallDoses', 'didntLike', 'smallDoses', 'didntLike', 'didntLike', 'smallDoses', 'smallDoses', 'didntLike', 'didntLike', 'didntLike', 'largeDoses', 'didntLike', 'didntLike', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'largeDoses', 'largeDoses', 'didntLike', 'smallDoses', 'didntLike', 'smallDoses', 'largeDoses', 'didntLike', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'largeDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'smallDoses', 'didntLike', 'largeDoses', 'largeDoses', 'largeDoses']
(1000, 3)
# 2.归一化特征变量中的数据
#归一化公式为 :  newValue = (oldvalue-min)/(max-min)
def autoNorm(dataSet):
    #获得数据的最小值和最大值
    minVals=dataSet.min(0)
    maxVals=dataSet.max(0)
    #最大值和最小值的范围
    ranges = maxVals - minVals
    #创建numpy矩阵,里面全是零元素
    normDataSet = np.zeros(np.shape(dataSet))
    #返回dataSet的行数
    m = dataSet.shape[0]
    #原始值减去最小值
    normDataSet = dataSet - np.tile(minVals,(m,1))
    #除以最大和最小值的差,得到归一化的数据
    normDataSet = normDataSet/np.tile(ranges,(m,1))
    return normDataSet,ranges,minVals

normDataSet,ranges,minVals=autoNorm(returnMat)
print(normDataSet)
print(ranges)
print(minVals)

[[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]]
[9.1273000e+04 2.0919349e+01 1.6943610e+00]
[0.       0.       0.001156]
#3.K-NN分类器
def classify0(inx,normDataSet,classLabelVector,k):
    #训练数据集行数
    datasetSize =normDataSet.shape[0]
    #在行向量方向上重复inx共datasetSize次,在列向量方向上重复inx共1次
    diffMat = np.tile(inx,(datasetSize,1)) - normDataSet
    #二维特征相减去之后的平方
    sqDiffMat = diffMat**2
    #sum()所有元素相加,sum(0)列相加,sum(1)行相加
    sqDistances = sqDiffMat.sum(axis=1)
    #开方,计算出距离
    distances = sqDistances**0.5
    #返回distances中元素从小到大排序后的索引值。后续sortedDistIndicies[i]要用到
    sortedDistIndicies = distances.argsort()
    #定义一个记录类别次数的字典
    classCount={}
    for i in range(k):
        #遍历前k个,记录次数
        votellabel =classLabelVector[sortedDistIndicies[i]]
        classCount[votellabel]= classCount.get(votellabel,0)+1
    #key=operator.itemgetter(1)根据字典的值进行排序
    #key=operator.itemgetter(0)根据字典的键进行排序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #返回次数最多的类别,则所要分类的类别
    return sortedClassCount[0][0]


#4.拿出所有数据集中10%的数据,用K-NN方法去分类
def datingClassTest():
    #打开的文件名
    filename = "datingTestSet.txt"
    #将返回的特征矩阵和分类向量分别存储到returnMat,classLabelVector
    returnMat,classLabelVector= file2matrix(filename)
    #取所有数据的百分之十
    hoRatio = 0.10
    #数据归一化,返回归一化后的矩阵,数据范围,数据最小值
    normDataSet, ranges, minVals = autoNorm(returnMat)
    #获得normMat的行数
    m = normDataSet.shape[0]
    #百分之十的测试数据的个数
    numTestVecs = int(m * hoRatio)
    #分类错误计数
    errorCount = 0.0
    
    for i in range(numTestVecs):
        #前numTestVecs个数据作为测试集,后m-numTestVecs个数据作为训练集
        classifierResult = classify0(normDataSet[i,:], normDataSet[numTestVecs:m,:],classLabelVector[numTestVecs:m], 3)
       
        print(classifierResult, classLabelVector[i])
        if classifierResult != classLabelVector[i]:
            errorCount += 1.0
    print("错误率:%f" %(errorCount/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
largeDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
largeDoses largeDoses
smallDoses smallDoses
didntLike didntLike
largeDoses largeDoses
didntLike didntLike
largeDoses 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
largeDoses 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
largeDoses didntLike
错误率:0.050000

5. 通过约会网站的分类器,预测你是否喜欢某个人


def classifyPerson():
    
    #三维特征用户输入
    precentTats = float(input("玩视频游戏所耗时间百分比:"))
    ffMiles = float(input("每年获得的飞行常客里程数:"))
    iceCream = float(input("每周消费的冰激淋公升数:"))
    #打开的文件名
    filename = "datingTestSet.txt"
    #打开并处理数据
    returnMat,classLabelVector= file2matrix(filename)
    #取所有数据的百分之十
    hoRatio = 0.10
    #数据归一化,返回归一化后的矩阵,数据范围,数据最小值
    normDataSet, ranges, minVals = autoNorm(returnMat)
   
    #生成NumPy数组,测试集
    inArr = np.array([precentTats, ffMiles, iceCream])
    #测试集归一化
    norminArr = (inArr - minVals) / ranges
    #返回分类结果
    classifierResult = classify0(norminArr, normDataSet, classLabelVector, 3)
    #打印结果
    print("你可能%s这个人" % (classifierResult))

classifyPerson()
玩视频游戏所耗时间百分比:10
每年获得的飞行常客里程数:12
每周消费的冰激淋公升数:13
你可能smallDoses这个人

猜你喜欢

转载自blog.csdn.net/qq_41205464/article/details/84897250
今日推荐