1. 程式人生 > >KNN演算法預測約會是否成功

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


你可能非常喜歡這個人