文章原創(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ù)文中的源代碼案例,具體如下:
- 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ù)信息.
- 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ù)信息.
- 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')
- 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è)置的是字體的大小寨昙。