关于KNN算法的一些理解

版权声明:欢迎转载,注明出处就行! https://blog.csdn.net/weixin_42847656/article/details/83721422

关于KNN算法的一些理解

遇到的问题:

1.编程过程需要清晰的思路,目前思路还挺混乱

基本流程:

1.收集数据:提供的文本
2.准备数据:如编写imgVector(),将图片格式转化为分类器所使用的格式,或者补好空缺的数据等,就是对数据进行处理
3.分析数据:检查数据是否可用
4.训练算法:这个算法暂时没有
5.测试数据:拿一部分出来作为测试数据,测试数据就是已经完成分类的数据,如果预测数据和实际所属的数据不同,那就标记为一个错误
6.使用算法:目前还没遇到,不知道怎么做。。。

主要的程序以及功能 :

1.createDataSet()

创建一个group和label

2.classify0()

传说中的KNN算法:
1.使用欧式公式计算数据之间的距离
2.确定前K个距离最小元素所在的主要分类
3.进行排序,逆序,从大到小排序
此函数有四个输入:
1.inX:用于分类的输入向量
2.dataSet:用于训练的样本集
3.labels:标签向量(标签向量的元素数目==dataSet的行数)
4.用于选择最近邻居的数目

3.file2matrix()

文本解析数据,转为numpy
伪程序:
打开;
一行一行读;
每一行的len();
创建一个新的函数 zeros(len(),3);
for函数循环:
line = line.strip();
用循环的方式每次都把前4个数据放入数据栏;
用负索引将最后一列放入标签栏;
返回标签栏和数据栏

4.autoNorm()

归一化处理数据
简而言之:newValue =( oldValue-min)/(max-min)

5.datingClassTest()

分类器处理
1.使用file2matrix()和autoNorm()读取数据并将其归一化
2.决定哪部分测试,哪部分训练
3.将这两部分用classfly()函数进行处理

手写识别系统:

import KNN
#from OS import listdir
def img2vector(filename):
    returnVect = zeros((1,1024))
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0,32*1+j] = int(lineStr[j])
    return returnVect

testVect = KNN.img2vector('testDigits/0_73.txt')
print(testVect)

def handWritingClassTest():
    hwLabels = []
    trainingFileList = listdir('trainingDigits')
    m = len(trainingFileList)
    trainingMat = zeros(m,1024)
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = fileStr.split('_')[0]
        hwLabels.append(classNumStr)
        trainingMat[i,:] = img2vector('trainingDigits/%s'% trainingFileList)
    testFileList = listdir('testDigits')
    errorCount = 0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        vectorUnderTest = img2vector('testDigits/%s'%fileNameStr)
        classifyResult = classify0(vectorUnderTest,trainingMat,hwLabels,3)
        print('the classifier came back with: %d,the real answer is %d'%(classifyResult,classNumStr))
        if(classifyResult != classNumStr):errorCount+=1.0
    print('总错误数为%d'%errorCount)
    print('错误率为%d'%(errorCount/float(mTest)))

KNN.handwritingClassTest()

猜你喜欢

转载自blog.csdn.net/weixin_42847656/article/details/83721422
今日推荐