基于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
获取更多资料,查看更多经典博文,可查看个人订阅号。