机器学习实验一

配置python+numpy环境

  • python下载安装
    https://www.python.org/downloads/下载安装Python 3.9.7(由于本人在此之前已安装,便不再重复。)
  • python3.9安装dlib Python3.9安装numpy哪个版本_pycharm

  • numpy下载安装
    https://pypi.org/project/numpy/#files下载安装numpy,并选择对应的版本。如python版本为3.9,则选择numpy版本含“cp39”,并根据自身电脑的系统和配置做出相应的选择,我这里是Windows系统,64位,故选择了numpy-1.21.2-cp39-cp39-win_amd64.whl 。
  • python3.9安装dlib Python3.9安装numpy哪个版本_numpy_02

  • 之后将下载好的文件复制到python安装目录下的Scripts目录中。
  • python3.9安装dlib Python3.9安装numpy哪个版本_python_03

  • 然后打开命令行窗口,进入python安装目录,输入以下命令:pip install numpy-1.21.2-cp39-cp39-win_amd64.whl若安装成功则会在下图蓝色箭头处显示Successfully installed numpy-1.21.2。(我此前安装过,故会显示numpy is already installed with the same version as the provided wheel. 即Numpy已经安装了与所提供的相同版本。)
  • python3.9安装dlib Python3.9安装numpy哪个版本_numpy_04

  • 进入python shell开发环境输入命令:from numpy import *该命令将Numpy函数库中的所有模块引入当前的命名空间。输入结果如下图:
  • python3.9安装dlib Python3.9安装numpy哪个版本_sklearn_05

  • 测试是否正确地安装了NumPy函数库
    在Python shell 开发环境中输入命令:random.rand(4,4) 该命令构造了一个4*4的随机数组。
    调用mat()函数可将数组转化为矩阵,输入命令:
randMat = mat(random.rand(4,4))
randMat.I

.I操作符实现了矩阵求逆的运算,便可得到矩阵:

python3.9安装dlib Python3.9安装numpy哪个版本_python_06


接着执行命令invRandMat = randMat.I 存储逆矩阵

之后执行命令randMat*invRandMat实现矩阵乘法,得到矩阵与其逆矩阵相乘的结果:

python3.9安装dlib Python3.9安装numpy哪个版本_python3.9安装dlib_07

输入命令

myEye = randMat*invRandMat
myEye - eye(4)

得到误差值:

python3.9安装dlib Python3.9安装numpy哪个版本_pycharm_08

顺利完成上述例子,就说明已经正确地安装了NumPy函数库。

KNN算法(K-近邻算法)

简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。

  • 工作原理
    工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每一特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最邻近)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
  • KNN 开发流程
    收集数据:任何方法
    准备数据:距离计算所需要的数值,最好是结构化的数据格式
    分析数据:任何方法
    训练算法:此步骤不适用于 k-近邻算法
    测试算法:计算错误率
    使用算法:输入样本数据和结构化的输出结果,然后运行 k-近邻算法判断输入数据分类属于哪个分类,最后对计算出的分类执行后续处理
  • KNN 算法特点
    优点:精度高、对异常值不敏感、无数据输入假定
    缺点:计算复杂度高、空间复杂度高
    适用数据范围:数值型和标称型

实现手写数字识别

将下列代码输入到kNN.py文件中

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*i+j] = int(lineStr[j])
    return returnVect

python3.9安装dlib Python3.9安装numpy哪个版本_numpy_09

然后在Python命令行中输入下列命令测试img2vector函数,然后与文本编辑器打开的文件进行比较:

>>> testVector = kNN.img2vector('testDigits/0_13.txt')
>>> testVector[0,0:31]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> testVector[0,31:63]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

导入训练数据和测试数据

def handwritingClassTest():
    hwLabels = []
    trainingFileList = listdir('trainingDigits')           #load the training set
    m = len(trainingFileList)
    trainingMat = zeros((m,1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]     #take off .txt
        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 is: %f" % (errorCount/float(mTest))

python3.9安装dlib Python3.9安装numpy哪个版本_numpy_10

最后输入命令kNN.handwritingClassTest()测试结果