機器學(xué)習(xí):推薦系統(tǒng)(三. 了解我們的工具)

Getting to know our tools

注:這節(jié)沒什么內(nèi)容哈,各位同學(xué)過一眼就可以了。

目錄

1.NumPy, SciPy, 和 pandas
2.在向量中思考:如何高效地處理大型數(shù)據(jù)集

1.NumPy, SciPy, and pandas

Python是一種流行的機器學(xué)習(xí)編程語言。除了是一個非常好用的語言之外,Python還是非常受歡迎的,因為許多最好的機器學(xué)習(xí)庫都是為它編寫的。對于這個類,我們將使用其中三個庫。首先,我們將使用NumPy。 NumPy是一個庫,允許您高效地加載和處理大型數(shù)據(jù)集和內(nèi)存。它是免費的,開源的,在硅谷的許多商業(yè)系統(tǒng)中被廣泛使用。這是許多其他機器學(xué)習(xí)庫建立的基礎(chǔ)。接下來,我們將使用SciPy。
SciPy提供了許多基本的科學(xué)計算功能。我們將使用其數(shù)值優(yōu)化功能來幫助計算用戶的推薦產(chǎn)品。
最后,我們也會用pandas。pandas可以讓您將您的數(shù)據(jù)表示為一個虛擬電子表格。它提供了許多與Microsoft Excel中相同的功能,用于快速編輯數(shù)據(jù)和執(zhí)行計算。這使得處理數(shù)據(jù)存儲和CSV文件變得非常簡單。名稱pandas來自術(shù)語面板數(shù)據(jù),因為它將數(shù)據(jù)表示為一系列面板或電子表格頁面。
它也是免費的,開源的,并被廣泛使用。最好的部分是所有這些庫完美地結(jié)合在一起。 SciPy提供了基本的數(shù)值優(yōu)化程序,NumPy讓我們可以高效地加載和使用我們的數(shù)據(jù)集,pandas給了我們額外的功能,使我們的數(shù)據(jù)集計算變得簡單。

2.在向量中思考:如何高效地處理大型數(shù)據(jù)集

在機器學(xué)習(xí)中,我們經(jīng)常使用大數(shù)據(jù)數(shù)組。由于機器學(xué)習(xí)的線性代數(shù)根(linear algebra roots),這些數(shù)組有時被稱為單個數(shù)據(jù)列的向量和較大數(shù)組的向量。讓我們看看如何在代碼中使用向量。讓我們打開vecotors pt1.py。

這里有一個簡單的數(shù)組,或者向量,表示訓(xùn)練數(shù)據(jù)集中每套房的面積。當(dāng)我們訓(xùn)練機器學(xué)習(xí)算法時,我們經(jīng)常需要在訓(xùn)練數(shù)據(jù)集中的每一行應(yīng)用相同的數(shù)學(xué)運算。例如,假設(shè)我們要將每個面積乘以0.3的權(quán)重。

完成這個事情最高效的方法是什么?在傳統(tǒng)的編程中,標(biāo)準(zhǔn)的解決方案是每次一行遍歷數(shù)組,一個for循環(huán)搞定。讓我們運行代碼并檢查輸出。在控制臺中,我們可以看到它在得到最終結(jié)果之前對數(shù)組進(jìn)行了13次獨立的更新。這樣做是沒毛病的,但每次在數(shù)組中一個元素上對每個元素進(jìn)行乘法實際上效率很低。如今的CPU有能力并行批量操作。

這種能力稱為單指令、多數(shù)據(jù)或SIMD。而不是一次一個地遍歷每個數(shù)組元素,CPU可以將數(shù)組塊加載到內(nèi)存中,并在一步中完成該塊上的所有乘法操作。這在處理大型數(shù)組時速度會產(chǎn)生巨大的差異。讓我們來看看代碼vecotors pt2.py。

我們不使用循環(huán)來處理數(shù)組,而是使用一個數(shù)組庫,它知道如何并行處理數(shù)據(jù)。NumPy可以在內(nèi)存中非常高效地創(chuàng)建數(shù)組, 然后會自動并行化。

因此,我們不使用for循環(huán),我們的代碼看起來如下所示。

首先我們創(chuàng)建的數(shù)組作為NumPy數(shù)組而不是作為一個正常的Python數(shù)組。然后我們會將整個數(shù)組乘以0.3。當(dāng)我們告訴NumPy要把一個數(shù)組乘以一個單個的數(shù)字時,NumPy會將此操作分別應(yīng)用于數(shù)組中的每一個元素。讓我們來運行代碼看看效果。

哪種方法更高效?相信群眾的眼睛是雪亮的。

但更重要的是,NumPy自動利用CPU的SIMD功能,增加并聯(lián)陣列塊。我們得到與使用for循環(huán)相同的結(jié)果,但我們不需要經(jīng)歷這么多步驟。你在陣列上需要做的大部分操作都可以并行完成。這包括簡單的操作比如加法,減法,乘法,和除法,甚至更復(fù)雜的操作,如正弦和余弦。這就是所謂的矢量化我們的代碼。我們用可并行執(zhí)行的向量操作代替迭代循環(huán)。這是非常重要的一點。

如果你發(fā)現(xiàn)自己為數(shù)組寫了一個for循環(huán),那么你可能out了。相反,你應(yīng)該使用numpy來操作整個數(shù)組。

結(jié)語

如有錯誤請高手指正.

你的 關(guān)注-收藏-轉(zhuǎn)發(fā) 是我繼續(xù)分享的動力!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容