【python】kNN基础算法--推荐系统(辅助研究)


# -*- coding:utf-8 -*-
# import numpy as np  #import numpy 和from numpy import *是不一样的
#
#                         # import numpy,如果你使用numpy的属性都需要在前面加上numpy
#                         #
#                         # from numpy import * ,则不需要加入numpy
#                         #
#                         # 后者不建议使用,如果你下次引用和numpy里的函数一样的情况,就会出现命名冲突
#                         # 举个例子:将列表[1,2,3,4,5,6,7]生成numpy的数组[1 2 3 4 5 6 7]
#                         #
#                         # import numpy
#                         #
#                         # arr = numpy.array([1,2,3,4,5,6,7])
#                         #
#                         # print(arr)
#                         #
#                         # from numpy import *
#                         #
#                         # arr = array([1,2,3,4,5,6,7])
#                         #
#                         # print(arr)
#
# x=np.array([[0,0],[1,1],[2,2]])  #二维数组,从集合的角度看,数组是单聚体,必须用[]套起来
# inX = np.array([0,0])
# #print x[1][1]      #二维数组的引用,输出结果是1
#
# wide = x.shape[0]
# #print wide          #输出结果是3,注意shape不是np里的东西,shape表示集合里有多少个元素
# diffMat = np.tile(inX,(wide,1))-x   #使用import有个好处是可以查看,直接用np.,这里的函数就出来了
# #print diffMat                 #输出[[0 0][-1 -1][-2 -2]]
# # #tile是创造0数组的,(wide,1)是取最小的那个进行复制,1表示原数
# b=diffMat.sum(axis=1)     #把二元数组里的数值相加,并生成一维数组
# #print b                  #输出  [0 -2 -4]
# bb=np.array([1,23,4,32,23,-4,23])   #一维数组标配([])
# c=bb.argsort()             #输出[2 1 0],输出的是从小到大的数据的位置
# #print c
# labels = ['A','B','C','D','E','F','G']
# for i in range(7):
#     d=labels[c[i]]   #把顺序复制到labels标签里
#     #print d         #输出F A C B E G D,使用pycharm不会自动打印结果,需要使用print
#
# import os
# #def file2matrix(filename):
#最好把自己要打开的文件放在当前pycha环境路径下
a = open('datingTestSet.txt')   #python里面的前置空格很重要,要注意,不然容易出bug,特别是前面是for,下面向跳出的时候
arrayOLines = a.readlines()   #这个readlines是获得了每行的数据,一般可以通过for/print打印出来
# print arrayOLines
numberOfLines = len(arrayOLines)   #获得文本有多少行
# print numberOfLines
import numpy as np
returnMat = np.zeros((numberOfLines,3))   #zeros的函数是(行,列)
# print returnMat
classLabelVector=[]
for line in arrayOLines:
    line = line.strip() #  strip是清理门户用的
    # 声明:s为字符串,rm为要删除的字符序列
    # s.strip(rm)
    # 删除s字符串中开头、结尾处,位于
    # rm删除序列的字符
    # s.lstrip(rm)
    # 删除s字符串中开头处,位于
    # rm删除序列的字符
    # s.rstrip(rm)
    # 删除s字符串中结尾处,位于
    # rm删除序列的字符
    # 注意:
    # 1.
    # 当rm为空时,默认删除空白符(包括
    # '\n', '\r', '\t', ' ')
    # print line
    listFromLine = line.split('\t')
    #split是个好函数,split():拆分字符串。通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)
    # print listFromLine
    returnMat[0,:] = listFromLine[0:3]
    # print returnMat
    # classLabelVector.append(int(listFromLine[-1]))  #使用append之前要定义一个空的矩阵
    # list.append(object)
    # 向列表中添加一个对象object
    # list.extend(sequence)
    # 把一个序列seq的内容添加到列表中
    # music_media = ['compact disc', '8-track tape', 'long playing record']
    # new_media = ['DVD Audio disc', 'Super Audio CD']
    # music_media.append(new_media)
    # print music_media
    # >> > ['compact disc', '8-track tape', 'long playing record', ['DVD Audio disc', 'Super Audio CD']]
    # 使用append的时候,是将new_media看作一个对象,整体打包添加到music_media对象中。

from numpy import *
def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))  #创建新的返回矩阵
    m = dataSet.shape[0]   #得到数据集的行数  shape方法用来得到矩阵或数组的维数
    normDataSet = dataSet - tile(minVals,(m,1))  #tile:numpy中的函数。tile将原来的一个数组minVals,扩充成了m行1列的数组
    normDataSet = normDataSet/tile(ranges,(m,1))
    return normDataSet,ranges,minVals




#
# def autoNorm(dataSet):
#     # 将每列的最小值放在minVals中
#     minVals = dataSet.min(0)
#     # 将每列的最大值放在maxVals中
#     maxVals = dataSet.max(0)
#     # 计算可能的取值范围
#     ranges = maxVals - minVals
#     # 创建新的返回矩阵
#     normDataSet = zeros(shape(dataSet))
#     # 得到数据集的行数  shape方法用来得到矩阵或数组的维数
#     m = dataSet.shape[0]
#     # tile:numpy中的函数。tile将原来的一个数组minVals,扩充成了m行1列的数组
#     # 矩阵中所有的值减去最小值
#     normDataSet = dataSet - tile(minVals, (m, 1))
#     # 矩阵中所有的值除以最大取值范围进行归一化
#     normDataSet = normDataSet / tile(ranges, (m, 1))
#     # 返回归一矩阵 取值范围 和最小值
#     return normDataSet, ranges, minVals


def datingClassTest():
    hoRatio = 0.10