机器学习实验一
配置python+numpy环境
- python下载安装
在https://www.python.org/downloads/下载安装Python 3.9.7(由于本人在此之前已安装,便不再重复。) - numpy下载安装
在 https://pypi.org/project/numpy/#files下载安装numpy,并选择对应的版本。如python版本为3.9,则选择numpy版本含“cp39”,并根据自身电脑的系统和配置做出相应的选择,我这里是Windows系统,64位,故选择了numpy-1.21.2-cp39-cp39-win_amd64.whl 。 - 之后将下载好的文件复制到python安装目录下的Scripts目录中。
- 然后打开命令行窗口,进入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已经安装了与所提供的相同版本。) - 进入python shell开发环境输入命令:
from numpy import *
该命令将Numpy函数库中的所有模块引入当前的命名空间。输入结果如下图: - 测试是否正确地安装了NumPy函数库
在Python shell 开发环境中输入命令:random.rand(4,4)
该命令构造了一个4*4的随机数组。
调用mat()函数可将数组转化为矩阵,输入命令:
randMat = mat(random.rand(4,4))
randMat.I
.I操作符实现了矩阵求逆的运算,便可得到矩阵:
接着执行命令invRandMat = randMat.I
存储逆矩阵
之后执行命令randMat*invRandMat
实现矩阵乘法,得到矩阵与其逆矩阵相乘的结果:
输入命令
myEye = randMat*invRandMat
myEye - eye(4)
得到误差值:
顺利完成上述例子,就说明已经正确地安装了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
然后在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))
最后输入命令kNN.handwritingClassTest()
测试结果