《机器学习实战》kNN

k-邻近算法

基本样例

# 引入基本模块
from numpy import *
import operator
# 定义数据
def createDataSet():
    group = array([[1.,1.1],[1.,1.],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels
# 创建分类器
def classify0(inX, dataset, labels, k):
    dataSetSize = dataset.shape[0]
    diffMat = tile(inX, (dataSetSize,1)) - dataset
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    
    distance = sqDistances**0.5
#     print '距离\n',sqDistances
    sortedDistIndicies = distance.argsort()
#     print '距离排序\n', sortedDistIndicies
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
#     print '各类别数量\n', classCount.items()

    sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)
#     print '各类别数量排序\n', sortedClassCount
    
    return sortedClassCount[0][0]
# 测试
group, labels = createDataSet()
finalClass = classify0([1,0.8], group, labels, 3)
print 'final class:\n', finalClass
final class:
A

约会网站示例

# 定义读取文件函数
def file2matrix(filename):
    f = open(filename)
    arrayLines = f.readlines()
    numberOfLines = len(arrayLines)

    returnMat = zeros((numberOfLines,3))
    classLabelVector = []
    index = 0
    for line in arrayLines:
        line = line.strip()
        listLine = line.split('\t')
        returnMat[index,:] = listLine[:3]
        classLabelVector.append(int(listLine[-1]))
        index += 1
        
    f.close()
    return returnMat, classLabelVector
    
dateDataMat, dateLabels = file2matrix('datingTestSet2.txt')
# 绘制散点图
import matplotlib.pyplot as plt
# 游戏时间与飞行里程关系
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.scatter(dateDataMat[:,0],dateDataMat[:,1],15*array(dateLabels),15*array(dateLabels))
ax1.set_title('scatter1')
plt.xlabel('fly miles')
plt.ylabel('game time percent')
# 游戏时间与冰淇淋消耗公升数
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.scatter(dateDataMat[:,1],dateDataMat[:,2],15*array(dateLabels),15*array(dateLabels))
ax2.set_title('scatter2')
plt.xlabel('game time percent')
plt.ylabel('ice cream')
# 飞行里程数与冰淇淋消耗公升数
fig3 = plt.figure()
ax3 = fig3.add_subplot(111)
ax3.scatter(dateDataMat[:,0],dateDataMat[:,2],15*array(dateLabels),15*array(dateLabels))
ax3.set_title('scatter3')
plt.xlabel('fly miles')
plt.ylabel('ice cream')
plt.show()
output_8_0.png
output_8_1.png
output_8_2.png
# 归一化
def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    l = dataSet.shape[0]
    normDataSet = (dataSet - tile(minVals, (l,1)))/tile(ranges, (l,1))
    return normDataSet
print autoNorm(dateDataMat)
[[ 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 dateTest():
    ratio = 0.1
    dateDataMat, dataLabels = file2matrix('datingTestSet2.txt')
    normMat = autoNorm(dateDataMat)
    rows = normMat.shape[0]
    numTest = int(rows*ratio)
    errorCount = 0
    for i in range(numTest):
        classifierResult = classify0(normMat[i,:], normMat[numTest:,:], dataLabels[numTest:],3)
        print "分类器返回值:%d, 真实分类:%d"%(classifierResult, dataLabels[i])
        if classifierResult != dateLabels[i]: errorCount +=1
    print '错误率: ', errorCount / float(numTest)
dateTest()
分类器返回值:3, 真实分类:3
分类器返回值:2, 真实分类:2
分类器返回值:1, 真实分类:1
分类器返回值:1, 真实分类:1
分类器返回值:1, 真实分类:1
分类器返回值:1, 真实分类:1
分类器返回值:3, 真实分类:3
分类器返回值:3, 真实分类:3
      (...略)
分类器返回值:3, 真实分类:3
分类器返回值:2, 真实分类:2
分类器返回值:1, 真实分类:1
分类器返回值:3, 真实分类:1
错误率:  0.05

手写识别系统

# 读入文件并转化为1×1024的数组
def img2vector(filename):
    returnVec = zeros((1,1024))
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVec[0,32*i+j] = int(lineStr[j])
            
    return returnVec
    
import os
# 读取文件集,返回输入和label
def getFileSet(filePath):
    labels = []
    fileList = os.listdir(filePath)
    fileListLen = len(fileList)
    fileSet = zeros((fileListLen,1024))
    for i in range(fileListLen):
        f = fileList[i]
        fileStr = f.split('.')[0]
        labels.append(int(fileStr.split('_')[0]))
        fileSet[i,:] = img2vector(filePath +'/'+f)
        
    return fileSet, labels, fileList



# 测试
def handwritingTest():
    filePath = 'digits/testDigits'
    testSet, testLabels, testFileList = getFileSet(filePath)
    trainSet, trainLabels,trainFileList =  getFileSet('digits/trainingDigits')
    testSetLen = testSet.shape[0]
    errorCount = 0
    for i in range(testSetLen):
        classifierResult = classify0(testSet[i,:], trainSet, trainLabels, 3)
        print '%s:分类器分类结果:%d, 真实分类:%d'%(testFileList[i], classifierResult, testLabels[i])
        if classifierResult != testLabels[i] : errorCount +=1
    print '错误率:%f'%(errorCount /float(testSetLen))
handwritingTest()
0_0.txt:分类器分类结果:0, 真实分类:0
0_1.txt:分类器分类结果:0, 真实分类:0
0_10.txt:分类器分类结果:0, 真实分类:0
       (...略)
0_81.txt:分类器分类结果:0, 真实分类:0
0_82.txt:分类器分类结果:0, 真实分类:0
0_83.txt:分类器分类结果:0, 真实分类:0
0_84.txt:分类器分类结果:0, 真实分类:0
0_85.txt:分类器分类结果:0, 真实分类:0
0_86.txt:分类器分类结果:0, 真实分类:0
0_9.txt:分类器分类结果:0, 真实分类:0
1_0.txt:分类器分类结果:1, 真实分类:1
1_1.txt:分类器分类结果:1, 真实分类:1
1_10.txt:分类器分类结果:1, 真实分类:1
1_11.txt:分类器分类结果:1, 真实分类:1
1_12.txt:分类器分类结果:1, 真实分类:1
       (...略)
1_90.txt:分类器分类结果:1, 真实分类:1
1_91.txt:分类器分类结果:1, 真实分类:1
1_92.txt:分类器分类结果:1, 真实分类:1
1_93.txt:分类器分类结果:1, 真实分类:1
1_94.txt:分类器分类结果:1, 真实分类:1
1_95.txt:分类器分类结果:1, 真实分类:1
1_96.txt:分类器分类结果:1, 真实分类:1
2_0.txt:分类器分类结果:2, 真实分类:2
2_1.txt:分类器分类结果:2, 真实分类:2
2_10.txt:分类器分类结果:2, 真实分类:2
2_11.txt:分类器分类结果:2, 真实分类:2
2_12.txt:分类器分类结果:2, 真实分类:2
2_13.txt:分类器分类结果:2, 真实分类:2
          (...略)
2_85.txt:分类器分类结果:2, 真实分类:2
2_86.txt:分类器分类结果:2, 真实分类:2
2_87.txt:分类器分类结果:2, 真实分类:2
2_88.txt:分类器分类结果:2, 真实分类:2
2_89.txt:分类器分类结果:2, 真实分类:2
2_9.txt:分类器分类结果:2, 真实分类:2
2_90.txt:分类器分类结果:2, 真实分类:2
2_91.txt:分类器分类结果:2, 真实分类:2
3_0.txt:分类器分类结果:3, 真实分类:3
3_1.txt:分类器分类结果:3, 真实分类:3
3_10.txt:分类器分类结果:3, 真实分类:3
3_11.txt:分类器分类结果:9, 真实分类:3
3_12.txt:分类器分类结果:3, 真实分类:3
3_13.txt:分类器分类结果:3, 真实分类:3
3_14.txt:分类器分类结果:3, 真实分类:3
        (...略)
3_82.txt:分类器分类结果:3, 真实分类:3
3_83.txt:分类器分类结果:3, 真实分类:3
3_84.txt:分类器分类结果:3, 真实分类:3
3_9.txt:分类器分类结果:3, 真实分类:3
4_0.txt:分类器分类结果:4, 真实分类:4
4_1.txt:分类器分类结果:4, 真实分类:4
4_10.txt:分类器分类结果:4, 真实分类:4
4_100.txt:分类器分类结果:4, 真实分类:4
4_101.txt:分类器分类结果:4, 真实分类:4
4_102.txt:分类器分类结果:4, 真实分类:4
4_103.txt:分类器分类结果:4, 真实分类:4
4_104.txt:分类器分类结果:4, 真实分类:4
        (...略)
4_95.txt:分类器分类结果:4, 真实分类:4
4_96.txt:分类器分类结果:4, 真实分类:4
4_97.txt:分类器分类结果:4, 真实分类:4
4_98.txt:分类器分类结果:4, 真实分类:4
4_99.txt:分类器分类结果:4, 真实分类:4
5_0.txt:分类器分类结果:5, 真实分类:5
5_1.txt:分类器分类结果:5, 真实分类:5
5_10.txt:分类器分类结果:5, 真实分类:5
5_100.txt:分类器分类结果:5, 真实分类:5
5_101.txt:分类器分类结果:5, 真实分类:5
      (...略)
5_92.txt:分类器分类结果:5, 真实分类:5
5_93.txt:分类器分类结果:5, 真实分类:5
5_94.txt:分类器分类结果:5, 真实分类:5
5_95.txt:分类器分类结果:5, 真实分类:5
5_96.txt:分类器分类结果:5, 真实分类:5
5_97.txt:分类器分类结果:5, 真实分类:5
5_98.txt:分类器分类结果:5, 真实分类:5
5_99.txt:分类器分类结果:5, 真实分类:5
6_0.txt:分类器分类结果:6, 真实分类:6
6_1.txt:分类器分类结果:6, 真实分类:6
6_10.txt:分类器分类结果:6, 真实分类:6
6_11.txt:分类器分类结果:6, 真实分类:6
6_12.txt:分类器分类结果:6, 真实分类:6
6_13.txt:分类器分类结果:6, 真实分类:6
       (...略)
6_82.txt:分类器分类结果:6, 真实分类:6
6_83.txt:分类器分类结果:6, 真实分类:6
6_84.txt:分类器分类结果:6, 真实分类:6
6_85.txt:分类器分类结果:6, 真实分类:6
6_86.txt:分类器分类结果:6, 真实分类:6
6_9.txt:分类器分类结果:6, 真实分类:6
7_0.txt:分类器分类结果:7, 真实分类:7
7_1.txt:分类器分类结果:7, 真实分类:7
7_10.txt:分类器分类结果:7, 真实分类:7
7_11.txt:分类器分类结果:7, 真实分类:7
7_12.txt:分类器分类结果:7, 真实分类:7
7_13.txt:分类器分类结果:7, 真实分类:7
7_14.txt:分类器分类结果:7, 真实分类:7
        (...略)
7_91.txt:分类器分类结果:7, 真实分类:7
7_92.txt:分类器分类结果:7, 真实分类:7
7_93.txt:分类器分类结果:7, 真实分类:7
7_94.txt:分类器分类结果:7, 真实分类:7
7_95.txt:分类器分类结果:7, 真实分类:7
8_0.txt:分类器分类结果:8, 真实分类:8
8_1.txt:分类器分类结果:8, 真实分类:8
8_10.txt:分类器分类结果:8, 真实分类:8
8_11.txt:分类器分类结果:6, 真实分类:8
8_12.txt:分类器分类结果:8, 真实分类:8
8_13.txt:分类器分类结果:8, 真实分类:8
8_14.txt:分类器分类结果:8, 真实分类:8
         (...略)
8_83.txt:分类器分类结果:8, 真实分类:8
8_84.txt:分类器分类结果:8, 真实分类:8
8_85.txt:分类器分类结果:8, 真实分类:8
8_86.txt:分类器分类结果:8, 真实分类:8
8_87.txt:分类器分类结果:8, 真实分类:8
8_88.txt:分类器分类结果:8, 真实分类:8
8_89.txt:分类器分类结果:8, 真实分类:8
8_9.txt:分类器分类结果:8, 真实分类:8
8_90.txt:分类器分类结果:8, 真实分类:8
9_0.txt:分类器分类结果:9, 真实分类:9
9_1.txt:分类器分类结果:9, 真实分类:9
9_10.txt:分类器分类结果:9, 真实分类:9
9_11.txt:分类器分类结果:9, 真实分类:9
9_12.txt:分类器分类结果:9, 真实分类:9
9_13.txt:分类器分类结果:9, 真实分类:9
9_14.txt:分类器分类结果:1, 真实分类:9
        (...略)
9_83.txt:分类器分类结果:9, 真实分类:9
9_84.txt:分类器分类结果:9, 真实分类:9
9_85.txt:分类器分类结果:9, 真实分类:9
9_86.txt:分类器分类结果:9, 真实分类:9
9_87.txt:分类器分类结果:9, 真实分类:9
9_88.txt:分类器分类结果:9, 真实分类:9
9_9.txt:分类器分类结果:9, 真实分类:9
错误率:0.011628
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容