欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

KNN邻近算法约会网站实例

程序员文章站 2024-01-25 22:06:52
...

案例:DataNet使用KNN

(1)收集数据:提供文本文件。
(2)准备数据: python解析文本文件。
(3)分析数据:使用Matplotlib化画二维扩散图。
(4)训练算法:此步驟不适用于K-近邻算法。
(5)测试算法:使用提供的部分数据作为测试样本。测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类
与实际类别不同,则标记为一个错误。
(6)使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否 为自己喜欢的类型

KNN邻进算法原理

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

标准化文本数据

原TXT数据:
飞行里程 玩游戏时间比 消费冰淇淋数
40920 8.326976 0.953952 largeDoses
14488 7.153469 1.673904 smallDoses
26052 1.441871 0.805124 didntLike
75136 13.147394 0.428964 didntLike
38344 1.669788 0.134296 didntLike
72993 10.141740 1.032955 didntLike
35948 6.830792 1.213192 largeDoses
42666 13.276369 0.543880 largeDoses
67497 8.631577 0.749278 didntLike
35483 12.273169 1.508053 largeDoses

from numpy import *
import operator
from os import listdir
def file2matrix(filename):
    fr = open(filename,encoding = 'utf-8')
    numberOfLines = len(fr.readlines())         #得到文件行数
    returnMat = zeros((numberOfLines,3))        #得到返回数据
    classLabelVector = []                       #得到标签 
    fr = open(filename,encoding = 'utf-8')
    index = 0
    for line in fr.readlines():
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index,:] = listFromLine[0:3]
        classLabelVector.append(listFromLine[-1]))
        index += 1
    return returnMat,classLabelVector
datingDataMat,datingLabels = file2matrix('datingTestSet.txt')
for label in range(len(datingLabels)):
    if(datingLabels[label] =='didntLike'):
        datingLabels[label] =1
    elif(datingLabels[label] =='smallDoses'):
        datingLabels[label] =2
    elif(datingLabels[label] =='largeDoses'):
        datingLabels[label] =3

使用Matplotlib创建散点图

import matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()

KNN邻近算法约会网站实例

利用datingLabels存储的类标签属性,在散点图上绘制了色彩不等、尺寸不同的点。因而基本上可以从图中看到数据点所属三个样本分类的区域轮廓


from matplotlib.font_manager import FontProperties  
import matplotlib.pyplot as plt  
font = FontProperties(fname=r"D:\PyCharmProject\font\simsun.ttc", size=12) #动态修改matplotlib的字体

fig = plt.figure()

plt.figure(figsize=(8, 5), dpi=80)
ax = plt.subplot(111)

datingLabels = array(datingLabels)
idx_1 = where(datingLabels==1)
p1 = ax.scatter(datingDataMat[idx_1,0],datingDataMat[idx_1,1],marker = '*',color = 'r',label='1',s=10)
idx_2 = where(datingLabels==2)
p2 = ax.scatter(datingDataMat[idx_2,0],datingDataMat[idx_2,1],marker = 'o',color ='g',label='2',s=20)
idx_3 = where(datingLabels==3)
p3 = ax.scatter(datingDataMat[idx_3,0],datingDataMat[idx_3,1],marker = '+',color ='b',label='3',s=30)

plt.xlabel(u'每年获取的飞行里程数',fontproperties=font)
plt.ylabel(u'玩视频游戏所消耗的事件百分比',fontproperties=font)
ax.legend((p1, p2, p3), ('不喜欢', '魅力一般', '极具魅力'), loc=2,prop = font)
plt.show()
<Figure size 432x288 with 0 Axes>

KNN邻近算法约会网站实例

准备数据:归一化数值

在特征权重相同的情况下,数字差值最大的属性对计算结果影响最大。解决方法为经数据值归一化,将取值范围处理为0到1或者-1到1之间。
公式:
转换到[0,1]区间 NewValue = (oldValue - min)/(max-min)

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))
    normDataSet = normDataSet/tile(ranges, (m,1))   #element wise divide
    return normDataSet, ranges, minVals
   
normMat,ranges,minVals = autoNorm(datingDataMat)
normMat
array([[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]])
ranges
array([9.1273000e+04, 2.0919349e+01, 1.6943610e+00])
minVals
array([0.      , 0.      , 0.001156])

构造分类器

def classify0(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.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]
def datingClassTest():
    hoRatio = 0.50      #hold out 10%
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')#规整化测试集
    for lab in range(len(datingLabels)):
        datingLabels[lab]  = int(datingLabels[lab])
        
    
    normMat, ranges, minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    errorCount = 0.0
    for i in range(numTestVecs):
        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
        print("样本序号:%d,分类器返回值: %d,正确值: %d" % (i,classifierResult, datingLabels[i]))
        if (classifierResult != datingLabels[i]): errorCount += 1.0
    print("错误率: %f%%" % (errorCount/float(numTestVecs)))
    print(errorCount)
datingClassTest()
样本序号:0,分类器返回值: 3,正确值: 3
样本序号:1,分类器返回值: 2,正确值: 2
样本序号:2,分类器返回值: 1,正确值: 1
样本序号:3,分类器返回值: 1,正确值: 1
样本序号:4,分类器返回值: 1,正确值: 1
样本序号:5,分类器返回值: 1,正确值: 1
样本序号:6,分类器返回值: 3,正确值: 3
样本序号:7,分类器返回值: 3,正确值: 3
样本序号:8,分类器返回值: 1,正确值: 1
样本序号:9,分类器返回值: 3,正确值: 3
样本序号:10,分类器返回值: 1,正确值: 1
样本序号:11,分类器返回值: 1,正确值: 1
样本序号:12,分类器返回值: 2,正确值: 2
样本序号:13,分类器返回值: 1,正确值: 1
样本序号:14,分类器返回值: 1,正确值: 1
样本序号:15,分类器返回值: 1,正确值: 1
样本序号:16,分类器返回值: 1,正确值: 1
样本序号:17,分类器返回值: 1,正确值: 1
样本序号:18,分类器返回值: 2,正确值: 2
样本序号:19,分类器返回值: 3,正确值: 3
样本序号:20,分类器返回值: 2,正确值: 2
样本序号:21,分类器返回值: 1,正确值: 1
样本序号:22,分类器返回值: 1,正确值: 2
样本序号:23,分类器返回值: 3,正确值: 3
样本序号:24,分类器返回值: 2,正确值: 2
样本序号:25,分类器返回值: 3,正确值: 3
样本序号:26,分类器返回值: 2,正确值: 2
样本序号:27,分类器返回值: 3,正确值: 3
样本序号:28,分类器返回值: 2,正确值: 2
样本序号:29,分类器返回值: 1,正确值: 1
样本序号:30,分类器返回值: 3,正确值: 3
样本序号:31,分类器返回值: 1,正确值: 1
样本序号:32,分类器返回值: 2,正确值: 3
样本序号:33,分类器返回值: 1,正确值: 1
样本序号:34,分类器返回值: 3,正确值: 2
样本序号:35,分类器返回值: 1,正确值: 1
样本序号:36,分类器返回值: 1,正确值: 1
样本序号:37,分类器返回值: 2,正确值: 2
样本序号:38,分类器返回值: 3,正确值: 3
样本序号:39,分类器返回值: 3,正确值: 3
样本序号:40,分类器返回值: 1,正确值: 1
样本序号:41,分类器返回值: 2,正确值: 2
样本序号:42,分类器返回值: 3,正确值: 3
样本序号:43,分类器返回值: 3,正确值: 3
样本序号:44,分类器返回值: 3,正确值: 3
样本序号:45,分类器返回值: 1,正确值: 1
样本序号:46,分类器返回值: 1,正确值: 1
样本序号:47,分类器返回值: 1,正确值: 1
样本序号:48,分类器返回值: 1,正确值: 1
样本序号:49,分类器返回值: 2,正确值: 2
样本序号:50,分类器返回值: 2,正确值: 2
样本序号:51,分类器返回值: 1,正确值: 1
样本序号:52,分类器返回值: 3,正确值: 3
样本序号:53,分类器返回值: 2,正确值: 2
样本序号:54,分类器返回值: 2,正确值: 2
样本序号:55,分类器返回值: 2,正确值: 2
样本序号:56,分类器返回值: 2,正确值: 2
样本序号:57,分类器返回值: 3,正确值: 3
样本序号:58,分类器返回值: 1,正确值: 1
样本序号:59,分类器返回值: 2,正确值: 2
样本序号:60,分类器返回值: 1,正确值: 1
样本序号:61,分类器返回值: 2,正确值: 2
样本序号:62,分类器返回值: 2,正确值: 2
样本序号:63,分类器返回值: 2,正确值: 2
样本序号:64,分类器返回值: 2,正确值: 2
样本序号:65,分类器返回值: 2,正确值: 2
样本序号:66,分类器返回值: 3,正确值: 3
样本序号:67,分类器返回值: 2,正确值: 2
样本序号:68,分类器返回值: 3,正确值: 3
样本序号:69,分类器返回值: 1,正确值: 1
样本序号:70,分类器返回值: 2,正确值: 2
样本序号:71,分类器返回值: 3,正确值: 3
样本序号:72,分类器返回值: 2,正确值: 2
样本序号:73,分类器返回值: 2,正确值: 2
样本序号:74,分类器返回值: 3,正确值: 1
样本序号:75,分类器返回值: 3,正确值: 3
样本序号:76,分类器返回值: 1,正确值: 1
样本序号:77,分类器返回值: 1,正确值: 1
样本序号:78,分类器返回值: 3,正确值: 3
样本序号:79,分类器返回值: 3,正确值: 3
样本序号:80,分类器返回值: 1,正确值: 1
样本序号:81,分类器返回值: 2,正确值: 2
样本序号:82,分类器返回值: 3,正确值: 3
样本序号:83,分类器返回值: 1,正确值: 1
样本序号:84,分类器返回值: 3,正确值: 3
样本序号:85,分类器返回值: 1,正确值: 1
样本序号:86,分类器返回值: 2,正确值: 2
样本序号:87,分类器返回值: 2,正确值: 2
样本序号:88,分类器返回值: 1,正确值: 1
样本序号:89,分类器返回值: 1,正确值: 1
样本序号:90,分类器返回值: 3,正确值: 3
样本序号:91,分类器返回值: 2,正确值: 3
样本序号:92,分类器返回值: 1,正确值: 1
样本序号:93,分类器返回值: 2,正确值: 2
样本序号:94,分类器返回值: 1,正确值: 1
样本序号:95,分类器返回值: 3,正确值: 3
样本序号:96,分类器返回值: 3,正确值: 3
样本序号:97,分类器返回值: 3,正确值: 2
样本序号:98,分类器返回值: 2,正确值: 1
样本序号:99,分类器返回值: 1,正确值: 1
样本序号:100,分类器返回值: 3,正确值: 3
样本序号:101,分类器返回值: 2,正确值: 1
样本序号:102,分类器返回值: 2,正确值: 2
样本序号:103,分类器返回值: 3,正确值: 3
样本序号:104,分类器返回值: 3,正确值: 3
样本序号:105,分类器返回值: 2,正确值: 2
样本序号:106,分类器返回值: 3,正确值: 3
样本序号:107,分类器返回值: 3,正确值: 3
样本序号:108,分类器返回值: 1,正确值: 1
样本序号:109,分类器返回值: 2,正确值: 2
样本序号:110,分类器返回值: 2,正确值: 3
样本序号:111,分类器返回值: 2,正确值: 2
样本序号:112,分类器返回值: 1,正确值: 1
样本序号:113,分类器返回值: 3,正确值: 3
样本序号:114,分类器返回值: 1,正确值: 1
样本序号:115,分类器返回值: 2,正确值: 2
样本序号:116,分类器返回值: 1,正确值: 1
样本序号:117,分类器返回值: 2,正确值: 1
样本序号:118,分类器返回值: 2,正确值: 2
样本序号:119,分类器返回值: 3,正确值: 3
样本序号:120,分类器返回值: 2,正确值: 2
样本序号:121,分类器返回值: 3,正确值: 3
样本序号:122,分类器返回值: 2,正确值: 2
样本序号:123,分类器返回值: 3,正确值: 3
样本序号:124,分类器返回值: 2,正确值: 2
样本序号:125,分类器返回值: 1,正确值: 1
样本序号:126,分类器返回值: 3,正确值: 3
样本序号:127,分类器返回值: 3,正确值: 3
样本序号:128,分类器返回值: 3,正确值: 3
样本序号:129,分类器返回值: 1,正确值: 1
样本序号:130,分类器返回值: 3,正确值: 3
样本序号:131,分类器返回值: 2,正确值: 2
样本序号:132,分类器返回值: 2,正确值: 2
样本序号:133,分类器返回值: 3,正确值: 3
样本序号:134,分类器返回值: 1,正确值: 1
样本序号:135,分类器返回值: 3,正确值: 3
样本序号:136,分类器返回值: 3,正确值: 3
样本序号:137,分类器返回值: 3,正确值: 3
样本序号:138,分类器返回值: 1,正确值: 1
样本序号:139,分类器返回值: 3,正确值: 3
样本序号:140,分类器返回值: 1,正确值: 1
样本序号:141,分类器返回值: 1,正确值: 1
样本序号:142,分类器返回值: 3,正确值: 3
样本序号:143,分类器返回值: 3,正确值: 3
样本序号:144,分类器返回值: 2,正确值: 2
样本序号:145,分类器返回值: 3,正确值: 3
样本序号:146,分类器返回值: 3,正确值: 3
样本序号:147,分类器返回值: 1,正确值: 1
样本序号:148,分类器返回值: 2,正确值: 2
样本序号:149,分类器返回值: 3,正确值: 3
样本序号:150,分类器返回值: 2,正确值: 2
样本序号:151,分类器返回值: 2,正确值: 2
样本序号:152,分类器返回值: 3,正确值: 3
样本序号:153,分类器返回值: 3,正确值: 3
样本序号:154,分类器返回值: 3,正确值: 3
样本序号:155,分类器返回值: 1,正确值: 1
样本序号:156,分类器返回值: 2,正确值: 2
样本序号:157,分类器返回值: 2,正确值: 2
样本序号:158,分类器返回值: 1,正确值: 1
样本序号:159,分类器返回值: 1,正确值: 1
样本序号:160,分类器返回值: 3,正确值: 3
样本序号:161,分类器返回值: 2,正确值: 2
样本序号:162,分类器返回值: 2,正确值: 3
样本序号:163,分类器返回值: 3,正确值: 3
样本序号:164,分类器返回值: 1,正确值: 1
样本序号:165,分类器返回值: 2,正确值: 2
样本序号:166,分类器返回值: 1,正确值: 1
样本序号:167,分类器返回值: 3,正确值: 3
样本序号:168,分类器返回值: 1,正确值: 1
样本序号:169,分类器返回值: 2,正确值: 2
样本序号:170,分类器返回值: 3,正确值: 3
样本序号:171,分类器返回值: 2,正确值: 2
样本序号:172,分类器返回值: 3,正确值: 3
样本序号:173,分类器返回值: 1,正确值: 1
样本序号:174,分类器返回值: 3,正确值: 1
样本序号:175,分类器返回值: 3,正确值: 1
样本序号:176,分类器返回值: 3,正确值: 3
样本序号:177,分类器返回值: 2,正确值: 2
样本序号:178,分类器返回值: 3,正确值: 3
样本序号:179,分类器返回值: 1,正确值: 1
样本序号:180,分类器返回值: 3,正确值: 3
样本序号:181,分类器返回值: 2,正确值: 2
样本序号:182,分类器返回值: 3,正确值: 1
样本序号:183,分类器返回值: 3,正确值: 3
样本序号:184,分类器返回值: 2,正确值: 2
样本序号:185,分类器返回值: 2,正确值: 2
样本序号:186,分类器返回值: 3,正确值: 3
样本序号:187,分类器返回值: 2,正确值: 2
样本序号:188,分类器返回值: 3,正确值: 3
样本序号:189,分类器返回值: 2,正确值: 2
样本序号:190,分类器返回值: 1,正确值: 1
样本序号:191,分类器返回值: 2,正确值: 1
样本序号:192,分类器返回值: 3,正确值: 3
样本序号:193,分类器返回值: 1,正确值: 1
样本序号:194,分类器返回值: 2,正确值: 3
样本序号:195,分类器返回值: 2,正确值: 2
样本序号:196,分类器返回值: 2,正确值: 2
样本序号:197,分类器返回值: 2,正确值: 2
样本序号:198,分类器返回值: 3,正确值: 3
样本序号:199,分类器返回值: 2,正确值: 2
样本序号:200,分类器返回值: 2,正确值: 2
样本序号:201,分类器返回值: 1,正确值: 1
样本序号:202,分类器返回值: 2,正确值: 2
样本序号:203,分类器返回值: 2,正确值: 2
样本序号:204,分类器返回值: 3,正确值: 3
样本序号:205,分类器返回值: 1,正确值: 1
样本序号:206,分类器返回值: 3,正确值: 3
样本序号:207,分类器返回值: 3,正确值: 3
样本序号:208,分类器返回值: 2,正确值: 2
样本序号:209,分类器返回值: 1,正确值: 1
样本序号:210,分类器返回值: 1,正确值: 1
样本序号:211,分类器返回值: 1,正确值: 1
样本序号:212,分类器返回值: 2,正确值: 2
样本序号:213,分类器返回值: 1,正确值: 1
样本序号:214,分类器返回值: 3,正确值: 3
样本序号:215,分类器返回值: 3,正确值: 3
样本序号:216,分类器返回值: 3,正确值: 3
样本序号:217,分类器返回值: 3,正确值: 3
样本序号:218,分类器返回值: 2,正确值: 2
样本序号:219,分类器返回值: 1,正确值: 1
样本序号:220,分类器返回值: 1,正确值: 1
样本序号:221,分类器返回值: 1,正确值: 1
样本序号:222,分类器返回值: 2,正确值: 2
样本序号:223,分类器返回值: 3,正确值: 3
样本序号:224,分类器返回值: 2,正确值: 2
样本序号:225,分类器返回值: 1,正确值: 1
样本序号:226,分类器返回值: 3,正确值: 3
样本序号:227,分类器返回值: 1,正确值: 1
样本序号:228,分类器返回值: 3,正确值: 3
样本序号:229,分类器返回值: 2,正确值: 2
样本序号:230,分类器返回值: 2,正确值: 2
样本序号:231,分类器返回值: 2,正确值: 3
样本序号:232,分类器返回值: 1,正确值: 1
样本序号:233,分类器返回值: 3,正确值: 3
样本序号:234,分类器返回值: 1,正确值: 1
样本序号:235,分类器返回值: 1,正确值: 1
样本序号:236,分类器返回值: 2,正确值: 2
样本序号:237,分类器返回值: 1,正确值: 1
样本序号:238,分类器返回值: 2,正确值: 2
样本序号:239,分类器返回值: 2,正确值: 2
样本序号:240,分类器返回值: 1,正确值: 1
样本序号:241,分类器返回值: 3,正确值: 3
样本序号:242,分类器返回值: 1,正确值: 1
样本序号:243,分类器返回值: 3,正确值: 3
样本序号:244,分类器返回值: 3,正确值: 2
样本序号:245,分类器返回值: 3,正确值: 3
样本序号:246,分类器返回值: 1,正确值: 1
样本序号:247,分类器返回值: 2,正确值: 2
样本序号:248,分类器返回值: 3,正确值: 3
样本序号:249,分类器返回值: 1,正确值: 1
样本序号:250,分类器返回值: 1,正确值: 1
样本序号:251,分类器返回值: 1,正确值: 1
样本序号:252,分类器返回值: 1,正确值: 1
样本序号:253,分类器返回值: 2,正确值: 2
样本序号:254,分类器返回值: 3,正确值: 3
样本序号:255,分类器返回值: 2,正确值: 2
样本序号:256,分类器返回值: 2,正确值: 2
样本序号:257,分类器返回值: 3,正确值: 3
样本序号:258,分类器返回值: 1,正确值: 1
样本序号:259,分类器返回值: 2,正确值: 2
样本序号:260,分类器返回值: 1,正确值: 1
样本序号:261,分类器返回值: 1,正确值: 1
样本序号:262,分类器返回值: 1,正确值: 1
样本序号:263,分类器返回值: 3,正确值: 3
样本序号:264,分类器返回值: 3,正确值: 3
样本序号:265,分类器返回值: 2,正确值: 2
样本序号:266,分类器返回值: 3,正确值: 1
样本序号:267,分类器返回值: 1,正确值: 1
样本序号:268,分类器返回值: 1,正确值: 1
样本序号:269,分类器返回值: 2,正确值: 2
样本序号:270,分类器返回值: 2,正确值: 2
样本序号:271,分类器返回值: 3,正确值: 3
样本序号:272,分类器返回值: 1,正确值: 1
样本序号:273,分类器返回值: 1,正确值: 1
样本序号:274,分类器返回值: 1,正确值: 1
样本序号:275,分类器返回值: 2,正确值: 2
样本序号:276,分类器返回值: 1,正确值: 1
样本序号:277,分类器返回值: 1,正确值: 1
样本序号:278,分类器返回值: 2,正确值: 2
样本序号:279,分类器返回值: 1,正确值: 1
样本序号:280,分类器返回值: 3,正确值: 1
样本序号:281,分类器返回值: 1,正确值: 1
样本序号:282,分类器返回值: 2,正确值: 2
样本序号:283,分类器返回值: 2,正确值: 2
样本序号:284,分类器返回值: 3,正确值: 3
样本序号:285,分类器返回值: 3,正确值: 2
样本序号:286,分类器返回值: 3,正确值: 3
样本序号:287,分类器返回值: 2,正确值: 3
样本序号:288,分类器返回值: 3,正确值: 3
样本序号:289,分类器返回值: 3,正确值: 3
样本序号:290,分类器返回值: 1,正确值: 1
样本序号:291,分类器返回值: 2,正确值: 2
样本序号:292,分类器返回值: 3,正确值: 3
样本序号:293,分类器返回值: 2,正确值: 1
样本序号:294,分类器返回值: 1,正确值: 1
样本序号:295,分类器返回值: 1,正确值: 1
样本序号:296,分类器返回值: 3,正确值: 3
样本序号:297,分类器返回值: 1,正确值: 1
样本序号:298,分类器返回值: 3,正确值: 3
样本序号:299,分类器返回值: 2,正确值: 2
样本序号:300,分类器返回值: 2,正确值: 2
样本序号:301,分类器返回值: 1,正确值: 1
样本序号:302,分类器返回值: 3,正确值: 3
样本序号:303,分类器返回值: 1,正确值: 1
样本序号:304,分类器返回值: 3,正确值: 3
样本序号:305,分类器返回值: 1,正确值: 2
样本序号:306,分类器返回值: 2,正确值: 2
样本序号:307,分类器返回值: 1,正确值: 1
样本序号:308,分类器返回值: 2,正确值: 2
样本序号:309,分类器返回值: 2,正确值: 2
样本序号:310,分类器返回值: 3,正确值: 3
样本序号:311,分类器返回值: 1,正确值: 1
样本序号:312,分类器返回值: 3,正确值: 3
样本序号:313,分类器返回值: 2,正确值: 2
样本序号:314,分类器返回值: 1,正确值: 1
样本序号:315,分类器返回值: 1,正确值: 1
样本序号:316,分类器返回值: 3,正确值: 3
样本序号:317,分类器返回值: 3,正确值: 3
样本序号:318,分类器返回值: 2,正确值: 2
样本序号:319,分类器返回值: 1,正确值: 3
样本序号:320,分类器返回值: 3,正确值: 3
样本序号:321,分类器返回值: 2,正确值: 2
样本序号:322,分类器返回值: 3,正确值: 3
样本序号:323,分类器返回值: 1,正确值: 1
样本序号:324,分类器返回值: 3,正确值: 3
样本序号:325,分类器返回值: 1,正确值: 1
样本序号:326,分类器返回值: 3,正确值: 3
样本序号:327,分类器返回值: 3,正确值: 3
样本序号:328,分类器返回值: 1,正确值: 1
样本序号:329,分类器返回值: 3,正确值: 3
样本序号:330,分类器返回值: 2,正确值: 2
样本序号:331,分类器返回值: 1,正确值: 1
样本序号:332,分类器返回值: 3,正确值: 3
样本序号:333,分类器返回值: 1,正确值: 1
样本序号:334,分类器返回值: 3,正确值: 3
样本序号:335,分类器返回值: 2,正确值: 2
样本序号:336,分类器返回值: 1,正确值: 1
样本序号:337,分类器返回值: 2,正确值: 2
样本序号:338,分类器返回值: 2,正确值: 2
样本序号:339,分类器返回值: 1,正确值: 1
样本序号:340,分类器返回值: 3,正确值: 3
样本序号:341,分类器返回值: 1,正确值: 1
样本序号:342,分类器返回值: 1,正确值: 1
样本序号:343,分类器返回值: 3,正确值: 3
样本序号:344,分类器返回值: 3,正确值: 3
样本序号:345,分类器返回值: 2,正确值: 2
样本序号:346,分类器返回值: 2,正确值: 2
样本序号:347,分类器返回值: 3,正确值: 3
样本序号:348,分类器返回值: 1,正确值: 1
样本序号:349,分类器返回值: 2,正确值: 2
样本序号:350,分类器返回值: 3,正确值: 3
样本序号:351,分类器返回值: 3,正确值: 3
样本序号:352,分类器返回值: 2,正确值: 2
样本序号:353,分类器返回值: 2,正确值: 2
样本序号:354,分类器返回值: 1,正确值: 1
样本序号:355,分类器返回值: 1,正确值: 1
样本序号:356,分类器返回值: 1,正确值: 1
样本序号:357,分类器返回值: 1,正确值: 1
样本序号:358,分类器返回值: 3,正确值: 3
样本序号:359,分类器返回值: 2,正确值: 2
样本序号:360,分类器返回值: 1,正确值: 1
样本序号:361,分类器返回值: 1,正确值: 1
样本序号:362,分类器返回值: 3,正确值: 3
样本序号:363,分类器返回值: 2,正确值: 2
样本序号:364,分类器返回值: 1,正确值: 1
样本序号:365,分类器返回值: 3,正确值: 1
样本序号:366,分类器返回值: 3,正确值: 3
样本序号:367,分类器返回值: 3,正确值: 3
样本序号:368,分类器返回值: 3,正确值: 3
样本序号:369,分类器返回值: 2,正确值: 2
样本序号:370,分类器返回值: 1,正确值: 3
样本序号:371,分类器返回值: 2,正确值: 2
样本序号:372,分类器返回值: 1,正确值: 1
样本序号:373,分类器返回值: 1,正确值: 1
样本序号:374,分类器返回值: 1,正确值: 1
样本序号:375,分类器返回值: 1,正确值: 1
样本序号:376,分类器返回值: 3,正确值: 1
样本序号:377,分类器返回值: 3,正确值: 3
样本序号:378,分类器返回值: 2,正确值: 2
样本序号:379,分类器返回值: 2,正确值: 2
样本序号:380,分类器返回值: 1,正确值: 1
样本序号:381,分类器返回值: 2,正确值: 2
样本序号:382,分类器返回值: 1,正确值: 1
样本序号:383,分类器返回值: 3,正确值: 3
样本序号:384,分类器返回值: 2,正确值: 2
样本序号:385,分类器返回值: 1,正确值: 1
样本序号:386,分类器返回值: 3,正确值: 3
样本序号:387,分类器返回值: 2,正确值: 2
样本序号:388,分类器返回值: 1,正确值: 1
样本序号:389,分类器返回值: 3,正确值: 3
样本序号:390,分类器返回值: 1,正确值: 1
样本序号:391,分类器返回值: 1,正确值: 1
样本序号:392,分类器返回值: 1,正确值: 3
样本序号:393,分类器返回值: 3,正确值: 3
样本序号:394,分类器返回值: 3,正确值: 3
样本序号:395,分类器返回值: 3,正确值: 3
样本序号:396,分类器返回值: 2,正确值: 2
样本序号:397,分类器返回值: 1,正确值: 1
样本序号:398,分类器返回值: 1,正确值: 1
样本序号:399,分类器返回值: 2,正确值: 2
样本序号:400,分类器返回值: 1,正确值: 1
样本序号:401,分类器返回值: 3,正确值: 3
样本序号:402,分类器返回值: 3,正确值: 3
样本序号:403,分类器返回值: 2,正确值: 2
样本序号:404,分类器返回值: 1,正确值: 1
样本序号:405,分类器返回值: 2,正确值: 2
样本序号:406,分类器返回值: 3,正确值: 3
样本序号:407,分类器返回值: 2,正确值: 2
样本序号:408,分类器返回值: 1,正确值: 1
样本序号:409,分类器返回值: 2,正确值: 2
样本序号:410,分类器返回值: 2,正确值: 2
样本序号:411,分类器返回值: 2,正确值: 2
样本序号:412,分类器返回值: 1,正确值: 1
样本序号:413,分类器返回值: 1,正确值: 1
样本序号:414,分类器返回值: 3,正确值: 3
样本序号:415,分类器返回值: 1,正确值: 1
样本序号:416,分类器返回值: 1,正确值: 1
样本序号:417,分类器返回值: 2,正确值: 2
样本序号:418,分类器返回值: 3,正确值: 3
样本序号:419,分类器返回值: 1,正确值: 1
样本序号:420,分类器返回值: 1,正确值: 1
样本序号:421,分类器返回值: 2,正确值: 2
样本序号:422,分类器返回值: 3,正确值: 3
样本序号:423,分类器返回值: 1,正确值: 1
样本序号:424,分类器返回值: 3,正确值: 3
样本序号:425,分类器返回值: 1,正确值: 1
样本序号:426,分类器返回值: 1,正确值: 1
样本序号:427,分类器返回值: 2,正确值: 2
样本序号:428,分类器返回值: 2,正确值: 2
样本序号:429,分类器返回值: 1,正确值: 1
样本序号:430,分类器返回值: 2,正确值: 2
样本序号:431,分类器返回值: 2,正确值: 2
样本序号:432,分类器返回值: 2,正确值: 2
样本序号:433,分类器返回值: 3,正确值: 3
样本序号:434,分类器返回值: 1,正确值: 1
样本序号:435,分类器返回值: 1,正确值: 1
样本序号:436,分类器返回值: 1,正确值: 1
样本序号:437,分类器返回值: 3,正确值: 3
样本序号:438,分类器返回值: 1,正确值: 1
样本序号:439,分类器返回值: 3,正确值: 3
样本序号:440,分类器返回值: 1,正确值: 1
样本序号:441,分类器返回值: 3,正确值: 3
样本序号:442,分类器返回值: 3,正确值: 3
样本序号:443,分类器返回值: 1,正确值: 1
样本序号:444,分类器返回值: 1,正确值: 1
样本序号:445,分类器返回值: 1,正确值: 1
样本序号:446,分类器返回值: 3,正确值: 3
样本序号:447,分类器返回值: 2,正确值: 2
样本序号:448,分类器返回值: 3,正确值: 3
样本序号:449,分类器返回值: 3,正确值: 3
样本序号:450,分类器返回值: 2,正确值: 2
样本序号:451,分类器返回值: 2,正确值: 2
样本序号:452,分类器返回值: 1,正确值: 1
样本序号:453,分类器返回值: 1,正确值: 1
样本序号:454,分类器返回值: 1,正确值: 1
样本序号:455,分类器返回值: 2,正确值: 2
样本序号:456,分类器返回值: 1,正确值: 1
样本序号:457,分类器返回值: 2,正确值: 2
样本序号:458,分类器返回值: 2,正确值: 2
样本序号:459,分类器返回值: 2,正确值: 3
样本序号:460,分类器返回值: 3,正确值: 3
样本序号:461,分类器返回值: 3,正确值: 3
样本序号:462,分类器返回值: 1,正确值: 1
样本序号:463,分类器返回值: 1,正确值: 1
样本序号:464,分类器返回值: 3,正确值: 3
样本序号:465,分类器返回值: 3,正确值: 3
样本序号:466,分类器返回值: 2,正确值: 2
样本序号:467,分类器返回值: 3,正确值: 3
样本序号:468,分类器返回值: 1,正确值: 3
样本序号:469,分类器返回值: 2,正确值: 2
样本序号:470,分类器返回值: 2,正确值: 3
样本序号:471,分类器返回值: 3,正确值: 3
样本序号:472,分类器返回值: 3,正确值: 3
样本序号:473,分类器返回值: 2,正确值: 2
样本序号:474,分类器返回值: 3,正确值: 3
样本序号:475,分类器返回值: 3,正确值: 3
样本序号:476,分类器返回值: 1,正确值: 1
样本序号:477,分类器返回值: 2,正确值: 2
样本序号:478,分类器返回值: 3,正确值: 3
样本序号:479,分类器返回值: 2,正确值: 2
样本序号:480,分类器返回值: 1,正确值: 1
样本序号:481,分类器返回值: 1,正确值: 1
样本序号:482,分类器返回值: 1,正确值: 1
样本序号:483,分类器返回值: 1,正确值: 1
样本序号:484,分类器返回值: 3,正确值: 3
样本序号:485,分类器返回值: 3,正确值: 3
样本序号:486,分类器返回值: 3,正确值: 3
样本序号:487,分类器返回值: 3,正确值: 3
样本序号:488,分类器返回值: 2,正确值: 2
样本序号:489,分类器返回值: 1,正确值: 1
样本序号:490,分类器返回值: 1,正确值: 1
样本序号:491,分类器返回值: 1,正确值: 1
样本序号:492,分类器返回值: 1,正确值: 1
样本序号:493,分类器返回值: 3,正确值: 3
样本序号:494,分类器返回值: 1,正确值: 1
样本序号:495,分类器返回值: 2,正确值: 1
样本序号:496,分类器返回值: 2,正确值: 2
样本序号:497,分类器返回值: 1,正确值: 1
样本序号:498,分类器返回值: 1,正确值: 1
样本序号:499,分类器返回值: 2,正确值: 2
错误率: 0.066000%
33.0

最终得到分类结果,正确率为94%,错误33/1000。

DateNet预测函数

想根据一个人的特征值,来预测喜欢的程度。

def classifyPerson():
    resultList = ['不喜欢','喜欢','非常喜欢'] 
    percentTats = float(input("玩游戏时间比:"))
    ffMiles = float(input('一年飞行里程:'))
    iceCream = float(input('消费冰淇淋数:')) 
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
    normMat,ranges,minVals = autoNorm(datingDataMat) 
    inArr = array([ffMiles, percentTats, iceCream])
    classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
    result = classifierResult[-1]
    if(result==1):
        result='不喜欢'
    elif(result==2):
        result ='喜欢'
    elif(result==3):
        result ='非常喜欢'
    print("你可能:{}".format(result))
  
                                  
classifyPerson()
玩游戏时间比:10
一年飞行里程:10000
消费冰淇淋数:0.5
你可能:2他

约会网站数据下载

KNN算法总结

KNN近邻算法
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。