打卡day8 knn實現約會問題

2021-10-05 18:18:40 字數 3980 閱讀 9843

其中資料集:dataset.txt需要和本py檔案放到乙個檔案目錄

#_*_coding:utf-8_*_

import numpy as np

import operator

"""函式說明:knn演算法

parameters:

inx-用於分類的資料(測試集)

dataset - 用於訓練的資料

labels-分類標籤

k-knn演算法引數,選擇距離最小的k個點

returns:

sortedclasscount[0][0]

"""def

classfy0

(inx,dataset,labels,k)

:#numpy函式shape[0]返回dataset的行數

datasetsize = dataset.shape[0]

#在列向量方向上重複inx共1次(橫向),行向量方向上重複inx共datasetsize次(縱向)

diffmat = np.tile(inx,

(datasetsize,1)

)- dataset

#二維特徵相減之後求平方

sqdiffmat = diffmat **

2#sum()所有元素相加,sum(0):列相加,sum(1):行相加

sqdistances = sqdiffmat.

sum(axis=1)

distances = sqdistances **

0.5#返回distances中元素從小到大排序後的索引值

sorteddistances = distances.argsort(

)#定義乙個記錄類別次數的字典

classcount =

for i in

range

(k):

#取出前k個元素的類別

votelabels = labels[sorteddistances[i]

]#dict.get(key,default=none),字典的get()方法,返回指定鍵的值,如果值不在字典中則返回預設值

#計算類別次數

classcount[votelabels]

= classcount.get(votelabels,0)

+1#key=operator.itemgetter(1)根據字典的值進行排序

#key=operator.itemgetter(0)根據字典的鍵進行排序

sortedclasscount =

sorted

(classcount.items(

),key=operator.itemgetter(1)

,reverse=

true

)return sortedclasscount[0]

[0]"""

函式說明:開啟解析檔案,對資料進行分類:1代表不喜歡,2代表魅力一般,3代表極具魅力

parameter:

filename-檔名

returns:

returnmat-特徵矩陣

classlabelvector-分類器label向量

"""def

file2matrix

(filename)

:#開啟檔案

fr =

open

(filename)

#按行讀取檔案所有內容

arrayolines = fr.readlines(

)#得到檔案行數

numberoflines =

len(arrayolines)

#返回numpy矩陣,解析完成的資料:numberoflines行,3列

returnmat = np.zeros(

(numberoflines,3)

)#返回分類標籤向量

classlabelvector =

#行的索引

index=

0for line in arrayolines:

#s.strip(rm),當re空時,預設刪除空白符(包括'\n','\r』,\t』)

line = line.strip(

)#s.split(str = "",num = string,cout(str))將字串根據『\t』分隔符進行切片

listfromline = line.split(

'\t'

)#將資料前三列提取出來,存放到returnmat的np矩陣中,也就是特徵矩陣

returnmat[index,:]

= listfromline[0:

3]#根據文字中的標記的喜歡的程度進行分類。

if listfromline[-1

]=='didntlike':1

)elif listfromline[-1

]=='smalldoses':2

)elif listfromline[-1

]=='largedoses':3

) index+=

1return returnmat,classlabelvector

"""函式說明:對資料進行歸一化

parameters:

dataset-特徵矩陣

returns:

normdataset-歸一化後的特徵矩陣

ranges-資料範圍

minvals-資料最小值

"""def

autonorm

(dataset)

:#獲取資料的最小值

minvals = dataset.

min(

) maxvals = dataset.

max(

) ranges = maxvals - minvals

normdataset = np.zeros(np.shape(dataset)

) m = dataset.shape[0]

normdataset = dataset - np.tile(minvals,

(m,1))

normdataset = normdataset / np.tile(ranges,

(m,1))

return normdataset,ranges,minvals

"""通過輸入乙個三維特徵,進行分類輸出

"""def

classfyperson()

: resultlist =

['討厭'

,'有些喜歡'

,'非常喜歡'

]#三維特徵使用者輸入

precenttats =

float

(input()

) ffmiles =

float

(input

("每年獲得的飛行常客里程數:"))

icecream =

float

(input

("每週消費的冰激凌公升數:"))

filename =

"datingtestset.txt"

datingdatamat,datinglabels = file2matrix(filename)

normmat,ranges,minvals = autonorm(datingdatamat)

inarr = np.array(

[ffmiles,precenttats,icecream]

) norminarr =

(inarr - minvals)

/ ranges

classfierresult = classfy0(norminarr,normmat,datinglabels,3)

print

("你可能%s這個人"

%(resultlist[classfierresult -1]

))if __name__ ==

'__main__'

: classfyperson(

)

每日打卡 Day8 密碼問題 C 實現

網上流傳一句話 常在網上飄啊,哪能不挨刀啊 其實要想能安安心心地上網其實也不難,學點安全知識就可以。首先,我們就要設定乙個安全的密碼。那什麼樣的密碼才叫安全的呢?一般來說乙個比較安全的密碼至少應該滿足下面兩個條件 1 密碼長度大於等於8,且不要超過16。2 密碼中的字元應該來自下面 字元類別 中四組...

洛谷打卡Day 8

題目描述 這次期末考試,kkksc03 需要考 4 科。因此要開始刷習題集,每科都有乙個習題集,分別有 s1,s2,s3,s4道題目,完成每道題目需要一些時間,可能不等 a1,a2,b1,b2,bs,c1,c2,cs,d1,d2,ds kkksc03 有乙個能力,他的左右兩個大腦可以同時計算 2 道...

每日打卡 Day21 單詞搜尋 C 實現

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced 返回 ...