機器學習能讓咱們自數據集中受到啓發,換句話說,咱們會利用計算機來彰顯數據背後的真實含義,這纔是機器學習的真實含義。它既不是隻會徒然模仿的機器人,也不是具備人類感情的仿生人。html
機器學習就是把無序的數據轉換成有用的信息。正則表達式
機器學習橫跨計算機科學、工程技術和統計學等多個學科,須要多個學科的專業知識。算法
1.1.1 傳感器和海量數據shell
地震預測中,傳感器收集了海量的數據,如何從這些數據中抽取出有價值的信息是一個很是值得研究的課題。編程
1.1.2 機器學習很是重要數組
大量的經濟活動都依賴於信息,咱們不能在海量的數據中迷失,機器學習將有助於咱們穿越數據霧靄,從中抽取出有用的信息。網絡
專家系統dom
機器學習的一項任務就是分類。機器學習
咱們決定使用某個機器學習算法進行分類,首先須要作的是算法訓練,即學習如何分類。編輯器
一般咱們爲算法輸入大量已分類數據做爲算法的訓練集。訓練集是用於機器學習算法的數據樣本集合。
目標變量是機器學習算法的預測結果,在分類算法中目標變量的類型一般是離散型的,而在迴歸算法中一般是連續型的。訓練樣本集是必須肯定知道目標變量的值,以便機器學習算法能夠發現特徵和目標變量之間的關係。
咱們一般將分類問題中的目標變量稱爲類別,並假定分類問題只存在有限個數的類別。
特徵或者屬性一般是訓練樣本集的列,它們一般是獨立測量獲得的結果,多個特徵聯繫在一塊兒共同組成一個訓練樣本。
爲了測試機器學習算法的效果,一般使用兩套獨立的樣本集:訓練數據和測試數據。當機器學習程序開始運行時,使用訓練樣本集做爲算法的輸入,訓練完成以後屬於哪一個樣本。輸入測序樣本時並不提供測試樣本的目標變量,由程序決定樣本屬於哪一個類別。比較測試樣本預測的目標變量值與實際樣本類別之間的差異,就能夠得出算法的實際精確度。
知識表示,某些算法能夠產生很容易理解的知識表示,而某些算法的知識表示也許只能爲計算機所理解。知識表示能夠採用規則集的形式,也能夠採用機率分佈的形式,甚至能夠時訓練樣本集的一個實例。
1、分類,主要任務是將實例數據劃分到合適的分類中。
2、迴歸,主要用於預測數值型數據。
數據擬合曲線:經過給定數據點的最優擬合曲線。
分類和迴歸屬於監督學習,這類算法必須知道預測什麼,即目標變量的分類信息。
與監督學習相對應的是非監督學習,此時數據沒有類別信息,也不會給定目標值。在非監督學習中,將數據集合分紅由相似的對象組成的多個類的過程被稱爲聚類;將尋找描述數據統計值的過程稱之爲密度估計。此時,非監督學習還能夠減小數據特徵的維度,以便咱們可使用二維或三維圖形更加直觀地展現數據信息。
選擇實際可用的算法,必須考慮下面兩個問題:
1、使用機器學習算法的目的,想要算法完成何種任務,好比,是預測明天下雨的機率仍是歲投票者按照興趣分組;
2、須要分析或收集的數據是什麼?
首先考慮使用機器學習算法的目的。若是想要預測目標變量的值,則能夠選擇監督學習算法,不然選擇非監督學習算法。肯定選擇監督算法以後,須要進一步肯定目標變量類型,若是目標變量是離散型,如是/否、1/2/三、A/B/C或者紅/黃/黑等,則能夠選擇分類算法;若是目標變量是連續性的數值,如0.0~100.00、-999~999或者-∞~+∞,則須要選擇迴歸算法。
若是不想預測目標變量的值,則能夠選擇非監督學習算法。進一步分析是否須要將數據劃分爲離散的組。若是這是惟一的需求,則使用積累算法;若是還須要估計與每一個分組的類似程度,則須要使用密度估計算法。
在大多數狀況下,上面給出的選擇方法都能幫助讀者選擇恰當的機器學習算法,但這也並不是一成不變。
其次須要考慮的是數據問題。咱們應該充分了解數據,對實際數據瞭解得越充分,也容易建立符合實際需求的應用程序。主要應該瞭解數據的如下特徵:特徵值是離散型仍是連續性變量,特徵值中是否存在缺失的值,何種緣由形成缺失值,數據中是否存在異常值,某個特徵發生的頻率如何(是否罕見得如同海底撈月),等等。充分了解上面提到的這些數據能夠縮短選擇機器學習算法的時間。
咱們只能在必定程度上縮小算法的選擇範圍,通常並不存在最好的算法或者能夠給出最好結果的算法,同時還要嘗試不一樣算法的效果。對於所選的每種算法,均可以使用其餘的機器學習技術來改進其性能。在處理輸入數據以後,兩個算法的相對性能也可能會發生變化。
機器學習算法雖然各不相同,可是使用算法建立應用程序的步驟卻基本相似。
(1)收集數據。咱們可使用不少方法收集樣本數據。如:製做網絡爬蟲從網站上抽取數據、從RSS反饋或者API中獲得信息、設備發送過來的實測數據(風速、血糖等)。
(2)準備輸入數據。獲得數據以後,必須確保數據格式符合要求,這裏採用的是Python的List。使用這種標準格式能夠融合算法和數據源,方便匹配操做。使用Python語言構造算法應用,參照這裏。
此外還須要爲機器學習算法準備特定的數據格式,如某些算法要求特徵值使用特定的格式,一些算法要求目標變量和特徵值是字符串類型,而另外一些算法則可能要求是整數類型。與收集數據的格式相比,處理特殊算法要求的格式相對簡單得多。
(3)分析輸入數據。此步驟主要是人工分析之前的數據。爲了確保前兩步有效,最簡單的方法是用文本編輯器打開數據文件,查看獲得的數據是否爲空值。此外,還能夠進一步瀏覽數據,分析是否能夠識別出模式;數據中是否存在明顯的異常值,如某些數據點與數據集中的其餘值存在明顯的差別。經過一維、二維或三維圖形展現數據也是不錯的方法,然而大多數時候咱們獲得的數據的特徵值都不會低於三個,沒法一次圖形化展現全部特徵。提煉數據,使得多爲數據能夠壓縮到二維或三維,方便咱們圖形化展現數據。
這一步的主要做用是確保數據集中沒有垃圾數據。若是是在產品化系統中使用機器學習算法而且算法能夠處理系統產生的數據格式,或者咱們信任數據來源,能夠直接跳過第3步。此步驟須要人工干預,若是在自動化系統中還須要人工干預,顯然就下降了系統的價值。
(4)訓練算法。機器學習算法從這一步才真正開始學習。根據算法的不一樣,第4步和第5步是機器學習算法的核心。咱們將前兩步獲得的格式化數據輸入到算法,從中抽取知識或信息。這裏獲得的知識須要存儲爲計算機能夠處理的格式,方便後續步驟使用。
若是使用無監督學習算法,因爲不存在目標變量值,故而也不須要訓練suan'fa,全部與算法相關的內容都集中在第5步。
(5)測試算法。這一步將實際使用第4步機器學習獲得的知識信息。爲了評估算法,必須測試算法工做的效果。對於監督學習,必須已知用於評估算法的目標變量值;對於無監督學習,也必須用其餘的評測手段來檢驗算法的成功率。不管哪一種情形,若是不滿意算法的輸出結果,則能夠回到第4步,改正並加以測試。問題經常會跟數據的收集和準備有關,這時你就必須跳回第1步從新開始。
(6)使用算法。將機器學習算法轉換爲應用程序,執行實際任務,以檢驗上述步驟是否能夠在實際環境中正常工做。此時若是碰到新的數據問題,一樣須要重複執行上述的步驟。
(1)Python的語法清晰;
(2)易於操做純文本文件;
(3)使用普遍,存在大量的開發文檔。
1.6.1 可執行僞代碼
Python具備清晰的語法結構,也把它稱做可執行僞代碼(executable pseudo-code)。默認安裝的Python開發環境已經附帶了不少高級數據類型,如列表、元組、字典、集合、隊列等,無需進一步編程就可使用這些數據類型的操做。使用這些數據類型使得實現抽象的數學概念很是簡單。
Python語言處理和操做文本很是簡單,很是易於處理非數值型數據。Python語言提供了豐富的正則表達式函數以及不少訪問Web頁面的函數庫,使得從HTML中提取數據變得很是簡單直觀。
1.6.2 Python比較流行
Python語言使用普遍,代碼範例也不少,便於讀者快速學習和掌握。此外,在開發實際應用程序時,也能夠利用豐富的模塊庫縮短開發週期。
在科學和金融領域,Python語言獲得了普遍應用。SciPy和Numpy等許多科學函數庫都實現了向量和矩陣操做,這些函數庫增長了代碼的可讀性,學過線性代數的人均可以看懂代碼的實際功能。另外,科學函數庫SciPy和NumPy使用底層(C和Fortran)編寫,提升了相關應用程序的計算性能。
Python的科學工具能夠與繪圖工具Matplotlib能夠繪製2D、3D圖形,也能夠處理科學研究中常用到的圖形。
Python開發環境還提供了交互式shell環境,容許用戶開發程序時查看和檢測程序內容。
Pylab模塊
1.6.3 Python語言的特點
對於大多數人來講,編程僅僅是完成其餘任務的工具而已。咱們能夠花費更多的時間處理數據的內在含義,而無須花費太多精力解決計算機如何獲得數據結果。Python語言使得咱們很容易表達本身的目的。
1.6.4 Python語言的缺點
性能問題。
機器學習算法涉及到不少線性代數知識,這裏用到線性代數只是爲了簡化不一樣的數據點上執行的相同數學運算。將數據表示爲矩陣形式,只須要執行簡單的矩陣運算而不須要複雜的循環操做。這裏使用PyChram的Python console,輸入如下命令:
from numpy import*
上述命令將NumPy函數庫中的全部模塊引入到當前的命名空間。
而後輸入下列命令:
random.rand(4,4)
上述命令構造了一個4×4的隨機數組,由於產生的是隨機數組,不一樣計算機的輸出結果可能與上述結果徹底不一樣。
Numpy矩陣與數組的區別:NumPy函數庫中存在兩種不一樣的數據類型(矩陣matrix和數組array),均可以用於處理行列表示的數字元素。雖然它們看起來很類似,可是在這兩個數據類型上執行相同的數學運算可能獲得不一樣的結果,其中NumPy函數庫中的matrix與MATLAB中的matrix等價。
調用mat()函數能夠將數組轉化爲矩陣,輸入如下命令:
randMat = mat(random.rand(4,4)) randMat.I
因爲使用隨機函數產生矩陣,不一樣計算機上輸出的值可能略有不一樣:
.I操做符實現了矩陣求逆的運算。
執行下面的命令存儲逆矩陣:
invRandMat = randMat.I
接着執行矩陣乘法,獲得矩陣與其逆矩陣相乘的結果:
randMat*invRandMat
結果應該是單位矩陣,除了對角線元素是1,4×4矩陣的其餘元素應該是全是0。實際輸出結果略有不一樣,矩陣中還留下許多微小的元素,這是計算機處理的結果。輸入下述命令,獲得偏差值:
myEye = randMat*invRandMat myEye - eye(4)
函數eye(4)建立4×4的單位矩陣。