2-3節(jié) k-近鄰算法-使用 Matplotlib 畫(huà)二維散點(diǎn)圖|優(yōu)化約會(huì)網(wǎng)站的配對(duì)效果項(xiàng)目|機(jī)器學(xué)習(xí)實(shí)戰(zhàn)-學(xué)習(xí)筆記

文章原創(chuàng),最近更新:2018-08-9

本章節(jié)的主要內(nèi)容是:
重點(diǎn)介紹項(xiàng)目案例1: 優(yōu)化約會(huì)網(wǎng)站的配對(duì)效果中的分析數(shù)據(jù):使用 Matplotlib 畫(huà)二維散點(diǎn)圖奢浑。

1.KNN項(xiàng)目案例介紹:

項(xiàng)目案例1:

優(yōu)化約會(huì)網(wǎng)站的配對(duì)效果

項(xiàng)目概述:

1)海倫使用約會(huì)網(wǎng)站尋找約會(huì)對(duì)象呼胚。經(jīng)過(guò)一段時(shí)間之后,她發(fā)現(xiàn)曾交往過(guò)三種類(lèi)型的人: 不喜歡的人渣玲、魅力一般的人、 極具魅力的人。
2)她希望: 1. 工作日與魅力一般的人約會(huì) 2. 周末與極具魅力的人約會(huì) 3. 不喜歡的人則直接排除掉」敛t,F(xiàn)在她收集到了一些約會(huì)網(wǎng)站未曾記錄的數(shù)據(jù)信息奠骄,這更有助于匹配對(duì)象的歸類(lèi)豆同。

開(kāi)發(fā)流程:
  • 收集數(shù)據(jù):提供文本文件
  • 準(zhǔn)備數(shù)據(jù):使用 Python 解析文本文件
  • 分析數(shù)據(jù):使用 Matplotlib 畫(huà)二維散點(diǎn)圖
  • 訓(xùn)練算法:此步驟不適用于 k-近鄰算法
  • 測(cè)試算法:使用海倫提供的部分?jǐn)?shù)據(jù)作為測(cè)試樣本。
    測(cè)試樣本和非測(cè)試樣本的區(qū)別在于:測(cè)試樣本是已經(jīng)完成分類(lèi)的數(shù)據(jù)含鳞,如果預(yù)測(cè)分類(lèi)與實(shí)際類(lèi)別不同影锈,則標(biāo)記為一個(gè)錯(cuò)誤。
  • 使用算法:產(chǎn)生簡(jiǎn)單的命令行程序蝉绷,然后海倫可以輸入一些特征數(shù)據(jù)以判斷對(duì)方是否為自己喜歡的類(lèi)型鸭廷。
數(shù)據(jù)集介紹

海倫把這些約會(huì)對(duì)象的數(shù)據(jù)存放在文本文件 datingTestSet2.txt (數(shù)據(jù)來(lái)源于《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第二章 k鄰近算法)中,總共有 1000 行熔吗。

本文使用的數(shù)據(jù)主要包含以下三種特征:每年獲得的飛行沉敬玻客里程數(shù),玩視頻游戲所耗時(shí)間百分比桅狠,每周消費(fèi)的冰淇淋公升數(shù)讼载。其中分類(lèi)結(jié)果作為文件的第四列轿秧,并且只有3、2维雇、1三種分類(lèi)值淤刃。datingTestSet2.csv文件格式如下所示:

飛行里程數(shù) 游戲耗時(shí)百分比 冰淇淋公升數(shù) 分類(lèi)結(jié)果
40920 8.326976 0.953952 3
14488 7.153469 1.673904 2
26052 1.441871 0.805124 1

數(shù)據(jù)在datingTestSet2.txt文件中的格式如下所示:


2.使用 Matplotlib 畫(huà)二維散點(diǎn)圖

使用Matplotlib創(chuàng)建散點(diǎn)圖,相關(guān)代碼如下:

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

fig=plt.figure()
ax=fig.add_subplot(1,1,1)
datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels),15.0*np.array(datingLabels))
plt.show()

輸出結(jié)果如下:



上圖利用datingLabels存儲(chǔ)的類(lèi)標(biāo)簽屬性,在散點(diǎn)圖上繪制了色彩不等吱型、尺寸不同的點(diǎn)逸贾。因而基本上可以從圖中看到數(shù)據(jù)點(diǎn)所屬三個(gè)樣本分類(lèi)的區(qū)域輪廓。為了得到更好的效果津滞,采用datingDataMat矩陣的屬性列1和2展示數(shù)據(jù)铝侵,并以紅色的'*'表示類(lèi)標(biāo)簽1、藍(lán)色的'o'表示表示類(lèi)標(biāo)簽2触徐、綠色的'+'表示類(lèi)標(biāo)簽3咪鲜,修改參數(shù)如下:

import kNN
import operator
import matplotlib
import matplotlib.pyplot  as plt
import numpy as np
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
group,labels=kNN.createDataSet()
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
#ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels),15.0*np.array(datingLabels))
datingLabels = np.array(datingLabels)
idx_1 = np.where(datingLabels==1)
p1 = ax.scatter(datingDataMat[idx_1,0],datingDataMat[idx_1,1],marker = '*',color = 'r',label='1',s=10)
idx_2 = np.where(datingLabels==2)
p2 = ax.scatter(datingDataMat[idx_2,0],datingDataMat[idx_2,1],marker = 'o',color ='g',label='2',s=20)
idx_3 = np.where(datingLabels==3)
p3 = ax.scatter(datingDataMat[idx_3,0],datingDataMat[idx_3,1],marker = '+',color ='b',label='3',s=30)
plt.xlabel("每年獲取的飛行里程數(shù)",fontproperties=font)
plt.ylabel("玩視頻游戲所消耗的事件百分比",fontproperties=font)
ax.legend((p1,p2,p3),("不喜歡","魅力一般","極具魅力"),loc=2,prop=font)
plt.show()

輸出結(jié)果如下:


3.相關(guān)知識(shí)點(diǎn)

知識(shí)點(diǎn)1:plt.figure()

figure概念的理解,具體如下圖:
我們先理清 figure的概念。用畫(huà)板和畫(huà)紙來(lái)做比喻的話(huà)撞鹉,figure就好像是畫(huà)板疟丙,是畫(huà)紙的載體,但具體畫(huà)畫(huà)等操作是在畫(huà)紙上完成的鸟雏。在pyplot中享郊,畫(huà)紙的概念對(duì)應(yīng)的就是Axes/Subplot。

figure語(yǔ)法說(shuō)明,具體如下:
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

  • num:圖像編號(hào)或名稱(chēng)孝鹊,數(shù)字為編號(hào) 炊琉,字符串為名稱(chēng)
  • figsize:指定figure的寬和高,單位為英寸又活;
  • dpi參數(shù)指定繪圖對(duì)象的分辨率苔咪,即每英寸多少個(gè)像素,缺省值為80
  • facecolor:背景顏色
  • edgecolor:邊框顏色
  • frameon:是否顯示邊框

具體小案例如下:
案例1

import matplotlib.pyplot as plt
 
fig = plt.figure(figsize=(4,3),facecolor="blue")
plt.subplot(221)  
plt.show()

輸出結(jié)果如下:


案例2

import matplotlib.pyplot as plt
 
fig = plt.figure(facecolor="blue")
plt.subplot(221)  
plt.show()

輸出結(jié)果如下:


知識(shí)點(diǎn)2:畫(huà)子圖add_subplot新增子圖

首先要理解一些概念問(wèn)題,具體如下:

  • 子圖:就是在一張figure里面生成多張子圖柳骄。
  • Matplotlib對(duì)象簡(jiǎn)介
    • FigureCanvas:畫(huà)布
    • Figure:圖
    • Axes:坐標(biāo)軸(實(shí)際畫(huà)圖的地方)

add_subplot的參數(shù)與subplots的相似

subplot語(yǔ)法,具體如下:
subplot(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)


備注:subplot可以規(guī)劃figure劃分為n個(gè)子圖团赏,但每條subplot命令只會(huì)創(chuàng)建一個(gè)子圖 。學(xué)習(xí)參考鏈接如下:matplotlib命令與格式:圖像(figure)與子區(qū)域(axes)布局與規(guī)劃

案例1:add_subplot()

import numpy as np
import matplotlib.pyplot as plt
 
x = np.arange(0, 100)
 
fig = plt.figure()
 
ax1 = fig.add_subplot(221)
ax1.plot(x, x)
 
ax2 = fig.add_subplot(222)
ax2.plot(x, -x)
 
ax3 = fig.add_subplot(223)
ax3.plot(x, x ** 2)
 
ax4 = fig.add_subplot(224)
ax4.plot(x, np.log(x))
 
plt.show()

輸出結(jié)果:


案例2:subplot()

import numpy as np
import matplotlib.pyplot as plt
 
x = np.arange(0, 100)
 
plt.subplot(221)
plt.plot(x, x)
 
plt.subplot(222)
plt.plot(x, -x)
 
plt.subplot(223)
plt.plot(x, x ** 2)
 
plt.subplot(224)
plt.plot(x, np.log(x))
 
plt.show()

輸出結(jié)果如下:


add_subplot()與subplot()的區(qū)別:具體可參見(jiàn)python matplotlib中axes與axis的區(qū)別?

知識(shí)點(diǎn)3:scatter(x, y, 點(diǎn)的大小, 顏色夹界,標(biāo)記)

matplotlib模塊中scatter函數(shù)語(yǔ)法及參數(shù)含義:
plt.scatter(x, y, s=20,
c=None, marker='o',
cmap=None, norm=None,
vmin=None, vmax=None,
alpha=None, linewidths=None,
edgecolors=None)

  • x:指定散點(diǎn)圖的x軸數(shù)據(jù)哮塞;
  • y:指定散點(diǎn)圖的y軸數(shù)據(jù)碌上;
  • s:指定散點(diǎn)圖點(diǎn)的大小忘苛,默認(rèn)為20绊寻,通過(guò)傳入新的變量,實(shí)現(xiàn)氣泡圖的繪制复斥;
  • c:指定散點(diǎn)圖點(diǎn)的顏色营密,默認(rèn)為藍(lán)色;
  • marker:指定散點(diǎn)圖點(diǎn)的形狀目锭,默認(rèn)為圓形评汰;
  • cmap:指定色圖纷捞,只有當(dāng)c參數(shù)是一個(gè)浮點(diǎn)型的數(shù)組的時(shí)候才起作用;
  • norm:設(shè)置數(shù)據(jù)亮度被去,標(biāo)準(zhǔn)化到0~1之間主儡,使用該參數(shù)仍需要c為浮點(diǎn)型的數(shù)組;
  • vmin惨缆、vmax:亮度設(shè)置糜值,與norm類(lèi)似,如果使用了norm則該參數(shù)無(wú)效坯墨;
  • alpha:設(shè)置散點(diǎn)的透明度寂汇;
  • linewidths:設(shè)置散點(diǎn)邊界線(xiàn)的寬度;
  • edgecolors:設(shè)置散點(diǎn)邊界線(xiàn)的顏色捣染;
    學(xué)習(xí)參考鏈接:# 從零開(kāi)始學(xué)Python【15】--matplotlib(散點(diǎn)圖)

    scatter(x, y, 點(diǎn)的大小, 顏色骄瓣,標(biāo)記),這是最主要的幾個(gè)用法耍攘,如果括號(hào)中不寫(xiě)s= c=則按默認(rèn)順序榕栏,寫(xiě)了則按規(guī)定的來(lái),不考慮順序.
    案例1
    具體小案例如下:
import matplotlib.pyplot as plt
 
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter([1,2,3,4],[2,4,6,8],[10,20,30,40],['r', 'b','y','k'])   #x蕾各,y臼膏,大小,顏色示损,顏色也可以用隨意的數(shù)字代替,比如[1,2,3,4]表示不同顏色即可嚷硫,具體怎么設(shè)置想要的顏色后續(xù)再研究
plt.show()

輸出結(jié)果如下:


案例2
根據(jù)文中的源代碼案例,具體如下:

  1. scatter(x, y)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels),1

顯示的結(jié)果如下:


總結(jié):
點(diǎn)的大小一樣,未采用色彩或其他的記號(hào)來(lái)標(biāo)記不同樣本分類(lèi)检访,不能很好地理解數(shù)據(jù)信息.

  1. scatter(x, y, 點(diǎn)的大小)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels))

總結(jié):
點(diǎn)的大小不一樣,未采用色彩或其他的記號(hào)來(lái)標(biāo)記不同樣本分類(lèi),不能很好地理解數(shù)據(jù)信息.

  1. scatter(x, y, 點(diǎn)的大小, 顏色)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels),15.0*np.array(datingLabels)) #參數(shù)分別代表x仔掸,y

輸出結(jié)果如下:



點(diǎn)的大小不一樣,采用色彩或其他的記號(hào)來(lái)標(biāo)記不同樣本分類(lèi)脆贵,能很好地理解數(shù)據(jù)信息.

知識(shí)點(diǎn)4:plt.xlabel()與plt.ylabel()

xlabel、ylabel:分別設(shè)置X起暮、Y軸的標(biāo)題文字卖氨。

知識(shí)點(diǎn)5:legend()

legend:顯示圖示,即圖中表示每條曲線(xiàn)的標(biāo)簽(label)和樣式的矩形區(qū)域负懦。
參考鏈接:matplotlib命令與格式:圖例legend語(yǔ)法及設(shè)置

legend語(yǔ)法參數(shù)如下: matplotlib.pyplot.legend(*args, **kwargs)

  • loc:圖例所有figure位置
    plt.legend(loc='lower left')
loc相關(guān)參數(shù)
  • prop:字體參數(shù)

知識(shí)點(diǎn)6:np.where()

numpy.where(condition[, x, y])

  • 這里x,y是可選參數(shù)筒捺,condition是條件,這三個(gè)輸入?yún)?shù)都是array_like的形式纸厉;而且三者的維度相同
  • 當(dāng)conditon的某個(gè)位置的為true時(shí)系吭,輸出x的對(duì)應(yīng)位置的元素,否則選擇y對(duì)應(yīng)位置的元素颗品;
  • 如果只有參數(shù)condition肯尺,則函數(shù)返回為true的元素的坐標(biāo)位置信息沃缘;
    學(xué)習(xí)參考鏈接:怎么理解numpy的where()?

而本章的源代碼就是第二種情況,具體小案例如下:
np.where(x)輸出的是九個(gè)不為0的數(shù)(為真的數(shù)的坐標(biāo)则吟,第一個(gè)array[]是橫坐標(biāo)槐臀,第二個(gè)array[]是縱坐標(biāo).

x=np.array([[9,1,2],[3,4,5],[6,7,8]])

x
Out[85]: 
array([[9, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

np.where(x)
Out[86]: 
(array([0, 0, 0, 1, 1, 1, 2, 2, 2], dtype=int64),
 array([0, 1, 2, 0, 1, 2, 0, 1, 2], dtype=int64))
x=np.array([[9,1,2],[3,4,5],[6,7,8]])

x[np.where(x)]
Out[88]: array([9, 1, 2, 3, 4, 5, 6, 7, 8])

知識(shí)點(diǎn)7:Matplotlib支持中文的方法

Matplotlib默認(rèn)不支持中文,需要在在python腳本的開(kāi)頭加上下面的代碼:

from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

上面從matplotlib.font_manager字體管理模塊代入FontProperties,然后設(shè)置字體屬性,FontProperties()設(shè)置的是Windows系統(tǒng)自帶的宋體氓仲。關(guān)于Windows字體列表水慨,可以查閱WIKI Windows字體列表size設(shè)置的是字體的大小寨昙。

參考鏈接:編碼訓(xùn)練:Python title()中文標(biāo)題支持

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讥巡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舔哪,更是在濱河造成了極大的恐慌欢顷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捉蚤,死亡現(xiàn)場(chǎng)離奇詭異抬驴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缆巧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)布持,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人陕悬,你說(shuō)我怎么就攤上這事题暖。” “怎么了捉超?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵胧卤,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拼岳,道長(zhǎng)枝誊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任惜纸,我火速辦了婚禮叶撒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耐版。我一直安慰自己祠够,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布粪牲。 她就那樣靜靜地躺著哪审,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虑瀑。 梳的紋絲不亂的頭發(fā)上湿滓,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天滴须,我揣著相機(jī)與錄音,去河邊找鬼叽奥。 笑死扔水,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朝氓。 我是一名探鬼主播魔市,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赵哲!你這毒婦竟也來(lái)了待德?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枫夺,失蹤者是張志新(化名)和其女友劉穎将宪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體橡庞,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡较坛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扒最。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丑勤。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吧趣,靈堂內(nèi)的尸體忽然破棺而出法竞,到底是詐尸還是另有隱情,我是刑警寧澤强挫,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布爪喘,位于F島的核電站,受9級(jí)特大地震影響纠拔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泛豪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一稠诲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诡曙,春花似錦臀叙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至慎璧,卻和暖如春床嫌,著一層夾襖步出監(jiān)牢的瞬間跨释,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工厌处, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳖谈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓阔涉,卻偏偏與公主長(zhǎng)得像缆娃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瑰排,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容