【用Python玩Machine Learning】KNN * 代码 * 二

继续之前的写。

三、对单个样本进行分类。

'''
function: classify the input sample by voting from its K nearest neighbor
input:
1. the input feature vector
2. the feature matrix
3. the label list
4. the value of k
return: the result label
'''
def ClassifySampleByKNN(featureVectorIn, featureMatrix, labelList, kValue):

    # calculate the distance between feature input vector and the feature matrix
    disValArray = CalcEucDistance(featureVectorIn,featureMatrix)

    # sort and return the index
    theIndexListOfSortedDist = disValArray.argsort()

    # consider the first k index, vote for the label
    labelAndCount = {}
    for i in range(kValue):
        theLabelIndex = theIndexListOfSortedDist[i]
        theLabel = labelList[theLabelIndex]
        labelAndCount[theLabel] = labelAndCount.get(theLabel,0) + 1
    sortedLabelAndCount = sorted(labelAndCount.iteritems(), key=lambda x:x[1], reverse=True)

    return sortedLabelAndCount[0][0]

基本思路就是,首先计算输入样本和训练样本集合的欧氏距离,然后根据距离进行排序,选择距离最小的k个样本,用这些样本对应的标签进行投票,票数最多的标签就是输入样本所对应的标签。

比较有特色的写法是这一句:

# sort and return the index
    theIndexListOfSortedDist = disValArray.argsort()

disValArray是numpy的一维数组,存储的仅仅是欧式距离的值。argsort直接对这些值进行排序,并且把排序结果所对应的原索引返回回来。很方便。另外一句是sorted函数的调用,按照value来对字典进行排序,用到了函数式编程的lambda表达式。这个用operator也能达到同样的目的。

四、对测试样本文件进行分类,并统计错误率

'''
function: classify the samples in test file by KNN algorithm
input:
1. the name of training sample file
2. the name of testing sample file
3. the K value for KNN
4. the name of log file
'''
def ClassifySampleFileByKNN(sampleFileNameForTrain, sampleFileNameForTest, kValue, logFileName):

    logFile = open(logFileName,'w')

    # load the feature matrix and normailize them
    feaMatTrain, labelListTrain = LoadFeatureMatrixAndLabels(sampleFileNameForTrain)
    norFeaMatTrain = AutoNormalizeFeatureMatrix(feaMatTrain)
    feaMatTest, labelListTest = LoadFeatureMatrixAndLabels(sampleFileNameForTest)
    norFeaMatTest = AutoNormalizeFeatureMatrix(feaMatTest)

    # classify the test sample and write the result into log
    errorNumber = 0.0
    testSampleNum = norFeaMatTest.shape[0]
    for i in range(testSampleNum):
        label = ClassifySampleByKNN(norFeaMatTest[i,:],norFeaMatTrain,labelListTrain,kValue)
        if label == labelListTest[i]:
            logFile.write("%d:right\n"%i)
        else:
            logFile.write("%d:wrong\n"%i)
            errorNumber += 1
    errorRate = errorNumber / testSampleNum
    logFile.write("the error rate: %f" %errorRate)

    logFile.close()

    return

代码挺多,不过逻辑上就很简单了。没什么好说的。另外,不知道python中的命名是什么习惯?我发现如果完全把变量名字展开,太长了——我的macbook pro显示起来太难看。这里就沿用c/c++的变量简写命名方式了。

五、入口调用函数

类似c/c++的main函数。只要运行kNN.py这个脚本,就会先执行这一段代码:

if __name__ == '__main__':

    print "You are running KNN.py"

    ClassifySampleFileByKNN('datingSetOne.txt','datingSetTwo.txt',3,'log.txt')

kNN中的k值我选择的是3。

未完,待续。

时间: 2024-10-31 05:00:47

【用Python玩Machine Learning】KNN * 代码 * 二的相关文章

【用Python玩Machine Learning】KNN * 序

这段时间工作太忙,很久没学习了.这两天,工作之余,偶尔在家翻翻书,权且当做休息了. 我一直是c/c++的忠实用户,尤其是c的粉丝--概念简洁.运行高效--计算机专业的人,不用c语言,不了解程序底层的运行机制和过程,那和那些外专业的只会调用接口.函数的同学有什么区别呢?不过,最近一年还是慢慢去了解.尝试python了.原因很简单,开发成本太低了.c/c++就像复杂的吸尘器.洗碗机,优点是高效,缺点是笨重,且对不同的场景要不同的适配:python就像是一块脏抹布,哪儿都能用,用完就扔,再用的时候再捡

【用Python玩Machine Learning】KNN * 测试

样本我就用的<machine learning in action>中提供的数据样例,据说是婚恋网站上各个候选人的特征,以及当前人对这些人的喜欢程度.一共1k条数据,前900条作为训练样本,后100条作为测试样本. 数据格式如下: 46893 3.562976 0.445386 didntLike 8178 3.230482 1.331698 smallDoses 55783 3.612548 1.551911 didntLike 1148 0.000000 0.332365 smallDos

【用Python玩Machine Learning】KNN * 代码 * 一

KNN的是"k Nearest Neighbors"的简称,中文就是"最近邻分类器".基本思路就是,对于未知样本,计算该样本和训练集合中每一个样本之间的距离,选择距离最近的k个样本,用这k个样本所对应的类别结果进行投票,最终多数票的类别就是该未知样本的分类结果.选择什么样的度量来衡量样本之间的距离是关键. 一.从文本中读取样本的特征和分类结果. ''' kNN: k Nearest Neighbors ''' import numpy as np ''' funct

[Machine Learning]kNN代码实现(Kd tree)

具体描述见<统计学习方法>第三章. 1 // 2 // main.cpp 3 // kNN 4 // 5 // Created by feng on 15/10/24. 6 // Copyright © 2015年 ttcn. All rights reserved. 7 // 8 9 #include <iostream> 10 #include <vector> 11 #include <algorithm> 12 #include <cmath&

Machine Learning笔记(二) 单变量线性回归

Machine Learning笔记(二) 单变量线性回归 注:本文内容资源来自 Andrew Ng 在 Coursera上的 Machine Learning 课程,在此向 Andrew Ng 致敬. 一.模型表示(Model Representation) 对于笔记(一)中的房价问题,如何进行求解,这将会是本文中讨论的重点. 现在假设有了更多的房屋价格数据,需要用一条直线来近似房屋价格的走势,如下图所示: 回顾笔记(一)中所讲 监督学习.非监督学习.回归 和 分类 的概念: 1. 监督学习(

[Machine :Learning] kNN近邻算法

from numpy import * import operator def createDataSet() : group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 1.1]]) labels = ['A', 'A', 'B', 'B'] return group, labels ''' tile(array, (intR, intC): 对矩阵进行组合,纵向复制intR次, 横向复制intC次 比如 : tile([1,2,3], (3, 2

機器學習基石(Machine Learning Foundations) 机器学习基石 作业二 课后习题解答

大家好,我是Mac Jiang,首先祝贺大家清明节快乐!作为一名苦逼的程序员,博主只能窝在实验室玩玩游戏,顺便趁着大早上没人发一篇微博.不过还是祝各位出行的兄弟玩的开心! 今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业二的习题解答.笔者在做这些题目时遇到很多困难,当我在网上寻找答案时却找不到,而林老师又不提供答案,所以我就想把自己做题时对题目如何思考的写下来,为大家提供一些思路.当然,我对题目的理解不一定是正确的,如果各位博

Python Tools for Machine Learning

Python Tools for Machine Learning Python is one of the best programming languages out there, with an extensive coverage in scientific computing: computer vision, artificial intelligence, mathematics, astronomy to name a few. Unsurprisingly, this hold

【machine learning】KNN算法

适逢学习机器学习基础知识,就将书中内容读读记记,本博文代码参考书本Machine Learning in Action(<机器学习实战>). 一.概述 kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. kNN算法则是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别.该算法涉及3个主要因素:训练集.距离或相似的衡量.k的大小. 二.算法要点 1.指导思想 kNN算法的指导思想是"近朱者赤,近墨者黑&q