机器学习实战-第二章-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)))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wyypersist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值