KNN演算法預測約會是否成功
阿新 • • 發佈:2018-11-20
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
你可能非常喜歡這個人