构建完整的可用系统,即书上的约会网站测试
直接贴出代码:
from numpy import *
import knn1
def file2matrix(filename):
"""该函数将约会文件内容转换成数据处理格式,返回一个测试特征集(格式二维数组),和测试集类别集(格式列表)
"""
fr = open(filename)
arrayOnLines = fr.readlines()
numberOfLines = len(arrayOnLines) #获取 n=样本的行数
returnMat = zeros((numberOfLines, 3)) #创建一个2维矩阵用于存放训练样本数据,一共有n行,每一行存放3个数据
classLabel = [] #创建一个1维数组用于存放训练样本标签。
for i in range(numberOfLines):
line = arrayOnLines[i]
line = line.strip() # 把回车符号给去掉
listFromLine = line.split('\t') # 把每一行数据用\t分割
returnMat[i, :] = listFromLine[0:3] # 把分割好的数据放至数据集,其中i是该样本数据的下标,就是放到第几行
classLabel.append(int(listFromLine[-1])) # 把该样本对应的标签放至标签集,顺序与样本集对应。
return returnMat, classLabel
def autoNorm(dataSet):
"""该函数将数据集的所以特征归一化,返回归一化后的特征集(格式为数组),特征集最小值(格式为一维数组),特征集范围(格式为一维数组)
Keyword argument:
dataSet -- 特征数据集
"""
# 获取数据集中每一列的最小数值
# 以createDataSet()中的数据为例,group.min(0)=[0,0]
minVals = dataSet.min(axis=0)
# 获取数据集中每一列的最大数值
# group.max(0)=[1, 1.1]
maxVals = dataSet.max(axis=0)
# 最大值与最小的差值
ranges = maxVals - minVals
# 创建一个与dataSet同shape的全0矩阵,用于存放归一化后的数据
normDataSet = zeros(shape(dataSet))
dataSize = dataSet.shape[0]
# 把最小值扩充为与dataSet同shape,然后作差,具体tile请翻看 第三节 代码中的tile
normDataSet = dataSet - tile(minVals, (dataSize, 1))
# 把最大最小差值扩充为dataSet同shape,然后作商,是指对应元素进行除法运算,而不是矩阵除法。
# 矩阵除法在numpy中要用linalg.solve(A,B)
normDataSet = normDataSet / tile(ranges, (dataSize, 1))
return normDataSet, minVals, ranges
#约会网站预测函数
def classifyPerson():
resultList = ['一点都喜欢','喜欢一点','很喜欢']
percentTats = float(input("打电子游戏的时间:?"))
ffMiles = float(input("坐飞机的时间:?"))
iceCream = float(input("吃多少冰淇淋:?"))
datingDataMat,datingLables = file2matrix(filename)
normMat,ranges,minVals = autoNorm(datingDataMat)
inArr = array([ffMiles, percentTats, iceCream])
classifyResult = knn1.classify0((inArr-minVals)/ranges,normMat,datingLables,3)
print("你的喜欢程度:",resultList[classifyResult -1 ])
if __name__ == '__main__':
filename = '/Users/Administrator/Desktop/machine learning inaction/Ch02/datingTestSet2.txt'
classifyPerson()
运行结果如下:
至于出现的warning,应该是分母不能为0的意思,应该是数据哪里出现了错误!
而上面的代码:print("你的喜欢程度:",resultList[classifyResult -1 ])
为什么会出现classifyResult -1 ,那是因为数组都是从0开始的呀,所以要减1
END.......