机器学习实战学习笔记(一)

来源:互联网 发布:电气工程算量软件 编辑:程序博客网 时间:2024/06/06 02:34
  • shape的用法
  • numpy.tile()函数
  • numpy.sum()的用法
  • KNN算法和kmeans算法的异同
  • numpy.argsort()
  • 字典的get方法
  • python中iteritems()函数
一开始看问题还是蛮多的,看python的基础语法看完就忘了,只有到真正需要用的时候才会了解到相应的用法。
下面是带注释的代码。

from numpy import *import operatorfrom os import listdirdef classify0(inX, dataSet, labels, k):#inx需要进行分类的样本向量    dataSetSize = dataSet.shape[0]#获得dataset的行数,也就是训练样本的数量    diffMat = tile(inX, (dataSetSize,1)) - dataSet#将inx复制多列,列数和样本数一样,然后和样本相减    sqDiffMat = diffMat**2#将结果平方    sqDistances = sqDiffMat.sum(axis=1)#axis=1的意思是按行求和,就是将每一行所有元素相加    distances = sqDistances**0.5#和开方    sortedDistIndicies = distances.argsort() #对矩阵进行排序,将行好或者说索引按递增序列返回    classCount={}              for i in range(k):        voteIlabel = labels[sortedDistIndicies[i]]#距离最近的第i个点的标签(类别)        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#对应的类别的数量加一(字典中没有此类别就返回0)    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)#根据value值进行降序排序    return sortedClassCount[0][0]#返回value值最大的类


  • zeros的用法
  • strip函数的用法
  • readlines的用法
  • 注意切片是前切后不切
  • 循环之前记得再把文件读一遍
def file2matrix(filename):    fr = open(filename)    numberoflines = len(fr.readlines())    returnMat = zeros([numberoflines, 3])    classlabelvec = []    fr = open(filename)#这行很重要,一开始以为是多余的就截掉了,后来发现截掉以后循环不执行    index = 0    for line in fr.readlines():        line = line.strip()#截取掉所有的回车符        listfromline = line.split('\t')        returnMat[index, :] = listfromline[0:3]        classlabelvec.append(int(listfromline[-1]))#注意类型转换        index += 1    return returnMat, classlabelvec

后面的没什么好讲的,这章主要是数据的处理,感觉这个是重点,算法本身没有深意。
直接贴一下代码,拉长一下篇幅。

def autonorm(dataset):    minval = dataset.min(0)#    maxval = dataset.max(0)#    ranges = maxval - minval    m = dataset.shape[0]    normdataset = zeros(shape(dataset))    normdataset = dataset - tile(minval, (m, 1))    normdataset = normdataset/tile(ranges, (m, 1))    return normdataset, rangesdef datingclasstest():    ratio = 0.1    a,b = file2matrix('datingtestset2.txt')    c,d = autonorm(a)    m = c.shape[0]    index = int(m*ratio)    down = 0.0    for i in range(index):        z = classify0(c[i,:], c[index:m,:], b[index:m], 3)        if(z != b[i]):            down+=1    downratio = down / index    print downratiodef img2vec(filename):    returnvec = zeros((1,1024))    fr = open(filename)    for i in range(32):        line = fr.readline()        for j in range(32):            returnvec[0, 32*i+j] = int(line[j])    return returnvecdef handwritingClassTest():    hwLabels = []    trainingFileList = listdir('trainingDigits')#获取目录下文件,类似于readlines    m = len(trainingFileList)#样本数    trainingMat = zeros((m,1024))    for i in range(m):        fileNameStr = trainingFileList[i]        fileStr = fileNameStr.split('.')[0] #去掉文件后缀名        classNumStr = int(fileStr.split('_')[0]) #获取数字标签        hwLabels.append(classNumStr) #加入标签列表        trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr) #读取文件内容并且转换成向量    testFileList = listdir('testDigits')        #iterate through the test set    errorCount = 0.0    mTest = len(testFileList)    for i in range(mTest):        fileNameStr = testFileList[i]        fileStr = fileNameStr.split('.')[0]     #take off .txt        classNumStr = int(fileStr.split('_')[0])        vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)        classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)        print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)        if (classifierResult != classNumStr): errorCount += 1.0    print "\nthe total number of errors is: %d" % errorCount    print "\nthe total error rate



原创粉丝点击