機器學習實戰(zhàn)(二)k-臨近算法 - 約會網(wǎng)站的配對效果

什么是K-臨近算法

測量不同特征值之間的距離方法進行分類


工作原理

  • 存在一個訓練樣本集即舌,樣本集中每一數(shù)據(jù)與所屬分類的對應關系
  • 輸入沒有標簽的新數(shù)據(jù)后昔园,將新數(shù)據(jù)的每個特征與樣本集中數(shù)據(jù)對應的 特征進行比較,然后算法提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類標簽
  • 通常k是不大于20的整數(shù)芽淡, 最后,選擇k個最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的分類,作為新數(shù)據(jù)的分類

例子

使用打斗和接吻鏡頭數(shù)分類電影
問號位置是該未知電影出現(xiàn)的鏡頭數(shù)圖形化展示

計算未知電影 與樣本集中其他電影的距離

歐式距離計算

按照距離遞增排序鸡典,可以找到k個距離最近的電影


假定k=3,則三個最靠近的電影依次是He’s Not Really into Dudes枪芒、Beautiful Woman 和California Man彻况。k-近鄰算法按照距離最近的三部電影的類型,決定未知電影的類型舅踪,而這三部 電影全是愛情片纽甘,因此我們判定未知電影是愛情片

流程

實操case

pandas實現(xiàn)KNN分類器

import numpy as np
import pandas as pd

#讀取訓練樣本集數(shù)據(jù)
train = pd.read_csv()

#設置columns name
train.columns = []

#設置參數(shù)k
k = 3

#讀取測試集
test = pd.read_csv()
test.columns = []

#分類器函數(shù)
def classify(inX, dataset, labels, k):    
    #計算歐式距離
    normMat, ranges, minVals = norm(dataset)
    diffMat = pd.DataFrame((inX.values-minVals)/ranges -normMat.values, columns=dataset.columns)
    sqDiffMat = diffMat**2   
    sqlDistances = sqDiffMat.sum(axis=1)
    distances = sqlDistances**0.5
    #排序取前k位
    sortedDistIndices = distances.argsort()
    #按頻次返回最高頻label
    k_label = labels.iloc[sortedDistIndices[:k]]
    label_sort = k_label.apply(pd.value_counts)
    res_label = label_sort.index[0]
    return res_label


#歸一化處理
#歐式計算會向大值數(shù)據(jù)傾斜,因此要做歸一處理
def norm(dataset):
    t = pd.DataFrame(dataset.min())
    t_min = pd.DataFrame(t.T, columns=t.index)
    t = pd.DataFrame(dataset.max())
    t_max = pd.DataFrame(t.T, columns=t.index)
    ranges = t_max.values - t_min.values
    normMat = pd.DataFrame((dataset.values - t_min.values)/ranges, columns=dataset.columns)
    return normMat, ranges, t_min.values

classify(test, train[['特征']], train[['分類標簽']], k)

測試:

x = float(input('frequent flier miles earned per year?'))
y = float(input('percentage of time spent playing video games?'))
z = float(input('liters of ice cream consumed per year?'))
Inx = pd.DataFrame({'每年獲得的飛行吵槁担客里程數(shù)':'x, 玩視頻游戲所耗時間百分比':y, '每周所消費的冰淇淋公升數(shù)':z}, index=[0])

classify(Inx, train.iloc[:, :-1], train.iloc[:,-1:], 3)

結果

這里可以使用np.seterr(divide='ignore', invalid='ignore')悍赢,去掉"divide by zero" or "divide by NaN" runtime warning, 但是強烈不建議。。左权。應該有更好的方式判斷分母是否為0或空

pyechars可視化

#散點圖可視化
def scatter_show(dataset, x_name, y_name) -> Scatter:
    c = (Scatter()\
             .add_xaxis(dataset[x_name])\
             .add_yaxis('', 
                        [list(z) for z in zip(dataset[y_name], 
                        dataset['樣本分類'])],
                        label_opts=opts.LabelOpts(is_show=False))\
             .set_global_opts(title_opts=opts.TitleOpts(title="約會網(wǎng)站配對效果-散點圖"),\
                              yaxis_opts=opts.AxisOpts(\
                                   name=y_name, name_location="middle",name_rotate=90, name_gap=70),\
                              xaxis_opts=opts.AxisOpts(\
                                   name=x_name,name_location="middle", name_gap=30),\
    #                              yaxis_opts=opts.AxisOpts(boundary_gap=['20%',True],is_scale='False'),\
    #                              xaxis_opts=opts.AxisOpts(boundary_gap=['20%',True]),\
#                               tooltip_opts=opts.TooltipOpts(formatter=\
#                                             utils.JsCode("function(params) {return params.name + ' : ' + params.value[2];}")),\
                              visualmap_opts=opts.VisualMapOpts(type_="color",
                                                                max_=3, 
                                                                min_=0, 
                                                                dimension=2,
                                                                is_piecewise=True,\
                                                                pieces=[{"value": 1, "label": '不喜歡', "color": '#c7b8a1'},\
                                                                        {"value": 2, "label": '魅力一般', "color": '#7b8b6f'},\
                                                                        {"value": 3, "label": '極具魅力', "color": '#965454'}],\
                                                                pos_left='center', pos_top='6%', orient='horizontal')))
             
    return c

測試:

  • 每年贏得的飛行称ず客里程數(shù)與玩視頻游戲所占百分比的約會數(shù)據(jù)散點圖
scatter_show(train, '玩視頻游戲所耗時間百分比', '每年獲得的飛行常客里程數(shù)').render_notebook()
結果
  • 每周所消費的冰淇淋公升數(shù)與玩視頻游戲所占百分比的約會數(shù)據(jù)散點圖
scatter_show(train, '玩視頻游戲所耗時間百分比', '每年獲得的飛行充套埽客里程數(shù)').render_notebook()
結果
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末胸囱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瀑梗,更是在濱河造成了極大的恐慌烹笔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抛丽,死亡現(xiàn)場離奇詭異谤职,居然都是意外死亡,警方通過查閱死者的電腦和手機亿鲜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門允蜈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒿柳,你說我怎么就攤上這事饶套。” “怎么了垒探?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵妓蛮,是天一觀的道長。 經(jīng)常有香客問我圾叼,道長蛤克,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任夷蚊,我火速辦了婚禮构挤,結果婚禮上,老公的妹妹穿的比我還像新娘惕鼓。我一直安慰自己筋现,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布呜笑。 她就那樣靜靜地躺著夫否,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叫胁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天汞幢,我揣著相機與錄音驼鹅,去河邊找鬼。 笑死,一個胖子當著我的面吹牛输钩,可吹牛的內容都是我干的豺型。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼买乃,長吁一口氣:“原來是場噩夢啊……” “哼姻氨!你這毒婦竟也來了?” 一聲冷哼從身側響起剪验,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肴焊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后功戚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娶眷,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年啸臀,在試婚紗的時候發(fā)現(xiàn)自己被綠了届宠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡乘粒,死狀恐怖豌注,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情灯萍,我是刑警寧澤轧铁,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站竟稳,受9級特大地震影響属桦,放射性物質發(fā)生泄漏。R本人自食惡果不足惜他爸,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一聂宾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诊笤,春花似錦系谐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晾匠,卻和暖如春茶袒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凉馆。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工薪寓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亡资,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓向叉,卻偏偏與公主長得像锥腻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子母谎,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349