KNN算法预测约会是否成功

import numpy as np
import operator
"""
    函数说明:打开并解析文件,对数据进行分类:1 代表不喜欢  2 魅力一般  3  魅力十足
    Parameters:
        filename - 文件名
    Returns:
        
"""
def file2matrix(filename):
#     打开文件
    fr=open(filename)
#     读取文件中所有内容
    arrayOLines=fr.readlines();
#     display(arrayOLines)
# 得到文件总行数
    numberOfLines=len(arrayOLines);
#     display(numberOfLines)
#     返回值都是0的 numberOfLines行  3列的矩阵
    returnMat=np.zeros((numberOfLines,3))
#     display(returnMat)
# 返回分类标签向量  把默认的didntLike smallDoses largeDoses变成对应的1,2,3数值
    classLabeVector=[]
#     行的索引
    index = 0
#     遍历读取出来的所有数据
    for line in arrayOLines:
#         删除每一行数据后面的 \n  
        line =line.strip()
#         display(line)
        listFromLine=line.split('\t')
#         display(listFromLine)
        returnMat[index,:]=listFromLine[0:3]
        if listFromLine[-1] == 'didntLike':
            classLabeVector.append(1)
        elif listFromLine[-1] == 'smallDoses':
            classLabeVector.append(2)
        elif listFromLine[-1] == 'largeDoses':
            classLabeVector.append(3)
        index+=1
        
    return returnMat, classLabeVector
"""
    函数说明:对数据进行归一化
    Parameters:
        dataSet - 特征矩阵
    Returns:
        normDataSet - 归一化后的特征矩阵
        ranges - 数据范围
        minVals - 数据最小值
"""
def autoNorm(dataSet):
#     获取数据每一列的最小值
    minVals=dataSet.min(0)
#     display(minVals)
#     获取数据每一列的最大值
    maxVals=dataSet.max(0)
#     display(maxVals)
#     最大值跟最小值的范围
    ranges=maxVals-minVals
#     display(ranges)
#     np.shape返回dataset矩阵的行列   然后创建一个值都是0的同样行列的矩阵
    normDataSet=np.zeros(np.shape(dataSet))
#     display(normDataSet)
#     返回dataSet的行数
    m=dataSet.shape[0]
#     display(m)
#     原始值减去每一列的最小值
    normDataSet=dataSet-np.tile(minVals,(m,1))
#     display(np.tile(ranges,(m,1)))
#   除以最大值和最小值的差  得到归一化的数据
    normDataSet=normDataSet/np.tile(ranges,(m,1))
#     display(normDataSet)
    return normDataSet,ranges,minVals
# 导包
from sklearn.neighbors import KNeighborsClassifier
def classify1(inx,dataSet,labels,k):
#     display([inx],dataSet,np.array(labels))
    knn=KNeighborsClassifier()
    knn.fit(dataSet,np.array(labels))
    res=knn.predict([inx])
#     res=knn.predict(inx)
    display(res[0])
    return res[0]
"""
    函数说明:
        通过输入一个人的三围特征,进行分类输出
"""
def classifyPer():
#     输出结果
    resultList=['讨厌','有点喜欢','非常喜欢']
#     特征输入
    precentTats=float(input("玩视频游戏所耗时间百分比:"))
    ffMiles=float(input("每年出行里程数:"))
    iceCream=float(input("每周消耗的冰淇淋升数:"))
#     precentTats=4.875435
#     ffMiles=5569
#     iceCream=0.728658
#     打开的文件名
    filename="datingTestSet.txt"
#     调用file2matrix函数
    datingDataMat,datingLabels=file2matrix(filename)
#   训练集归一化  
    normMat,ranges,minVals=autoNorm(datingDataMat)
#     display(normMat,ranges,minVals)
#     将测试集生成numpy数组
    inArr=np.array([ffMiles,precentTats,iceCream])
#     display(inArr)
#     测试集归一化
    norminArr=(inArr-minVals)/ranges
#     display(norminArr)
#   返回的分类结果  1  2  3
#     classifierResult=classify0(norminArr,normMat,datingLabels,3)
#     display(np.array(datingLabels))
    classifierResult=classify1(norminArr,normMat,datingLabels,3)
    display(classifierResult)
#     打印下结果
    print("你可能%s这个人"%(resultList[classifierResult-1]))
if __name__ == '__main__':
    classifyPer()
玩视频游戏所耗时间百分比:10
每年出行里程数:40000
每周消耗的冰淇淋升数:0.1



3



3


你可能非常喜欢这个人

猜你喜欢

转载自blog.csdn.net/weixin_40903057/article/details/84283225