scikit learn機(jī)器學(xué)習(xí)(常用算法原理及編程實(shí)戰(zhàn))上部_第1頁
scikit learn機(jī)器學(xué)習(xí)(常用算法原理及編程實(shí)戰(zhàn))上部_第2頁
scikit learn機(jī)器學(xué)習(xí)(常用算法原理及編程實(shí)戰(zhàn))上部_第3頁
scikit learn機(jī)器學(xué)習(xí)(常用算法原理及編程實(shí)戰(zhàn))上部_第4頁
scikit learn機(jī)器學(xué)習(xí)(常用算法原理及編程實(shí)戰(zhàn))上部_第5頁
已閱讀5頁,還剩102頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

scikitlearn機(jī)器學(xué)習(xí)(常用算法原理及編程實(shí)戰(zhàn))上部1-5章目錄TOC\h\h第1章機(jī)器學(xué)習(xí)介紹\h1.1什么是機(jī)器學(xué)習(xí)\h1.2機(jī)器學(xué)習(xí)有什么用\h1.3機(jī)器學(xué)習(xí)的分類\h1.4機(jī)器學(xué)習(xí)應(yīng)用開發(fā)的典型步驟\h1.4.1數(shù)據(jù)采集和標(biāo)記\h1.4.2數(shù)據(jù)清洗\h1.4.3特征選擇\h1.4.4模型選擇\h1.4.5模型訓(xùn)練和測(cè)試\h1.4.6模型性能評(píng)估和優(yōu)化\h1.4.7模型使用\h1.5復(fù)習(xí)題\h第2章Python機(jī)器學(xué)習(xí)軟件包\h2.1開發(fā)環(huán)境搭建\h2.2IPython簡(jiǎn)介\h2.2.1IPython基礎(chǔ)\h2.2.2IPython圖形界面\h2.3Numpy簡(jiǎn)介\h2.3.1Numpy數(shù)組\h2.3.2Numpy運(yùn)算\h2.4Pandas簡(jiǎn)介\h2.4.1基本數(shù)據(jù)結(jié)構(gòu)\h2.4.2數(shù)據(jù)排序\h2.4.3數(shù)據(jù)訪問\h2.4.4時(shí)間序列\(zhòng)h2.4.5數(shù)據(jù)可視化\h2.4.6文件讀寫\h2.5Matplotlib簡(jiǎn)介\h2.5.1圖形樣式\h2.5.2圖形對(duì)象\h2.5.3畫圖操作\h2.6scikit-learn簡(jiǎn)介\h2.6.1scikit-learn示例\h2.6.2scikit-learn一般性原理和通用規(guī)則\h2.7復(fù)習(xí)題\h2.8拓展學(xué)習(xí)資源\h第3章機(jī)器學(xué)習(xí)理論基礎(chǔ)\h3.1過擬合和欠擬合\h3.2成本函數(shù)\h3.3模型準(zhǔn)確性\h3.3.1模型性能的不同表述方式\h3.3.2交叉驗(yàn)證數(shù)據(jù)集\h3.4學(xué)習(xí)曲線\h3.4.1實(shí)例:畫出學(xué)習(xí)曲線\h3.4.2過擬合和欠擬合的特征\h3.5算法模型性能優(yōu)化\h3.6查準(zhǔn)率和召回率\h3.7F1Score\h3.8復(fù)習(xí)題\h第4章k-近鄰算法\h4.1算法原理\h4.1.1算法優(yōu)缺點(diǎn)\h4.1.2算法參數(shù)\h4.1.3算法的變種\h4.2示例:使用k-近鄰算法進(jìn)行分類\h4.3示例:使用k-近鄰算法進(jìn)行回歸擬合\h4.4實(shí)例:糖尿病預(yù)測(cè)\h4.4.1加載數(shù)據(jù)\h4.4.2模型比較\h4.4.3模型訓(xùn)練及分析\h4.4.4特征選擇及數(shù)據(jù)可視化\h4.5拓展閱讀\h4.5.1如何提高k-近鄰算法的運(yùn)算效率\h4.5.2相關(guān)性測(cè)試\h4.6復(fù)習(xí)題\h第5章線性回歸算法\h5.1算法原理\h5.1.1預(yù)測(cè)函數(shù)\h5.1.2成本函數(shù)\h5.1.3梯度下降算法\h5.2多變量線性回歸算法\h5.2.1預(yù)測(cè)函數(shù)\h5.2.2成本函數(shù)\h5.2.3梯度下降算法\h5.3模型優(yōu)化\h5.3.1多項(xiàng)式與線性回歸\h5.3.2數(shù)據(jù)歸一化\h5.4示例:使用線性回歸算法擬合正弦函數(shù)\h5.5示例:測(cè)算房?jī)r(jià)\h5.5.1輸入特征\h5.5.2模型訓(xùn)練\h5.5.3模型優(yōu)化\h5.5.4學(xué)習(xí)曲線\h5.6拓展閱讀\h5.6.1梯度下降迭代公式推導(dǎo)\h5.6.2隨機(jī)梯度下降算法\h5.6.3標(biāo)準(zhǔn)方程\h5.7復(fù)習(xí)題第1章

機(jī)器學(xué)習(xí)介紹本章簡(jiǎn)要介紹了機(jī)器學(xué)習(xí)的定義、應(yīng)用場(chǎng)景及機(jī)器學(xué)習(xí)的分類,并通過一個(gè)簡(jiǎn)單的示例介紹了機(jī)器學(xué)習(xí)的典型步驟,以及機(jī)器學(xué)習(xí)領(lǐng)域的一些專業(yè)術(shù)語。本章涵蓋的內(nèi)容如下:·機(jī)器學(xué)習(xí)的概念;·機(jī)器學(xué)習(xí)要解決的問題分類;·使用機(jī)器學(xué)習(xí)解決問題的一般性步驟。1.1什么是機(jī)器學(xué)習(xí)機(jī)器學(xué)習(xí)是近年來的一大熱門話題,然而其歷史要倒推到半個(gè)多世紀(jì)之前。1959年ArthurSamuel給機(jī)器學(xué)習(xí)的定義是:Fieldofstudythatgivescomputerstheabilitytolearnwithoutbeingexplicitlyprogrammed即讓計(jì)算機(jī)在沒有被顯式編程的情況下,具備自我學(xué)習(xí)的能力。TomM.Mitchell在操作層面給出了更直觀的定義:AcomputerprogramissaidtolearnfromexperienceEwithrespecttosomeclassoftasksTandperformancemeasureP,ifitsperformanceattasksinT,asmeasuredbyP,improveswithexperienceE.翻譯過來用大白話來說就是:針對(duì)某件事情,計(jì)算機(jī)會(huì)從經(jīng)驗(yàn)中學(xué)習(xí),并且越做越好。從機(jī)器學(xué)習(xí)領(lǐng)域的先驅(qū)和“大牛”們的定義來看,我們可以自己總結(jié)出對(duì)機(jī)器學(xué)習(xí)的理解:機(jī)器學(xué)習(xí)是一個(gè)計(jì)算機(jī)程序,針對(duì)某個(gè)特定的任務(wù),從經(jīng)驗(yàn)中學(xué)習(xí),并且越做越好。從這個(gè)理解上,我們可以得出以下針對(duì)機(jī)器學(xué)習(xí)最重要的內(nèi)容。數(shù)據(jù):經(jīng)驗(yàn)最終要轉(zhuǎn)換為計(jì)算機(jī)能理解的數(shù)據(jù),這樣計(jì)算機(jī)才能從經(jīng)驗(yàn)中學(xué)習(xí)。誰掌握的數(shù)據(jù)量大、質(zhì)量高,誰就占據(jù)了機(jī)器學(xué)習(xí)和人工智能領(lǐng)域最有利的資本。用人類來類比,數(shù)據(jù)就像我們的教育環(huán)境,一個(gè)人要變得聰明,一個(gè)很重要的方面是能享受到優(yōu)質(zhì)的教育。所以,從這個(gè)意義來講,就能理解類似Google這種互聯(lián)網(wǎng)公司開發(fā)出來的機(jī)器學(xué)習(xí)程序性能為什么那么好了,因?yàn)樗麄兡塬@取到海量的數(shù)據(jù)。模型:即算法,是本書要介紹的主要內(nèi)容。有了數(shù)據(jù)之后,可以設(shè)計(jì)一個(gè)模型,讓數(shù)據(jù)作為輸入來訓(xùn)練這個(gè)模型。經(jīng)過訓(xùn)練的模型,最終就成了機(jī)器學(xué)習(xí)的核心,使得模型成為了能產(chǎn)生決策的中樞。一個(gè)經(jīng)過良好訓(xùn)練的模型,當(dāng)輸入一個(gè)新事件時(shí),會(huì)做出適當(dāng)?shù)姆磻?yīng),產(chǎn)生優(yōu)質(zhì)的輸出。1.2機(jī)器學(xué)習(xí)有什么用受益于摩爾定律,隨著計(jì)算機(jī)性能的提高,以及計(jì)算資源變得越來越便宜,機(jī)器學(xué)習(xí)在誕生半個(gè)世紀(jì)后的今天,得到了越來越廣泛的應(yīng)用。你可能感受不到,但是你的日常生活已經(jīng)與人工智能密不可分了。早晨起床,用iPhone打開Siri,問:“今天天氣怎么樣?”。Siri會(huì)自動(dòng)定位到當(dāng)前你所在的城市,并且把天氣信息展現(xiàn)出來。這個(gè)功能用起來很簡(jiǎn)單,但其背后的系統(tǒng)是異常復(fù)雜的。其一是語音識(shí)別,這是機(jī)器學(xué)習(xí)最早的應(yīng)用研究領(lǐng)域,Siri需要先把你說的話轉(zhuǎn)換為文字。大家知道,語音從本質(zhì)上是一系列幅度不同的波,要轉(zhuǎn)換為文字,就需要設(shè)計(jì)一個(gè)模型,先通過大量的語音輸入來訓(xùn)練這個(gè)模型,等模型訓(xùn)練好了,把語音作為輸入,就可以輸出文字了。語音識(shí)別在20世紀(jì)50年代就開始研究了,其模型是不斷演變的。一個(gè)比較大的演變,就是由基于模式識(shí)別的算法演變?yōu)榛诮y(tǒng)計(jì)模型的算法,這一轉(zhuǎn)變大大提高了語音識(shí)別的準(zhǔn)確率。其二是自然語言處理,這是機(jī)器學(xué)習(xí)和人工智能又一個(gè)非常重要的研究方向。Siri把語音轉(zhuǎn)成文字后,軟件需要理解文字的意思才能給出準(zhǔn)確的回答。要讓計(jì)算機(jī)理解文字可不是簡(jiǎn)單的事情。首先要有大規(guī)模的語料庫,其次要有相應(yīng)的語言模型,然后通過語料庫來訓(xùn)練語言模型,最終才能理解文字的部分語義。關(guān)于自然語言處理以及搜索引擎的相關(guān)技術(shù),可以參閱吳軍老師的《數(shù)學(xué)之美》,這是一本把高深的數(shù)學(xué)講得通俗易懂、妙趣橫生的科普讀物。我們接著講前面起床的故事。在洗漱期間,你抽空瀏覽手機(jī)上的新聞,發(fā)現(xiàn)新聞下方有感興趣的行車記錄儀的廣告,點(diǎn)進(jìn)去后打開了某知名電商網(wǎng)站,你看了一下產(chǎn)品的價(jià)格和評(píng)價(jià),順手就買了。接著瀏覽新聞,發(fā)現(xiàn)這個(gè)新聞客戶端越來越人性化,自動(dòng)把你感興趣的IT新聞及體育新聞排在了首頁。好不容易收拾完畢可以出門了,你坐在地鐵上,打開音樂播放器,瀏覽了一遍曲庫,沒有找到特別想聽的歌,于是就讓系統(tǒng)給你推薦一些歌。系統(tǒng)推薦的歌還挺“靠譜”的,雖然很多都沒聽過,但都很對(duì)你的“胃口”。在這段體驗(yàn)描述里,背后的功臣就是推薦系統(tǒng),這也是機(jī)器學(xué)習(xí)的一個(gè)重要應(yīng)用方向。推薦系統(tǒng)的核心,是不斷地學(xué)習(xí)用戶的使用習(xí)慣,從而刻畫出用戶的畫像,根據(jù)用戶的畫像去推薦用戶感興趣的商品和文章。公司新上線了人臉識(shí)別系統(tǒng),在這個(gè)“刷臉”的時(shí)代,已經(jīng)沒有“忘帶工牌”這個(gè)簽卡的借口了。你走到公司大門口,人臉識(shí)別系統(tǒng)自動(dòng)把你識(shí)別出來,然后開門,并準(zhǔn)確地通過語音播報(bào)的方式和你打招呼。目前最先進(jìn)的人臉識(shí)別系統(tǒng)基本上都是基于深度學(xué)習(xí)模型的算法實(shí)現(xiàn)的。這一領(lǐng)域也由早期的傳統(tǒng)方法慢慢地被深度學(xué)習(xí)模型所替代。當(dāng)然,機(jī)器學(xué)習(xí)不止這些應(yīng)用場(chǎng)景。我們?cè)诮榻B具體算法的時(shí)候,會(huì)再詳細(xì)列舉出每個(gè)算法的應(yīng)用場(chǎng)景。延伸閱讀:強(qiáng)人工智能未來學(xué)家RayKurzweil預(yù)言,人類將在2045年實(shí)現(xiàn)強(qiáng)人工智能,就是說到時(shí)人工智能將遠(yuǎn)遠(yuǎn)強(qiáng)于人類。那個(gè)時(shí)候人類與強(qiáng)人工智能的差距,要比螞蟻與人類的差距大幾個(gè)數(shù)量級(jí)。這是個(gè)讓人“腦洞”大開的想象。網(wǎng)上有一篇很火的翻譯過來的文章“為什么最近有很多名人,比如比爾蓋茨,馬斯克、霍金等,讓人們警惕人工智能?”,推薦讀者閱讀一下,其比普通的科幻小說要好看得多。喜歡閱讀英文原文的讀者,可以在\h上搜索“TheAIRevolution”。1.3機(jī)器學(xué)習(xí)的分類機(jī)器學(xué)習(xí)可以分成以下兩類。有監(jiān)督學(xué)習(xí)(Supervisedlearning)通過大量已知的輸入和輸出相配對(duì)的數(shù)據(jù),讓計(jì)算機(jī)從中學(xué)習(xí)出規(guī)律,從而能針對(duì)一個(gè)新的輸入做出合理的輸出預(yù)測(cè)。比如,我們有大量不同特征(面積、地理位置、朝向、開發(fā)商等)的房子的價(jià)格數(shù)據(jù),通過學(xué)習(xí)這些數(shù)據(jù),預(yù)測(cè)一個(gè)已知特征的房子價(jià)格,這種稱為回歸學(xué)習(xí)(Regressionlearning),即輸出結(jié)果是一個(gè)具體的數(shù)值,它的預(yù)測(cè)模型是一個(gè)連續(xù)的函數(shù)。再比如我們有大量的郵件,每個(gè)郵件都已經(jīng)標(biāo)記是否是垃圾郵件。通過學(xué)習(xí)這些已標(biāo)記的郵件數(shù)據(jù),最后得出一個(gè)模型,這個(gè)模型對(duì)新的郵件,能準(zhǔn)確地判斷出該郵件是否是垃圾郵件,這種稱為分類學(xué)習(xí)(Classficationlearning),即輸出結(jié)果是離散的,即要么輸出1表示是垃圾郵件,要么輸出0表示不是垃圾郵件。無監(jiān)督學(xué)習(xí)(Unsupervisedlearning)通過學(xué)習(xí)大量的無標(biāo)記的數(shù)據(jù),去分析出數(shù)據(jù)本身的內(nèi)在特點(diǎn)和結(jié)構(gòu)。比如,我們有大量的用戶購物的歷史記錄信息,從數(shù)據(jù)中去分析用戶的不同類別。針對(duì)這個(gè)問題,我們最終能劃分幾個(gè)類別?每個(gè)類別有哪些特點(diǎn)?我們事先是不知道的。這個(gè)稱為聚類(Clustering)。這里需要特別注意和有監(jiān)督學(xué)習(xí)里的分類的區(qū)別,分類問題是我們已經(jīng)知道了有哪幾種類別;而聚類問題,是我們?cè)诜治鰯?shù)據(jù)之前其實(shí)是不知道有哪些類別的。即分類問題是在已知答案里選擇一個(gè),而聚類問題的答案是未知的,需要利用算法從數(shù)據(jù)里挖掘出數(shù)據(jù)的特點(diǎn)和結(jié)構(gòu)。網(wǎng)絡(luò)上流傳一個(gè)陰謀論:如果你是一個(gè)很好說話的人,網(wǎng)購時(shí)收到有瑕疵的商品的概率會(huì)比較高。為什么呢?理由是電商庫存里會(huì)有一部分有小瑕疵但不影響使用的商品,為了保證這些商品順利地賣出去并且不影響用戶體驗(yàn),不被用戶投訴,他們會(huì)把有瑕疵的商品賣給那些很好說話的人。可問題是,哪些人是好說話的人呢?一個(gè)最簡(jiǎn)單的方法是直接把有小瑕疵的商品寄給一個(gè)用戶,如果這個(gè)用戶沒有投訴或退貨,并且還給出了好評(píng),就說明他是個(gè)好說話的人。還可以通過機(jī)器學(xué)習(xí)來優(yōu)化這一過程。電商網(wǎng)站有你的大量交易記錄和行為記錄,如果你從來沒有投訴過,買之前也不會(huì)和賣家溝通太久,買之后也沒有上網(wǎng)評(píng)價(jià),或者全部給好評(píng),那么機(jī)器學(xué)習(xí)算法從你的行為特征中會(huì)判定你為“好對(duì)付”的人。這樣你就成了電商們的瑕疵商品的傾銷對(duì)象了。在這個(gè)案例中,電商通過用戶的行為和交易數(shù)據(jù),分析出不同的用戶特點(diǎn),如哪些人是“老實(shí)”人、哪些人是有車一族、哪些人是“土豪”、哪些人家里有小孩等。這就屬于無監(jiān)督學(xué)習(xí)的聚類問題。這兩種機(jī)器學(xué)習(xí)類別的最大區(qū)別是,有監(jiān)督學(xué)習(xí)的訓(xùn)練數(shù)據(jù)里有已知的結(jié)果來“監(jiān)督”;而無監(jiān)督學(xué)習(xí)的訓(xùn)練數(shù)據(jù)里沒有結(jié)果“監(jiān)督”,不知道到底能分析出什么樣的結(jié)果。1.4機(jī)器學(xué)習(xí)應(yīng)用開發(fā)的典型步驟本節(jié)通過一個(gè)例子來介紹一下機(jī)器學(xué)習(xí)應(yīng)用開發(fā)的典型步驟,以及機(jī)器學(xué)習(xí)領(lǐng)域的一些常用概念。假設(shè),我們要開發(fā)一個(gè)房?jī)r(jià)評(píng)估系統(tǒng),系統(tǒng)的目標(biāo)是對(duì)一個(gè)已知特征的房子價(jià)格進(jìn)行評(píng)估預(yù)測(cè)。建立這樣一個(gè)系統(tǒng)需要包含以下幾個(gè)步驟。1.4.1數(shù)據(jù)采集和標(biāo)記我們需要大量不同特征的房子和所對(duì)應(yīng)的價(jià)格信息,可以直接從房產(chǎn)評(píng)估中心獲取房子的相關(guān)信息,如房子的面積、地理位置、朝向、價(jià)格等。另外還有一些信息房產(chǎn)評(píng)估中心不一定有,比如房子所在地的學(xué)校情況,這一特征往往會(huì)影響房子的價(jià)格,這個(gè)時(shí)候就需要通過其他途徑收集這些數(shù)據(jù),這些數(shù)據(jù)叫做訓(xùn)練樣本,或數(shù)據(jù)集。房子的面積、地理位置等稱為特征。在數(shù)據(jù)采集階段,需要收集盡量多的特征。特征越全,數(shù)據(jù)越多,訓(xùn)練出來的模型才會(huì)越準(zhǔn)確。通過這個(gè)過程也可以感受到數(shù)據(jù)采集的成本可能是很高的。人們常說石油是黑色的“黃金”,在人工智能時(shí)代,數(shù)據(jù)成了透明的“石油”,這也說明為什么螞蟻金服估值這么高了。螞蟻金服有海量的用戶交易數(shù)據(jù),據(jù)此他們可以計(jì)算出用戶的信用指標(biāo),稱為芝麻信用,根據(jù)芝麻信用給你一定的預(yù)支額,這就是一家新的信用卡公司了。而這還只是單單一個(gè)點(diǎn)的價(jià)值,真正的價(jià)值在于互聯(lián)網(wǎng)金融。在房?jī)r(jià)評(píng)估系統(tǒng)這個(gè)例子里,我們的房子價(jià)格信息是從房產(chǎn)評(píng)估中心獲得的,這一數(shù)據(jù)可能不準(zhǔn)確。有時(shí)為了避稅,房子的評(píng)估價(jià)格會(huì)比房子的真實(shí)交易價(jià)格低很多。這時(shí),就需要采集房子的實(shí)際成交價(jià)格,這一過程稱為數(shù)據(jù)標(biāo)記。標(biāo)記可以是人工標(biāo)記,比如逐個(gè)從房產(chǎn)中介那打聽房子的實(shí)際成交價(jià)格;也可以是自動(dòng)標(biāo)記,比如通過分析數(shù)據(jù),找出房產(chǎn)評(píng)估中心給的房子評(píng)估價(jià)格和真實(shí)成交價(jià)格的匹配關(guān)系,然后直接算出來。數(shù)據(jù)標(biāo)記對(duì)有監(jiān)督的學(xué)習(xí)方法是必須的。比如,針對(duì)垃圾郵件過濾系統(tǒng),我們的訓(xùn)練樣例必須包含這個(gè)郵件是否為垃圾郵件的標(biāo)記數(shù)據(jù)。1.4.2數(shù)據(jù)清洗假設(shè)我們采集到的數(shù)據(jù)里,關(guān)于房子面積,有按平方米計(jì)算的,也有按平方英尺計(jì)算的,這時(shí)需要對(duì)面積單位進(jìn)行統(tǒng)一。這個(gè)過程稱為數(shù)據(jù)清洗。數(shù)據(jù)清洗還包括去掉重復(fù)的數(shù)據(jù)及噪聲數(shù)據(jù),讓數(shù)據(jù)具備結(jié)構(gòu)化特征,以方便作為機(jī)器學(xué)習(xí)算法的輸入。1.4.3特征選擇假設(shè)我們采集到了100個(gè)房子的特征,通過逐個(gè)分析這些特征,最終選擇了30個(gè)特征作為輸入。這個(gè)過程稱為特征選擇。特征選擇的方法之一是人工選擇方法,即對(duì)逐個(gè)特征進(jìn)行人員分析,然后選擇合適的特征集合。另外一個(gè)方法是通過模型來自動(dòng)完成,如本書即將介紹的PCA算法。1.4.4模型選擇房?jī)r(jià)評(píng)估系統(tǒng)是屬于有監(jiān)督學(xué)習(xí)的回歸學(xué)習(xí)類型,我們可以選擇最簡(jiǎn)單的線性方程來模擬。選擇哪個(gè)模型,和問題領(lǐng)域、數(shù)據(jù)量大小、訓(xùn)練時(shí)長、模型的準(zhǔn)確度等多方面有關(guān)。這方面的內(nèi)容將在第3章介紹。1.4.5模型訓(xùn)練和測(cè)試把數(shù)據(jù)集分成訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集,一般按照8:2或7:3來劃分,然后用訓(xùn)練數(shù)據(jù)集來訓(xùn)練模型。訓(xùn)練出參數(shù)后再使用測(cè)試數(shù)據(jù)集來測(cè)試模型的準(zhǔn)確度。為什么要單獨(dú)分出一個(gè)測(cè)試數(shù)據(jù)集來做測(cè)試呢?答案是必須確保測(cè)試的準(zhǔn)確性,即模型的準(zhǔn)確性是要用它“沒見過”的數(shù)據(jù)來測(cè)試,而不能用那些用來訓(xùn)練這個(gè)模型的數(shù)據(jù)來測(cè)試。理論上更合理的數(shù)據(jù)集劃分方案是分成3個(gè),此外還要再加一個(gè)交叉驗(yàn)證數(shù)據(jù)集。相關(guān)內(nèi)容將在第3章介紹。1.4.6模型性能評(píng)估和優(yōu)化模型出來后,我們需要對(duì)機(jī)器學(xué)習(xí)的算法模型進(jìn)行性能評(píng)估。性能評(píng)估包括很多方面,具體如下。訓(xùn)練時(shí)長是指需要花多長時(shí)間來訓(xùn)練這個(gè)模型。對(duì)一些海量數(shù)據(jù)的機(jī)器學(xué)習(xí)應(yīng)用,可能需要1個(gè)月甚至更長的時(shí)間來訓(xùn)練一個(gè)模型,這個(gè)時(shí)候算法的訓(xùn)練性能就變得很重要了。另外,還需要判斷數(shù)據(jù)集是否足夠多,一般而言,對(duì)于復(fù)雜特征的系統(tǒng),訓(xùn)練數(shù)據(jù)集越大越好。然后還需要判斷模型的準(zhǔn)確性,即對(duì)一個(gè)新的數(shù)據(jù)能否準(zhǔn)確地進(jìn)行預(yù)測(cè)。最后需要判斷模型是否能滿足應(yīng)用場(chǎng)景的性能要求,如果不能滿足要求,就需要優(yōu)化,然后繼續(xù)對(duì)模型進(jìn)行訓(xùn)練和評(píng)估,或者更換為其他模型。1.4.7模型使用訓(xùn)練出來的模型可以把參數(shù)保存起來,下次使用時(shí)直接加載即可。一般來講,模型訓(xùn)練需要的計(jì)算量是很大的,也需要較長的時(shí)間來訓(xùn)練,這是因?yàn)橐粋€(gè)好的模型參數(shù),需要對(duì)大型數(shù)據(jù)集進(jìn)行訓(xùn)練后才能得到。而真正使用模型時(shí),其計(jì)算量是比較少的,一般是直接把新樣本作為輸入,然后調(diào)用模型即可得出預(yù)測(cè)結(jié)果。本書的重點(diǎn)放在機(jī)器學(xué)習(xí)的算法介紹以及scikit-learn工具包的使用上。對(duì)數(shù)據(jù)采集、數(shù)據(jù)清洗、特征選擇等內(nèi)容沒有深入介紹,但并不代表這些內(nèi)容不重要。在實(shí)際工程應(yīng)用領(lǐng)域,由于機(jī)器學(xué)習(xí)算法模型只有固定的幾種,而數(shù)據(jù)采集、標(biāo)記、清洗、特征選擇等往往和具體的應(yīng)用場(chǎng)景相關(guān),機(jī)器學(xué)習(xí)工程應(yīng)用領(lǐng)域的工程師打交道更多的反而是這些內(nèi)容。1.5復(fù)習(xí)題1.機(jī)器學(xué)習(xí)分哪兩類?它們之間有什么區(qū)別?2.無監(jiān)督機(jī)器學(xué)習(xí)的優(yōu)勢(shì)有哪些?3.機(jī)器學(xué)習(xí)應(yīng)用開發(fā)的典型步驟有哪些?4.為什么要把數(shù)據(jù)集分成訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集?第2章

Python機(jī)器學(xué)習(xí)軟件包本章介紹了scikit-learn相關(guān)開發(fā)環(huán)境的搭建步驟,以及IPython、Numpy和Pandas、Matplotlib等軟件包的基礎(chǔ)知識(shí),最后通過一個(gè)scikit-learn機(jī)器學(xué)習(xí)實(shí)例,介紹了scikit-learn的一般性原理和通用規(guī)則。本章涵蓋的主要內(nèi)容如下:·搭建Python機(jī)器學(xué)習(xí)編程環(huán)境;·熟悉IPython交互式編程環(huán)境;·熟悉Numpy包的基礎(chǔ)操作;·熟悉Pandas包的基礎(chǔ)操作;·熟悉Matplotlib及常用的畫圖操作;·熟悉scikit-learn軟件包,并完成一個(gè)手寫識(shí)別機(jī)器學(xué)習(xí)程序。2.1開發(fā)環(huán)境搭建若讀者沒有安裝過Python,一個(gè)最簡(jiǎn)單的方式是直接安裝Python針對(duì)科學(xué)計(jì)算而發(fā)布的開發(fā)環(huán)境Anaconda。訪問\hwww.continuum.io/downloads網(wǎng)站,根據(jù)你所使用的操作系統(tǒng)下載合適的版本直接安裝即可。Anaconda里包含了本書要求的所有工具包,包括IPython、Numpy、scipy、Matplotlib和scikit-learn等,針對(duì)主流的操作系統(tǒng)Windows/Linux/Mac都提供了相應(yīng)的安裝包。若讀者已經(jīng)安裝了Python或者覺得Anaconda安裝包太大了,只想安裝需要的工具包,則可以逐個(gè)安裝這些工具包。這里假設(shè)已經(jīng)安裝了Python和pip。那么可以通過pip命令來安裝所需要的工具包:pipinstalljupyternumpymatplotlibscipyscikit-learnseaborn

若讀者沒有安裝pip,可以參閱pip官方網(wǎng)站pip.pypa.io/en/stable/installing,具體步驟是下載get-pip.py文件,然后用python命令執(zhí)行這個(gè)文件即可完成pip的安裝。安裝完成后,可以在終端輸入ipython命令啟動(dòng)IPython,并在IPython環(huán)境檢查我們所需要的工具包的版本號(hào)。這里安裝的工具包及其版本號(hào)如下:$ipython

Python2.7.10(default,Jul302016,19:40:32)

Type"copyright","credits"or"license"formoreinformation.

IPython5.3.0--AnenhancedInteractivePython.

?->IntroductionandoverviewofIPython'sfeatures.

%quickref->Quickreference.

help->Python'sownhelpsystem.

object?->Detailsabout'object',use'object??'forextradetails.

In[1]:importnumpy

In[2]:importmatplotlib

In[3]:importsklearn

In[4]:numpy.__version__

Out[4]:'1.12.0'

In[5]:matplotlib.__version__

Out[5]:'2.0.0'

In[6]:sklearn.__version__

Out[6]:'0.18.1'

·Python:2.7.10;·Ipython:5.3.0;·Numpy:1.12.0;·Matplotlib:2.0.0;·Sklearn:0.18.1。本書所有的示例程序均在上面的環(huán)境中測(cè)試通過。如果讀者要安裝和本書編寫時(shí)一樣的編程環(huán)境,可以下載隨書代碼,找到代碼主目錄,并在主目錄下執(zhí)行pipinstall-rrequirements.txt命令即可。2.2IPython簡(jiǎn)介IPython是公認(rèn)的現(xiàn)代科學(xué)計(jì)算中最重要的Python工具之一。它是一個(gè)加強(qiáng)版的Python交互式命令行工具,與系統(tǒng)自帶的Python交互環(huán)境相比,IPython具有以下明顯的幾個(gè)特點(diǎn):·與Shell緊密關(guān)聯(lián),可以在IPython環(huán)境下直接執(zhí)行Shell指令;·可以直接繪圖操作的WebGUI環(huán)境,在機(jī)器學(xué)習(xí)領(lǐng)域、探索數(shù)據(jù)模式、可視化數(shù)據(jù)、繪制學(xué)習(xí)曲線時(shí),這一功能特別有用;·更強(qiáng)大的交互功能,包括內(nèi)省、Tab鍵自動(dòng)完成、魔術(shù)命令等。2.2.1IPython基礎(chǔ)如果你之前沒有接觸過IPython,那么現(xiàn)在是打開計(jì)算機(jī)體驗(yàn)IPython的絕好時(shí)機(jī),這種提高工作效率類的軟件,單單看書是完全無法體驗(yàn)它的威力和便利性的。正確安裝IPython后,在命令行輸入ipython即可啟動(dòng)IPython交互環(huán)境。$ipython

Python2.7.10(default,Jul302016,19:40:32)

Type"copyright","credits"or"license"formoreinformation.

IPython5.3.0--AnenhancedInteractivePython.

?->IntroductionandoverviewofIPython'sfeatures.

%quickref->Quickreference.

help->Python'sownhelpsystem.

object?->Detailsabout'object',use'object??'forextradetails.

In[1]:

基本上,可以像使用Python交互環(huán)境一樣使用IPython交互環(huán)境:In[1]:a=5

In[2]:a+3

Out[2]:8

跟Python交互環(huán)境相比,IPython的輸出排版更簡(jiǎn)潔、優(yōu)美:In[3]:importnumpyasnp

In[4]:data={i:np.random.randn()foriinrange(8)}

In[5]:data

Out[5]:

{0:-0.12696712293771154,

1:-0.9291628055121173,

2:0.8248356377337012,

3:-0.5381098900612056,

4:2.0246437691867816,

5:-2.089016766007329,

6:1.234086243284236,

7:0.39953080301369065}

對(duì)比一下標(biāo)準(zhǔn)的Python交互環(huán)境下的輸出:>>>importnumpyasnp

>>>data={i:np.random.randn()foriinrange(8)}

>>>data

{0:-0.7989884322559587,1:0.2275777042011071,2:0.012864065192735426,

3:-1.3183480226587958,4:-0.9149466170543599,5:-0.683377363404726,6:

-0.8964451905483575,7:-0.37082447512220285}

>>>

很多時(shí)候,并不是我們不懂審美,而是沒有機(jī)會(huì)發(fā)現(xiàn)美。此外,IPython的Tab鍵自動(dòng)補(bǔ)全功能是提高效率的秘籍。例如,輸入np.random.rand命令后,按Tab鍵,會(huì)自動(dòng)顯示np.random命名空間下以rand開頭的所有函數(shù)。這一功能的便利性趕上了主流IDE。In[6]:np.random.rand<TAB>

np.random.randnp.random.random

np.random.randintnp.random.random_integers

np.random.randnnp.random.random_sample

記住一些快捷鍵,可以讓你在IPython環(huán)境下體驗(yàn)健步如飛的感覺。對(duì)于熟悉Shell命令的讀者,這些命令會(huì)有似曾相識(shí)的感覺。·Ctrl+A:移動(dòng)光標(biāo)到本行的開頭;·Ctrl+E:移動(dòng)光標(biāo)到本行的結(jié)尾;·Ctrl+U:刪除光標(biāo)所在位置之前的所有字符;·Ctrl+K:刪除光標(biāo)所在位置之后的所有字符,包含當(dāng)前光標(biāo)所在的字符;·Ctrl+L:清除當(dāng)前屏幕上顯示的內(nèi)容;·Ctrl+P:以當(dāng)前輸入的字符作為命令的起始字符,在歷史記錄里向后搜索匹配的命令;·Ctrl+N:以當(dāng)前輸入的字符作為命令的起始字符,在歷史記錄里向前搜索匹配的命令;·Ctrl+C:中斷當(dāng)前腳本的執(zhí)行。另外,IPython提供了強(qiáng)大的內(nèi)省功能。在Python交互環(huán)境里,只能使用help()函數(shù)來查閱內(nèi)置文檔,在IPython環(huán)境里可以直接在類或變量后面加上一個(gè)問號(hào)“?”來查閱文檔:In[7]:np.random.randn?

Docstring:

randn(d0,d1,...,dn)

Returnasample(orsamples)fromthe"standardnormal"distribution.

......

在類或變量或函數(shù)后面加兩個(gè)問號(hào)“??”還可以直接查看源代碼。結(jié)合星號(hào)“*”和問號(hào)“?”,還可以查詢命名空間里的所有函數(shù)和對(duì)象。例如,查詢np.random下面以rand開頭的所有函數(shù)和對(duì)象:In[12]:np.random.rand*?

np.random.rand

np.random.randint

np.random.randn

np.random.random

np.random.random_integers

np.random.random_sample

從這些特性可以看出來,IPython鼓勵(lì)探索性編程。即當(dāng)你對(duì)環(huán)境還不熟悉的時(shí)候,允許通過簡(jiǎn)便快捷的方式來找到你想找的信息。除此之外,IPython還提供了強(qiáng)大的魔術(shù)命令。例如,我們?cè)诋?dāng)前工作目錄下有一個(gè)叫hello.py的文件,其內(nèi)容為:msg='helloipython'

print(msg)

然后在IPython里輸入%runhello.py命令即可直接運(yùn)行這個(gè)python文件。這個(gè)文件是在一個(gè)空的命名空間里運(yùn)行的,并且運(yùn)行之后,該文件里定義的全局變量和函數(shù)就會(huì)自動(dòng)引用到當(dāng)前IPython空間中。In[13]:%runhello.py

helloipython

In[14]:msg

Out[14]:'helloipython'

還有一個(gè)常用的魔術(shù)命令是%timeit,可以用來快速評(píng)估代碼的執(zhí)行效率。例如,下面的代碼用來評(píng)估一個(gè)100100的矩陣點(diǎn)乘所需要運(yùn)行的時(shí)間。In[15]:a=np.random.randn(100,100)

In[16]:%timeitnp.dot(a,a)

1loops,bestof3:261usperloop

還可以使用%who或%whos命令來查看當(dāng)前環(huán)境下的變量列表。In[17]:%who

amsgnp

In[18]:%whos

VariableTypeData/Info

-------------------------------

andarray100x100:10000elems,type`float64`,80000bytes

msgstrhelloipython

npmodule<module'numpy'from'C:\<...>ages\numpy\__init__.pyc'>

還有一些比較常用的魔術(shù)命令如下?!?quickref:顯示IPython的快速參考文檔;·%magic:顯示所有的魔術(shù)命令及其詳細(xì)文檔;·%reset:刪除當(dāng)前環(huán)境下的所有變量和導(dǎo)入的模塊;·%logstart:開始記錄IPython里的所有輸入的命令,默認(rèn)保存在當(dāng)前工作目錄的ipython_log.py中;·%logstop:停止記錄,并關(guān)閉log文件。需要說明的是,在魔術(shù)命令后面加上問號(hào)“?”可以直接顯示魔術(shù)命令的文檔。我們來查看%reset魔術(shù)命令的文檔。In[28]:%reset?

Docstring:

Resetsthenamespacebyremovingallnamesdefinedbytheuser,if

calledwithoutarguments,orbyremovingsometypesofobjects,such

aseverythingcurrentlyinIPython'sIn[]andOut[]containers(see

theparametersfordetails).

IPython與shell交互的能力,可以讓我們不離開IPython環(huán)境即可完成很多與操作系統(tǒng)相關(guān)的功能,特別是在Linux/MacOSX系統(tǒng)下工作時(shí)。最簡(jiǎn)單的方式,就是在命令前加上感嘆號(hào)“!”即可直接運(yùn)行shell命令(Windows系統(tǒng)下運(yùn)行cmd命令)。比如下面的命令可以很方便地在IPython交互環(huán)境下打印出網(wǎng)絡(luò)地址:In[36]:!ifconfig|grep"inet"

inetnetmask0xff000000

inet03netmask0xffffff00broadcast55

以感嘆號(hào)為前綴的shell命令是和操作系統(tǒng)相關(guān)的,Windows系統(tǒng)和Linux/MacOSX系統(tǒng)相差很大。當(dāng)使用%automagicon啟用自動(dòng)魔術(shù)命令功能后,可以省略百分號(hào)“%”的輸入即可直接運(yùn)行魔術(shù)命令:In[68]:%automagicon

AutomagicisON,%prefixISNOTneededforlinemagics.

In[69]:pwd

Out[69]:u'/Users/kamidox'

In[70]:ls

Applications/Pictures/lab/

Desktop/Public/osx/

Documents/android/scikit_learn_data/

Downloads/bin/tools/

In[71]:cdlab

/Users/kamidox/lab

In[72]:pwd

Out[72]:u'/Users/kamidox/lab'

我們經(jīng)常會(huì)用import命令導(dǎo)入自己寫的python模塊,在調(diào)試過程中,修改了這個(gè)模塊后,如果想讓當(dāng)前的修改馬上起作用,必須使用reload()函數(shù)重新載入該模塊。假設(shè)當(dāng)前工作目錄下有一個(gè)名字為hello.py的文件,其內(nèi)容為:defsay_hello():

print('helloipython')

導(dǎo)入模塊,并運(yùn)行say_hello()函數(shù):In[84]:importhello

In[85]:hello.say_hello()

helloipython

把hello.py文件內(nèi)容改為下面的內(nèi)容并保存:defsay_hello():

print('ipythonisagreattool')

此時(shí),如果直接調(diào)用say_hello()函數(shù),得到的依然是舊的輸出,只有調(diào)用reload()函數(shù)重新載入模塊,才能得到最新的輸出:In[86]:hello.say_hello()

helloipython

In[87]:reload(hello)

Out[87]:<module'hello'from'hello.py'>

In[88]:hello.say_hello()

ipythonisagreattool

2.2.2IPython圖形界面除了控制臺(tái)環(huán)境外,IPython另外一個(gè)強(qiáng)大的功能是圖形環(huán)境。與控制臺(tái)環(huán)境相比,它有兩個(gè)顯著的特點(diǎn):·方便編寫多行代碼;·可以直接把數(shù)據(jù)可視化,顯示在當(dāng)前頁面下。安裝完Jupyter后,直接在命令行輸入ipythonnotebook,啟動(dòng)網(wǎng)頁版的圖形編程界面。它會(huì)在命令行啟動(dòng)一個(gè)輕量級(jí)的Web服務(wù)器,同時(shí)用默認(rèn)瀏覽器打開當(dāng)前目錄所在的頁面,在這個(gè)頁面下可以直接打開某個(gè)notebook或者創(chuàng)建一個(gè)新的notebook。一個(gè)notebook是以.ipynb作為后綴名的、基于json格式的文本文件。$ipythonnotebook

[I01:10:56.511NotebookApp]Servingnotebooksfromlocaldirectory:

/Users/kamidox/books

[I01:10:56.511NotebookApp]0activekernels

[I01:10:56.511NotebookApp]TheIPythonNotebookisrunningat:

http://localhost:8888/

[I01:10:56.511NotebookApp]UseControl-Ctostopthisserverandshutdown

allkernels(twicetoskipconfirmation).

我們新建一個(gè)notebook并且畫一個(gè)正弦曲線。#設(shè)置inline方式,直接把圖片畫在網(wǎng)頁上

%matplotlibinline

#導(dǎo)入必要的庫

importnumpyasnp

importmatplotlib.pyplotasplt

#在[0,2*PI]之間取100個(gè)點(diǎn)

x=np.linspace(0,2*np.pi,num=100)

#計(jì)算這100個(gè)點(diǎn)的正弦值,并保存到變量y中

y=np.sin(x)

#畫出x,y,即正弦曲線

plt.plot(x,y)

代碼的注釋已經(jīng)把意圖說明得很清楚了,讀者可以自己動(dòng)手嘗試一下,也可以參考隨書代碼ch02.01.ipynb。運(yùn)行效果如圖2-1所示。幾乎所有的IPython控制臺(tái)的技巧都可以在IPythonnotebok里使用。一個(gè)比較大的區(qū)別是,IPythonnotebook使用cell作為一個(gè)代碼單元。在控制臺(tái)里,寫完代碼直接按Enter鍵即可運(yùn)行,而在IPythonnotebook里需要單擊“運(yùn)行”按鈕或用快捷鍵Ctrl+Enter才能運(yùn)行當(dāng)前cell中的代碼。另外一個(gè)區(qū)別是IPythonnotebook有兩個(gè)模式,一個(gè)是編輯模式,可以直接在這個(gè)cell上編寫代碼。另外一個(gè)是命令模式,即輸入的按鍵作為命令,而不是作為文本處理。這一機(jī)制和vim很類似。這一描述很抽象,讀者可以直接打開IPythonnotebook后,按Ctrl+M快捷鍵在命令模式和編輯模式之間切換,直觀地體驗(yàn)兩者的不同。圖2-1正弦曲線由于這個(gè)原因,掌握一些IPythonnotebook特有的快捷鍵對(duì)效率提高不無裨益。通過選擇“菜單”|Help|KeyboardShortcuts命令,可以查看系統(tǒng)快捷鍵列表。不同操作系統(tǒng)的快捷鍵前導(dǎo)鍵略有不同,比如下面是幾個(gè)Windows系統(tǒng)下常用的快捷鍵,分為命令模式和編輯模式。命令模式如下?!:焦點(diǎn)上移一個(gè)cell;·K:焦點(diǎn)下移一個(gè)cell,熟悉vim的讀者對(duì)這一模式應(yīng)該很習(xí)慣;·A:在當(dāng)前cell的上面插入一個(gè)新的cell;·B:在當(dāng)前cell的下面插入一個(gè)新的cell;·DD:連續(xù)按兩次D鍵,刪除當(dāng)前cell。這是另一個(gè)vimer“喜歡”的功能。編輯模式如下?!trl+Enter:執(zhí)行當(dāng)前的cell代碼。相信大部分人對(duì)這個(gè)快捷鍵都不陌生,很多即時(shí)聊天工具就是用這個(gè)快捷鍵來發(fā)送消息的。·Shift+Enter:執(zhí)行當(dāng)前的cell代碼,并把焦點(diǎn)移到下一個(gè)cell處。如果沒有下一個(gè)cell則會(huì)自動(dòng)創(chuàng)建一個(gè)新的cell。掌握這些基本夠用了,這些工具類的軟件描述起來總是略顯蒼白,只有實(shí)際使用起來才能深切體驗(yàn)其便利性。值得一提的是,通過選擇“菜單”|Help|UserInterfaceTour命令,可以快速地熟悉IPythonnotebook一些基本的界面元素及其操作要領(lǐng)。2.3Numpy簡(jiǎn)介Numpy是Python科學(xué)計(jì)算的基礎(chǔ)庫,主要提供了高性能的N維數(shù)組實(shí)現(xiàn)以及計(jì)算能力,還提供了和其他語言如C/C++集成的能力,此外還實(shí)現(xiàn)了一些基礎(chǔ)的數(shù)學(xué)算法,如線性代數(shù)相關(guān)、傅里葉變換及隨機(jī)數(shù)生成等。2.3.1Numpy數(shù)組可以直接用Python列表來創(chuàng)建數(shù)組。In[1]:importnumpyasnp

In[2]:a=np.array([1,2,3,4])

In[3]:a

Out[3]:array([1,2,3,4])

In[4]:b=np.array([[1,2],[3,4],[5,6]])

In[5]:b

Out[5]:

array([[1,2],

[3,4],

[5,6]])

可以查看array的屬性,包括數(shù)據(jù)的維度和類型。In[6]:b.ndim

Out[6]:2

In[7]:b.shape

Out[7]:(3,2)

In[8]:b.dtype#查看數(shù)組里元素的數(shù)據(jù)類型

Out[8]:dtype('int32')

也可以使用Numpy提供的函數(shù)來創(chuàng)建數(shù)組。In[6]:c=np.arange(10)#創(chuàng)建連續(xù)數(shù)組

In[9]:c

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

In[10]:d=np.linspace(0,2,11)#[0,2]分成11等分后的數(shù)組

In[11]:d

Out[11]:array([0.,0.2,0.4,0.6,0.8,1.,1.2,1.4,1.6,1.8,2.])

In[12]:np.ones((3,3))#注意參數(shù)兩邊的括號(hào),參數(shù)是個(gè)元組

Out[12]:

array([[1.,1.,1.],

[1.,1.,1.],

[1.,1.,1.]])

In[13]:np.zeros((3,6))

Out[13]:

array([[0.,0.,0.,0.,0.,0.],

[0.,0.,0.,0.,0.,0.],

[0.,0.,0.,0.,0.,0.]])

In[14]:np.eye(4)

Out[14]:

array([[1.,0.,0.,0.],

[0.,1.,0.,0.],

[0.,0.,1.,0.],

[0.,0.,0.,1.]])

In[17]:np.random.randn(6,4)#創(chuàng)建6×4的隨機(jī)數(shù)組

Out[17]:

array([[-0.49815866,-0.34571599,-0.44144955,0.28833876],

[1.48639293,-0.56259401,-0.32584788,0.39799156],

[1.35458161,-1.21808153,-0.17011994,0.95870198],

[-1.36688808,0.75892299,-1.25336314,-1.12267624],

[-2.24057506,-0.25099611,1.6995657,-0.14504619],

[0.52316692,-1.55100505,0.65085791,-1.45710045]])

Numpy提供了靈活的索引機(jī)制來訪問數(shù)組內(nèi)的元素。In[23]:a=np.arange(10)

In[24]:a

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

In[25]:a[0],a[3],a[-1]

Out[25]:(0,3,9)

In[26]:a[:4]#半開閉區(qū)間,不包含最后一個(gè)元素

Out[26]:array([0,1,2,3])

In[27]:a[3:7]

Out[27]:array([3,4,5,6])

In[28]:a[6:]

Out[28]:array([6,7,8,9])

In[29]:a[2:8:2]#3個(gè)參數(shù)表示起始、結(jié)束和步長,不包含結(jié)束位置

Out[29]:array([2,4,6])

In[30]:a[2::2]#結(jié)束位置可以省略

Out[30]:array([2,4,6,8])

In[31]:a[::3]#開始和結(jié)束都省略

Out[31]:array([0,3,6,9])

二維數(shù)據(jù)的索引分成行和列兩個(gè)維度,會(huì)更靈活一些。#創(chuàng)建一個(gè)6行6列的二維數(shù)據(jù),使用了廣播機(jī)制,后文介紹

In[32]:a=np.arange(0,51,10).reshape(6,1)+np.arange(6)

In[33]:a

Out[33]:

array([[0,1,2,3,4,5],

[10,11,12,13,14,15],

[20,21,22,23,24,25],

[30,31,32,33,34,35],

[40,41,42,43,44,45],

[50,51,52,53,54,55]])

In[34]:a[0,0],a[2,-1]

Out[34]:(0,25)

In[35]:a[0,2:5]

Out[35]:array([2,3,4])

In[36]:a[:3,3:]

Out[36]:

array([[3,4,5],

[13,14,15],

[23,24,25]])

In[37]:a[2,:]

Out[37]:array([20,21,22,23,24,25])

In[38]:a[:,3]#結(jié)果應(yīng)該是列向量,但Numpy自動(dòng)轉(zhuǎn)換行向量形式

Out[38]:array([3,13,23,33,43,53])

In[39]:a[:,::2]

Out[39]:

array([[0,2,4],

[10,12,14],

[20,22,24],

[30,32,34],

[40,42,44],

[50,52,54]])

In[40]:a[::2,::3]

Out[40]:

array([[0,3],

[20,23],

[40,43]])

另外一個(gè)索引的方法是通過布爾數(shù)組。In[45]:a=np.random.randint(10,20,6)#在[10,20]之間產(chǎn)生6個(gè)隨機(jī)數(shù)

In[46]:a

Out[46]:array([12,11,14,11,18,19])

In[47]:a%2==0

Out[47]:array([True,False,True,False,True,False],dtype=bool)

In[48]:a[a%2==0]

Out[48]:array([12,14,18])

需要特別注意的是,Numpy總是試圖自動(dòng)地把結(jié)果轉(zhuǎn)換為行向量,這一機(jī)制對(duì)熟悉MATLAB的讀者來講會(huì)覺得很別扭。比如下面的例子,對(duì)二維數(shù)組進(jìn)行布爾索引時(shí),結(jié)果變成了一個(gè)行向量:In[49]:a=np.arange(0,51,10).reshape(6,1)+np.arange(6)

In[50]:a

Out[50]:

array([[0,1,2,3,4,5],

[10,11,12,13,14,15],

[20,21,22,23,24,25],

[30,31,32,33,34,35],

[40,41,42,43,44,45],

[50,51,52,53,54,55]])

In[51]:a[a%2==0]

Out[51]:

array([0,2,4,10,12,14,20,22,24,30,32,34,40,42,44,50,52,

54])

另外需要注意的是,在大部分情況下,Numpy數(shù)組是共享內(nèi)存的,如果要獨(dú)立保存,需要顯式地備份??梢允褂胣p.may_share_memory()函數(shù)來判斷兩個(gè)數(shù)組是否共享內(nèi)存。In[52]:a=np.arange(6)

In[53]:a

Out[53]:array([0,1,2,3,4,5])

In[54]:b=a[2:5]

In[55]:b

Out[55]:array([2,3,4])

In[56]:b[1]=100

In[57]:b

Out[57]:array([2,100,4])

In[58]:a#數(shù)組a的值也改變了

Out[58]:array([0,1,2,100,4,5])

In[59]:np.may_share_memory(a,b)

Out[59]:True

In[60]:b=a[2:6].copy()#顯式地備份

In[61]:b

Out[61]:array([2,100,4,5])

In[62]:b[1]=3

In[63]:b

Out[63]:array([2,3,4,5])

In[64]:a#a數(shù)組的值沒有改變

Out[64]:array([0,1,2,100,4,5])

In[65]:np.may_share_memory(a,b)

Out[65]:False

作為一個(gè)有趣的例子,我們使用埃拉托斯特尼篩法(SieveofEratosthenes)來打印出[0,100]之間的所有質(zhì)數(shù)。維基百科頁面/wiki/Sieve_of_Eratosthenes上有個(gè)動(dòng)畫圖片清楚地展示了算法原理。其主要思路是,從第一個(gè)質(zhì)數(shù)2開始,數(shù)據(jù)里所有能被2整除的數(shù)字都不是質(zhì)數(shù),即從2開始、以2為步長,每跳經(jīng)過的數(shù)字都能被2整除,把其標(biāo)識(shí)為非質(zhì)數(shù)。接著,從下一個(gè)質(zhì)數(shù)3開始,重復(fù)上述過程。最終即可算出[1,100]之間的所有質(zhì)數(shù)。importnumpyasnp

a=np.arange(1,101)

n_max=int(np.sqrt(len(a)))

is_prime=np.ones(len(a),dtype=bool)#創(chuàng)建100個(gè)元素的數(shù)組,用來標(biāo)記是否為質(zhì)數(shù)

is_prime[0]=False

foriinrange(2,n_max):

ifiina[is_prime]:#跳過非質(zhì)數(shù)

is_prime[(i**2-1)::i]=False#減1是為了修復(fù)從0開始索引的問題

printa[is_prime]

最終輸出的結(jié)果是:[2357111317192329313741434753596167717379838997]

2.3.2Numpy運(yùn)算最簡(jiǎn)單的數(shù)值計(jì)算是數(shù)組和標(biāo)量進(jìn)行計(jì)算,計(jì)算過程是直接把數(shù)組里的元素和標(biāo)量逐個(gè)進(jìn)行計(jì)算:In[2]:a=np.arange(6)

In[3]:a

Out[3]:array([0,1,2,3,4,5])

In[4]:a+5#數(shù)組和標(biāo)量加法

Out[4]:array([5,6,7,8,9,10])

In[7]:b=np.random.randint(1,5,20).reshape(4,5)

In[8]:b

Out[8]:

array([[3,3,2,3,4],

[3,2,2,4,3],

[2,4,2,1,2],

[2,4,4,4,2]])

In[9]:b*3#數(shù)組和標(biāo)量乘法

Out[9]:

array([[9,9,6,9,12],

[9,6,6,12,9],

[6,12,6,3,6],

[6,12,12,12,6]])

使用Numpy的優(yōu)點(diǎn)是運(yùn)行速度會(huì)比較快,我們可以對(duì)比一下使用Python的循環(huán)與使用Numpy運(yùn)算在效率上的差別,從Log里看到運(yùn)行效率相差近100倍。In[10]:c=np.arange(10000)

In[11]:%timeitc+1

10000loops,bestof3:23.7usperloop

In[12]:%timeit[i+1foriinc]

100loops,bestof3:2.61msperloop

另外一種是數(shù)組和數(shù)組的運(yùn)算,如果數(shù)組的維度相同,那么在組里對(duì)應(yīng)位置進(jìn)行逐個(gè)元素的數(shù)學(xué)運(yùn)算。In[16]:a=np.random.random_integers(1,5,(5,4))

In[17]:a

Out[17]:

array([[3,1,3,2],

[1,1,4,2],

[1,3,5,4],

[3,3,3,4],

[5,1,5,1]])

In[23]:b=np.ones((5,4),dtype=int)

In[24]:b

Out[24]:

array([[1,1,1,1],

[1,1,1,1],

[1,1,1,1],

[1,1,1,1],

[1,1,1,1]])

In[25]:a+b#數(shù)組加法

Out[25]:

array([[4,2,4,3],

[2,2,5,3],

[2,4,6,5],

[4,4,4,5],

[6,2,6,2]])

In[26]:c=np.random.random_integers(1,5,(3,4))

In[27]:c

Out[27]:

array([[5,5,4,5],

[2,2,1,3],

[5,1,1,5]])

In[28]:d=np.random.random_integers(1,5,(3,4))

In[29]:d

Out[29]:

array([[3,4,5,4],

[4,3,4,2],

[1,4,5,4]])

In[30]:c*d#數(shù)組相乘,逐元素相乘,不是矩陣內(nèi)積運(yùn)算

Out[30]:

array([[15,20,20,20],

[8,6,4,6],

[5,4,5,20]])

需要注意的是,乘法是對(duì)應(yīng)元素相乘,不是矩陣內(nèi)積,矩陣內(nèi)積使用的是np.dot()函數(shù)。In[2]:a=np.random.random_integers(1,5,(3,2))

In[4]:b=np.random.random_integers(1,5,(2,3))

In[5]:a

Out[5]:

array([[3,1],

[2,3],

[5,1]])

In[6]:b

Out[6]:

array([[5,1,2],

[3,1,4]])

In[7]:np.dot(a,b)#矩陣內(nèi)積

Out[7]:

array([[18,4,10],

[19,5,16],

[28,6,14]])

如果數(shù)組的維度不同,則Numpy會(huì)試圖使用廣播機(jī)制來匹配,如果能匹配得上,就進(jìn)行運(yùn)算;如果不滿足廣播條件,則報(bào)錯(cuò)。In[30]:a=np.random.random_integers(1,5,(5,4))

In[31]:a

Out[31]:

array([[3,1,3,2],

[1,1,4,2],

[1,3,5,4],

[3,3,3,4],

[5,1,5,1]])

In[32]:b=np.arange(4)

In[33]:b

Out[33]:array([0,1,2,3])

In[34]:a+b#5′4數(shù)組與1′4數(shù)組的加法,滿足廣播條件

Out[34]:

array([[3,2,5,5],

[1,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論