机器学习实战-第二章-k-近邻算法
Posted wyy_persist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习实战-第二章-k-近邻算法相关的知识,希望对你有一定的参考价值。
时间:2021.11.02 下午 14:22开始记
将文件转换为矩阵格式的代码:
# def file2Matrix(filename):
# fr = open(filename)
# arrayOLines = fr.readlines()
# numberOLines = len(arrayOLines)
# returnMat = zeros((numberOLines, 3))
# classLabelVector = []
# index = 0;
# for line in arrayOLines:
# line = line.strip()
# listFromLine = line.split('\\t')
# returnMat[index, :] = listFromLine[0:3]
# classLabelVector.append(int(listFromLine[-1]))
# index += 1
#
# return returnMat, classLabelVector
Numpy实际上是一个二维数组;
使用nums[-1]表示列表中的最后一行;
重复使用一个python模块之前需要使用哦个reload(module name),因为不这样的话,python会使用之前加载好的模块。
Numpy不支持Python自带的数组类型,所以在编写代码的时候要注意不要使用错误的数组类型。
2.2.2分析数据
使用MatplotLib创建散点图
Matplotlib中的scatter函数支持个性化标记散点图上的点。
# 使用matplotlib库作散点图的代码
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:, 1], datingDataMat[:, 2], 15.0 * array(datingLabels), 15.0 * array(datingLabels))
plt.show()
2.2.3 将数值进行归一化
虽然改变了数值的取值范围,增加了分类器的复杂度,但是为了得到更加准确的结果,需要这样做。
示例:
newValues = currValue - minValue / ranges,此处的ranges表示的是maxValue - minValue;
Python代码如下:
# 用于将特征值进行归一化的方法
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m,1))
normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide
return normDataSet, ranges, minVals
2.2.4 测试算法:作为完整程序验证分类器
使用kNN对约会网站的对象进行筛选的项目:
python代码如下(查看kNN算法的错误率):
def datingClassTest():
hoRatio = 0.50 # hold out 10%
datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
normMat, ranges, minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
numTestVecs = int(m*hoRatio)
errorCount = 0.0
for i in range(numTestVecs):
classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))
if (classifierResult != datingLabels[i]): errorCount += 1.0
print("the total error rate is: %f" % (errorCount/float(numTestVecs)))
print(errorCount)
2.2.5 使用算法对上述的约会对象进行分类构建完整的系统
使用的代码快如下:
# 设置的对人进行分类的函数
def classifyPerson():
# 设置一个结果集合
resultList = ['not at all', 'in small does', 'in large does']
# 得到用户的输入
percentTats = float(input("percentage of time spent playing video games?"))
ffMiles = float(input("frequent flier miles earned per year?"))
iceCream = float(input("liters of ice cream consumed per year?"))
# 对训练集进行处理
datingDateMat, datingLabels = file2matrix('datingTestSet2.txt')
# 对数据进行正则化,得到正则化后的数据,数据的分布的差距,数据集合中的最小值
normMat, ranges, minVals = autoNorm(datingDateMat)
# 构建的一个测试集合vector
inArr = array([ffMiles, percentTats, iceCream])
# 得到
classfierResult = classify0((inArr-minVals) / ranges, normMat, datingLabels, 3)
print("You will probably like the person: ", resultList[classfierResult - 1])
2.3 示例:手写识别系统
这里对于数字的保存的是使用1和0进行矩阵排列,然后表示出来对应的数字轮廓。
重点:这里需要主要将使用0 1进行排列的数字轮廓进行转换为一个矩阵向量:
代码如下:
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
2.3.2 测试算法:使用kNN算法识别手写数字
测试代码如下:
# 手写识别系统函数的创建
def handwritingClassTest():
hwLabels = []
trainingFileList = listdir('digits/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('digits/trainingDigits/%s' % fileNameStr)
# 得到测试集合
testFileList = listdir('digits/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('digits/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)))
以上是关于机器学习实战-第二章-k-近邻算法的主要内容,如果未能解决你的问题,请参考以下文章
机器学习实战☛k-近邻算法(K-Nearest Neighbor, KNN)