【机器学习实战系列】读书笔记之KNN算法(四)

构建完整的可用系统,即书上的约会网站测试

直接贴出代码:

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.......

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值