基于Python的机器学习算法实现-K-近邻算法(二)

基于Python的机器学习算法实现-K-近邻算法(二)

前言

基于Python的机器学习算法实现-K-近邻算法(一)的基础上,这里更进一步地介绍,上一篇是有很大的缺陷的,例如当一个参数,或者是特征的值比较大,其在计算中占的权重就会变得很大,并且我们也不能很清楚的知道当前这个预测模型的错误率是多少,最好的错误率是零,然而这个也是很难达到的。这里将介绍是否愿意与一个人约会的预测。其中的参数有:每年出行飞机的里程数,打游戏占用的时间比例,每年吃冰激凌的升数。

0.1程序设计思路

这里写图片描述

02.程序详解

这里依然是创建一个kNN.py模块,以下将对各个函数进行介绍,当然,这里你需要导入以下包

#导入numpy的所有函数到当前环境
from numpy import *
#运算符模块,k-近邻算法执行排序操作时使用的模块
import operator
#导入图形处理模块
import matplotlib
import matplotlib.pyplot as plt

数据处理模块

def file2matrix(filename):
    #打开文件,获取信息
    fr=open(filename)
    #读取文件
    arrayOLines=fr.readlines()
    #获取文件的行数
    numberOfLines=len(arrayOLines)
    #生成numberOfLines行,3列零矩阵
    returnMat=zeros((numberOfLines,3))
    #其数据标记的列表
    classLabelVector=[]
    #零矩阵的行数
    index=0
    for line in arrayOLines:
        #去除字符串两端内容
        line=line.strip()
        #用\t切分数据
        listFromLine=line.split('\t')
        #给零矩阵赋值
        returnMat[index,:]=listFromLine[0:3]
        #获取对应的数据的类别,明确类型
        classLabelVector.append(int(listFromLine[-1]))
        index+=1
    #返回数据
    return returnMat,classLabelVector

数据归一化处理模块

#归一化数值
def autoNorm(dataSet):
    #获取数据每列的最小值的,min(1)获取每行的最小值
    minVals = dataSet.min(0)
    #获取数据的最大值
    maxVals = dataSet.max(0)
    #获取极差
    ranges = maxVals - minVals
    #新的矩阵与之前的相同
    normDataSet = zeros(shape(dataSet))
    #获取矩阵的行数,【1】列数
    m = dataSet.shape[0]
    #将mivals 行复制m次,列不复制
    normDataSet = dataSet - tile(minVals, (m,1))
    normDataSet = normDataSet/tile(ranges, (m,1))   
    return normDataSet, ranges, minVals

模型错误率检测

#分类器测试函数
def datingClassTest():
    #训练数据,测试数据比例
    hoRatio = 0.50      #hold out 10%
    #获取数据
    datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') 
    #数据归一化处理
    normMat, ranges, minVals = autoNorm(datingDataMat)
    #获取数据的的行数
    m = normMat.shape[0]
    #声明测试的数量500
    numTestVecs = int(m*hoRatio)
    #定义预测错误数
    errorCount = 0.0
    #训练集错误数的计算
    for i in range(numTestVecs):
        #测试参数,训练集,训练集对应的标签,k值,获取预测结果,这里取了后500个数据
        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)

训练数据展示模块

#训练数据图形查看
def plotDatingData():
    #数据预处理
    datingDataMat,datingLabels=file2matrix("datingTestSet2.txt")
    #数据格式化
    normMat,ranges,minVals=autoNorm(datingDataMat)
    #创建画板
    fig=plt.figure()
    #参数行、列,第几个
    ax=fig.add_subplot("111")
    #scatter(散点图)参数,横坐标,纵坐标;这是一个多维矩阵,所有的行的,第二、三列的值,并使用分类标记
    ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(datingLabels),10.0*array(datingLabels))
    #设置坐标轴
    plt.xlabel("Flayier Mailes Earned Per Year")
    plt.ylabel("Time Spend Palying Video Games")
    #设置标题
    plt.title("Dating History")
    plt.show()

约会预测函数

#约会预测函数
def classifyPerson():
    #定义预测可能性
    resultList=['1:not at all','2:in small does','3:in large does']
    #键盘输入参数:打游戏的比率  0-100范围
    percentTats=float(input("percentage of time spent playing video games:"))
    #键盘输入参数:每年飞行距离
    ffMils=float(input("frequent flier mils earned per year:"))
    #键盘输入参数:每年吃冰淇淋的升数
    iceCream=float(input("liters of ice cream consumed per year:"))
    #将训练数据的数据预处理
    datingDataMat,datingLabels=file2matrix("datingTestSet2.txt")
    #将训练数据归一化处理,返回归一化数据、极差,最小值
    normMat,ranges,minVals=autoNorm(datingDataMat)
    #测试数据的矩阵化
    inArr=array([ffMils,percentTats,iceCream])
    #开始预测
    classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
    #打印预测结果
    print("You will probably like this person:",resultList[classifierResult-1])

程序运行介绍:我们进入当前kNN.py文件所处的路径,并进入cmd,具体如图
这里写图片描述
当然其中对训练数据显示如下图
这里写图片描述
这里并没有展示模型的错误率:
我们可以在之前的dos窗口中输入kNN.datingClassTest()即可,如图
这里写图片描述

03.结语

程序源码及相关数据将放到百度云链接:https://pan.baidu.com/s/13URdjrZHoAlSujD27mOqRw 密码:djdx
获取更多资料,查看更多经典博文,可查看个人订阅号。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/meiqi0538/article/details/80237579
今日推荐