劉淑英 鄒燕飛 李依橋 趙瑤瑤 王偉
摘要:約會(huì)網(wǎng)站數(shù)據(jù)量非常大,如何從眾多數(shù)據(jù)對(duì)象中,選擇適合自己的人群,成為數(shù)據(jù)分析中的一個(gè)研究問(wèn)題。本文主要闡述了該模型的具體實(shí)現(xiàn)過(guò)程,主要包括數(shù)據(jù)采集、數(shù)據(jù)歸一化處理、構(gòu)造算法模型、評(píng)估算法模型。通過(guò)采用實(shí)例數(shù)據(jù)集進(jìn)行模型的訓(xùn)練和測(cè)試,實(shí)驗(yàn)結(jié)果表明:該模型能較準(zhǔn)確的進(jìn)行約會(huì)對(duì)象的匹配,測(cè)試誤差較小。
關(guān)鍵詞:機(jī)器學(xué)習(xí);KNN算法;Python
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-9416(2019)10-0128-02
0 引言
如今網(wǎng)站的快速發(fā)展,人們的生活和工作都離不開(kāi)網(wǎng)絡(luò)。人們的生活節(jié)奏也在逐漸加快,工作越來(lái)越忙了。約會(huì)網(wǎng)站吸納了眾多的單身青年參與,積累了大量的用戶資源。而且我國(guó)廣大的上班族群體為約會(huì)網(wǎng)站提供了良好的用戶基礎(chǔ)[1]。一個(gè)好的約會(huì)網(wǎng)站可以帶動(dòng)婚戀等多種產(chǎn)業(yè)的發(fā)展,但是目前的約會(huì)網(wǎng)站對(duì)約會(huì)對(duì)象的數(shù)據(jù)處理有時(shí)候不夠準(zhǔn)確,約會(huì)配對(duì)成功率不夠高。通過(guò)對(duì)網(wǎng)站數(shù)據(jù)進(jìn)行分析,采用KNN算法較好的完成約會(huì)配對(duì),為網(wǎng)站用戶提供較好的服務(wù)。
1 KNN算法
KNN,也稱K-最近鄰居,是機(jī)器學(xué)習(xí)算法最簡(jiǎn)單的一種[2-3]。它既可以用來(lái)分類,也可以是回歸方法。它把實(shí)例的特征向量作為輸入,再計(jì)算訓(xùn)練集與新數(shù)據(jù)特征值之間的距離,之后選出距離k個(gè)最近的分類。如果k=1,最近鄰類就是待測(cè)數(shù)據(jù)。KNN算法主要涉及三個(gè)問(wèn)題:距離度量,k值選擇和分類決策規(guī)則。我們最主要討論分類決策規(guī)則。分類決策規(guī)則就是指多數(shù)投票,或基于距離的加權(quán)投票。由輸入實(shí)例的k個(gè)鄰近訓(xùn)練實(shí)例中的多數(shù)類別決定輸入實(shí)例的類別[4-5]。
2 模型實(shí)現(xiàn)
本模型使用的樣本數(shù)據(jù)一共有1000行,該模型采用80%的數(shù)據(jù)作為訓(xùn)練集,20%的數(shù)據(jù)作為測(cè)試集來(lái)進(jìn)行模型訓(xùn)練,數(shù)據(jù)預(yù)處理使用的方法是歸一化。模型具體實(shí)現(xiàn)分為六個(gè)步驟,分別是采樣數(shù)據(jù)、樣本數(shù)據(jù)可視化、預(yù)處理、獲取模型、模型訓(xùn)練、預(yù)測(cè)。我們的測(cè)試數(shù)據(jù)主要包括婚戀人員的特征,分別是年飛行??屠锍虜?shù)、玩視頻耗時(shí)百分比、周消耗冰激凌公升數(shù),我們首先標(biāo)記此部分?jǐn)?shù)據(jù),1代表一點(diǎn)也不喜歡,2代表有一點(diǎn)喜歡,3代表非常喜歡。為了更直觀的的理解樣本數(shù)據(jù),數(shù)據(jù)采用Matplotlib庫(kù)進(jìn)行繪圖分析,如圖1所示。
2.1 預(yù)處理
根據(jù)前面所述可知,三個(gè)特征值之間的差距有點(diǎn)大,所以在模型訓(xùn)練之前,必須把數(shù)據(jù)放到同一量級(jí),即數(shù)據(jù)預(yù)處理。本模型采用歸一化方法,目的是把不一樣的特征數(shù)據(jù)縮放到相同的一個(gè)相似區(qū)間中。
2.2 獲取模型
該部分功能是獲取模型,也就是構(gòu)造KNN分類器。核心思想就是,如果一個(gè)樣本在特征空間中的k個(gè)最相似的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別。
該過(guò)程通過(guò)計(jì)算各個(gè)訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù)之間的距離,按照距離遞增關(guān)系排序,選取距離最小的k個(gè)點(diǎn),確定k個(gè)點(diǎn)所在類別的出現(xiàn)頻率,返回前k個(gè)點(diǎn)中出現(xiàn)頻率最高的類別作為測(cè)試數(shù)據(jù)的預(yù)測(cè)分類。這樣就構(gòu)造出了KNN分類器。
2.3 模型訓(xùn)練
我們講1000個(gè)樣本數(shù)據(jù)劃分為訓(xùn)練集和測(cè)試集,該部分的核心代碼如下所示。
for i in range(num_test_vecs):
classifier_result = classify0(norm_mat[i, :], norm_mat[num_test_vecs:m, :],
dating_labels[num_test_vecs:m], 4)
if classifier_result != dating_labels[i]:
error_count += 1.0
right_ratio = 1 - error_count / float(num_test_vecs)
2.4 樣例預(yù)測(cè)
該部分功能是對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)分類,用戶輸入待約會(huì)對(duì)象的數(shù)據(jù),預(yù)測(cè)出這條數(shù)據(jù)的分類,可以判斷喜歡程度。核心代碼如下。
def classify_main():
result_list = ['一點(diǎn)也不喜歡', '有點(diǎn)喜歡', '非常喜歡']
ff_miles = float(input("每年獲得的飛行??屠锍虜?shù):"))
percent_tats = float(input("玩視頻游戲所消耗時(shí)間百分比:"))
ice_cream = float(input("每周消費(fèi)的冰淇淋公升數(shù):"))
dating_data_mat,dating_labels = init_data()
norm_mat,diff_dt,min_value = feature_scaling(dating_data_mat)
in_arr = array([ff_miles, percent_tats, ice_cream])
classifier_result = classify0((in_arr - min_value)/diff_dt, norm_mat, dating_labels, 3)
print("你對(duì)這個(gè)人的喜歡程度:",result_list[classifier_result-1])
3 結(jié)語(yǔ)
本文通過(guò)采用KNN算法對(duì)婚戀數(shù)據(jù)數(shù)據(jù)進(jìn)行分析,采用Python數(shù)據(jù)可視化庫(kù)中的函數(shù)和Matplotlib庫(kù)完成對(duì)數(shù)據(jù)的分類。通過(guò)測(cè)試結(jié)果,可知,模型學(xué)習(xí)的準(zhǔn)確率達(dá)到了92%,基本能夠滿足我們的要求。
參考文獻(xiàn)
[1] 黃鶴.關(guān)于我國(guó)婚戀網(wǎng)站網(wǎng)絡(luò)交友的研究[D].武漢:華中師范大學(xué),2011.
[2] 石曉宇.基于Google App Engine的移動(dòng)信息服務(wù)的研究[D].大連:大連理工大學(xué),2011.
[3] 黎爽.基于Python科學(xué)計(jì)算包的金融應(yīng)用實(shí)現(xiàn)[D].南昌:江西財(cái)經(jīng)大學(xué),2017.
[4] 胡元,石冰.基于區(qū)域劃分的KNN文本快速分類算法研究[J].計(jì)算機(jī)科學(xué),2012,39(10):182-186.
[5] 康春花,張淑君,李元白,等.KNN認(rèn)知診斷法及其應(yīng)用[J].江西師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2019,43(02):135-141+159.