1. 程式人生 > >《機器學習有意思! 01》- 世界上最簡單的機器學習入門

《機器學習有意思! 01》- 世界上最簡單的機器學習入門

你是否也曾聽人們談起機器學習但是隻有一個朦朧的概念?你是否厭倦了在同事的高談闊論中頹然欲睡?此誠求變之機。

本教程適合所有對機器學習感到好奇,卻不知從何下手的讀者。我想應該有很多人試著讀了維基百科頁面,然後愈發迷惘、沉淪,盼望著有人能夠提供一個high-level的解釋,那你找對地方了。

我們的目標是讓所有人都能讀懂——這就難免有些泛泛而談。但是無妨,但凡本文能讓一個人真正對機器學習感興趣,那麼目的就算達到了。

什麼是機器學習?

機器學習的核心思想是創造一種普適的演算法,它能從資料中挖掘出有趣的東西,而不需要針對某個問題去寫程式碼。你需要做的只是把資料“投喂”給普適演算法,然後它會在資料上建立自己的邏輯。

比如說有一種演算法,叫分類演算法,它可以把資料分到不同的組別當中。一個識別手寫數字的分類演算法,也可以用作判斷垃圾郵件,而無需修改一行程式碼。演算法是同一個演算法,只是輸入了不同的訓練資料,便有了不同的分類邏輯。

機器學習演算法是個黑盒,且可以在不同分類問題中重複利用。機器學習演算法是個黑盒,且可以在不同分類問題中重複利用。

“機器學習”是個筐,什麼普適演算法都往裡裝。

兩種機器學習演算法

機器學習主要分為兩類——有監督學習無監督學習,區別很簡單,卻很關鍵。

有監督學習

想想你是一家房產中介。你的業務正在增長,所以僱了一幫實習銷售來助拳。那麼問題來了——身經百戰的你,一眼就看穿一棟房子價值幾何,但是實習生可沒有這樣豐富的人生經驗,所以摸不準行情。

為了輔助實習生(以便解放自己度個假),你決定做個小程式,基於面積、周邊環境、相似房產成交價等等,來預估本地的房價。

所以你把3個月來本市的每一筆交易都拿小本本記了下來。對每處房產都整理了一大堆細節——房間數、面積、周邊環境等等,當然最重要的是,最終成交價:

這就是我們的“訓練資料”這就是我們的“訓練資料”

有了訓練資料,我們就想搞個程式去預估其他的房價:

用訓練資料去預測別的房屋價格用訓練資料去預測別的房屋價格

這就是有監督學習。你是知道每處房產到底賣多少的,換言之,問題的答案是已知的,邏輯是可以反推的。

為了開發小程式,把每處房產的訓練資料導進機器學習演算法裡,演算法試圖摸索出其中的數學規律。

這有點像是去掉了符號的算術題答案:

Oh no!一個熊孩子把參考答案裡的運算子號給塗沒了!Oh no!一個熊孩子把參考答案裡的運算子號給塗沒了!

根據上圖,你能否推算出這些題目的原貌呢?顯然,我們需要對這些數字“動點手腳”,以使等式成立。

有監督學習中,我們做的實際上就是讓電腦代替人來讓等式成立。一旦你學會了解決某一類問題,那麼這類問題裡的任何子問題都就迎刃而解了!

無監督學習

回到最開始那個賣房地產的例子。如果我們不知道具體每處房產的價格可咋整?即使僅知道面積、位置等資訊,你也依然可以搞點動靜出來,這就叫無監督學習

即使不預測未知數(比如房價),機器學習也能帶來有趣的結論即使不預測未知數(比如房價),機器學習也能帶來有趣的結論

這就好比有人給你一張紙,上面寫著一串數字,然後說“我也不知道啥意思,你可以猜猜這是什麼套路——好運!”

這些資料我們能做什麼呢?對於新手來講,可以得到一個演算法,從資料中自動辨識出細分的市場定位。可能你會發現,當地大學附近的購房者偏好多臥室的小房子,而郊區的購房者則傾向於大套三。瞭解到不同型別消費者的存在可以指導市場行為。

另一個可以做的就是自動識別出那些少有相似點的特異房產。可能這些特異房產是豪華公館,那麼就可以調配最好的銷售人員專門負責這些大買賣。

後文主要專注於有監督學習,但並非因為無監督學習的作用小或者趣味少。實際上無監督學習的重要性與日俱增且發展迅速,因為不需要事先對正確答案對應的資料加標籤。

注:還有很多其他種類的機器學習演算法,不過建議從這些基礎演算法入手。

哎喲不錯,但是真的有可能“學習”到真實的房價嗎?

作為一個人類,你的大腦可以面對各種形勢,並且在無明確指導的情況下自主學習如何應對。如果你賣了很久的房子,就會慢慢地對房價、對銷售策略、對觀察客戶等問題產生一種“感覺”。強人工智慧研究的目的就在於讓計算機掌握這種能力。

但是當前的機器學習演算法還沒那麼厲害——它們只能對很具體、有限的問題生效。或許這裡的“學習”更應該定義為“基於樣本資料得出解決具體問題的等式”。

不幸的是,“讓機器基於樣本資料得出解決具體問題的等式”不是個好名字,所以我們還是回到了“機器學習”。

當然如果你在50年後,強人工智慧都普及了時候看到本文,會覺得全文都很“古典”。別看了,讓你的機器人給你拿個包子吃,未來人類。

放碼過來!

然,上面例子裡的預測房價程式應該怎麼寫呢?思考一秒,然後接著看。

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
    price = 0

    # 這一片的均價是200美元一平米
    price_per_sqft = 200

    if neighborhood == "hipsterton":
        # 有的區更貴
        price_per_sqft = 400

    elif neighborhood == "skid row":
        # 有的區便宜
        price_per_sqft = 100

    # 根據基準價和麵積預測實際價格
    price = price_per_sqft * sqft

    # 根據房間數調整預測
    if num_of_bedrooms == 0:

        # 公寓稍微便宜點
        price = price — 20000

    else:
        # 臥室多的房子貴
        price = price + (num_of_bedrooms * 1000)

    return price


如果順著寫上幾個小時,或許也能得到一個能跑的程式。但勢必存在隱患,而且無法應對價格變化。

如果計算機能自己發現如何應用這些方程,那豈不是好得多?只要能得到正確的數字,誰管具體方程是什麼呢?

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
    price = 賈維斯,幫我算一下

    return price


這個問題可以想象成:價格是道燉菜,配方是臥室數量面積周邊環境。如果你能算出每種成分對最終價格的影響是多少,或許那就是配方“攪合”最終價格的確切權重。

這可以使原程式(滿是if/else)變得簡單如下:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
    price = 0

    # 加少許配方1
    price += num_of_bedrooms * .841231951398213

    # 加大把配方2
    price += sqft * 1231.1231231

    # 適量的配方3
    price += neighborhood * 2.3242341421

    # 最後來點鹽
    price += 201.23432095

    return price


注意這些奇妙深刻的加粗數字——.841231951398213、 1231.12312312.3242341421201.23432095,這就是我們的權重。只要我們能找到準確的權重,那就可以預測房價了。

一個比較粗暴的權重計算方法大致如下:

第一步:

把所有權重都設為1.0:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
    price = 0

    # 加少許配方1
    price += num_of_bedrooms * 1.0

    # 加大把配方2
    price += sqft * 1.0

    # 適量的配方3
    price += neighborhood * 1.0

    # 最後來點鹽
    price += 1.0

    return price


第2步:

把每個房產的引數代入公式,計算預測結果和實際價格的誤差:

用你的方程來猜房價用你的方程來猜房價

比如第一個房子實際賣了250,000250,000,但是你的方程卻預測的是178,000,但這一個房子就少了$72,000。

現在把每個房子對應誤差的平方加起來,比方你有500單交易,那麼誤差的平方和就有$86,123,373,可謂謬以千里。再把平方和除以500得到平均每個房子的誤差,這一平均誤差值就是方程的代價(即最小二乘法,平方是為了防止誤差正負相抵)。

如果我們能通過調整權重將代價降為零,那方程就完美了。這表示在所有例子中,方程都準確無誤地基於輸入資料猜中了房價。這就是我們的目標——嘗試不同的權重,讓代價儘量低。

第3步:

不斷地重複第2步,嘗試每一種可能的權重值組合。哪個組合能讓代價最接近於0就選哪一組。找到那一組權重,就解決了問題!

腦洞時間

挺簡單的對吧?回想一下剛才的所做,拿到一些資料,填進三個普適的、簡單的步驟裡,然後得到一個能猜房價的方程。Zillow(美國房價預測網站)面臨著嚴重的威脅!

但是有這麼幾個激動人心的事實:

  1. 過去40年裡,很多領域(如語言學/翻譯學)的研究已經表明,“攪合數字燉菜”(作者自己打的比方)的普適性學習演算法已經超越了那些,由真人嘗試自己發現顯式規律的人方法。機器學習的“暴力”方法最終擊敗了人類專家。

  2. 剛才得出的方程其實是很笨的。它並不知道“平方米”和“臥室”到底是什麼,它只知道“攪拌”多少數字可以得到正確答案。

  3. 你大概並不知道為什麼某一組權重就是好的,而只是寫了一個自己都不明白的方程,但卻證明是好用的。

  4. 假設我們不用“平方米”和”臥室數“這些引數,而是讀入一個數列。比方說每個數字代表的是”從車頂上拍的照片的某一畫素的亮度”,然後我們預測的結果也不是“房價”了,而是“方向盤轉過的角度”。這就是一個人自動駕駛的風方程了?

瘋了,對吧?

第3步的“嘗試每個數字”

當然你不可能真的嘗試每一種可能權重組合來尋找最優解,實際情況是永遠嘗試不完。

為了避免這一情況,數學家們發現了很多機智辦法來儘快找到一個不錯的結果。以下就是其中一種:

第一,寫一個能夠代表上面“第2步”的方程:

這就是代價函式這就是代價函式

然後用機器學習界的黑話(暫時可以忽略)重新寫一遍:

$\theta$代表當前權重。$J(\theta)$是當前權重的代價值。θθ代表當前權重。J(θ)J(θ)是當前權重的代價值。

這個等式代表了在當前的權重組合下,我們的價格預測有多麼離譜。

如果把房間數平方米所有可能權重值視覺化,可以得到類似下圖的影象:

代價函式的影象像個碗。豎直軸表示代價。代價函式的影象像個碗。豎直軸表示代價。

這個圖裡的藍色最低點就是代價的最低點——方程誤差最小處,最高點即是最離譜的情況。所以如果我們找到一組權重值,使得方程對應最低點,那就是答案!

所以我們只需要以“下山”的方式來調整權重,逼近最低點。如果每一次微小的調整都向著最低點進發,那遲早能夠到達。

函式的導數就是切線的斜率,換句話說,這告訴我們哪條路可以“下山”。

因此如果計算代價函式對每個權重的偏微分,然後再從權重裡減去這個值,這可以讓我們離谷底更近。重複執行,最終我們會到達谷底並獲得權重的最優解(如果沒看懂,不要擔心,繼續看)。

這是一種尋找方程最佳權重方式的高度概括,叫作批梯度下降(batch gradient descent)。如果你對此感興趣,不要害怕,瞭解更多細節

當你使用機器學習庫來解決實際問題的時候,這些都會自動完成,但是瞭解究竟發生了什麼還是很有用的。

還略過了什麼?

上述的三步演算法即是多變數線性迴歸,針對一條穿過房產資料的直線來進行預測目標等式,並用這一等式去猜測此前未曾見過的房屋價格,解決實際問題的時候這非常行之有效。

但是以上方法或許只對特別簡單的例子好使,並非萬金油。其中一個原因就是房價不總是簡單到能用一條連續直線來代表。

好在另有很多方法解決,很多機器學習演算法可以處理非線性資料(如神經網路 或 有核 的支援向量機)。同樣也有演算法是以更加聰明的方式使用線性迴歸以擬合更復雜的直線。但不論哪一方法,最根本的思想都是找到最佳的權重。

並且我忽略了過擬合問題。對於已有的原始資料,找到一組很棒的權重值不難,但是卻有可能對訓練集以外新的房子不適用。有很多方法可以避免這一現象(如正則化和使用交叉驗證資料集),這是成功應用機器學習演算法的關鍵命題。

儘管基本概念很簡單,但是要用機器學習取得有用的結果,還是需要技巧和經驗的。不過這些技巧是每一個開發者,都能夠學會的!

機器學習是魔法嗎?

看到機器學習技術如此輕易就解決了看起來非常困難的問題(如手寫識別),你可能會感覺只要有足夠多的資料,什麼問題都不是問題了。匯入資料,然後等著計算機變出一個適合資料的式子!

但需要記住的事,機器學習要想生效,必須滿足一個條件,就是目標問題對已有資料確實是可解的。

比如建立一個模型,根據房子裡種的植物種類預測房價,這肯定不管用。因為房裡的植物和售價本來就沒有關係,不管再怎麼試,計算機還是無法找出這種關係。

只有實際存在的關係才能建模只有實際存在的關係才能建模

所以如果一位人類專家不能用資料解決某個問題,計算機也不行。相反,計算機的優勢在於,對於人類能解決的問題,計算機可以更快地完成。

如何學習更多機器學習

在我看來,機器學習目前最大的問題在於其主要還是存在於學術界,對於廣大隻是想稍微瞭解、而並非想成為專家的人們,通俗易懂的材料還是不夠豐富,當然這一情況已經在好轉。

吳恩達的Machine Learning class on Coursera相當驚豔,我強烈推薦從這裡開始。對於CS專業的人,只要還記得一丁點數學,就可以學。

你也可以通過下載安裝Scikit-learn,來自己嘗試海量的機器學習演算法,這是一個提供“黑盒”版標準演算法的Python框架。



相關推薦

機器學習有意思 01》- 世界簡單機器學習入門

你是否也曾聽人們談起機器學習但是隻有一個朦朧的概念?你是否厭倦了在同事的高談闊論中頹然欲睡?此誠求變之機。 本教程適合所有對機器學習感到好奇,卻不知從何下手的讀者。我想應該有很多人試著讀了維基百科頁面,然後愈發迷惘、沉淪,盼望著有人能夠提供一個high-level

(二)Web框架-龍捲風Tornado之世界簡單的Tornado示例

原始碼 # _*_coding:utf-8_*_ import tornado.ioloop import tornado.web class MainHandler(tornado.web.R

2016第18本:世界簡單的會計書

從周葉的微信公眾號zyea_com中發現了這本書《世界上最簡單的會計書》,自己也聽說過資產負債表、損益表和現金流量表等名詞,但從來沒搞清楚過這些表格的意思。所以讀此書的目的是想著理財過程中肯定遇到某種報表,如果基礎術語都不懂,那看到的可能就是一堆雜亂的數字吧。 看到周葉專門製作電子表格xls來做題,很佩

世界簡單的會計書-筆記

達雷爾·穆利斯,朱迪絲·奧洛夫. “世界上最簡單的會計書。” 第一章:現金、原始投資、資產、負債、應付票據、所有者權益、資產負債表、存貨、盈利、費用 現金:指可流動形式的貨幣 原始投資:它是指為使專案完全達到設計生產能力,開展正常經營而投入的全部現實資

簡單的Docker入門教程

安裝 這裡我的電腦是mac,採用brew安裝,安裝完畢記得更換國內的docker映象源哦. 安裝完畢,就開始使用,一探docker的神祕了. 開始之前先看一張圖:現在看不懂沒關係,之後我會解釋 Image 檔案 Dock

簡單的Hibernate入門簡介

其實Hibernate本身是個獨立的框架,它不需要任何web server或application server的支援。然而,大多數的Hibernate入門介紹都加入了很多非Hibernate的東西,比如: Tomcat, Eclipse, Log4J,Struts, XDo

世界小的3D遊戲大作只有96KB你信嗎?

廠商 ext 就是 3年 啟動器 然而 模擬 曾經 開發 曾經有人說過世界上最大的遊戲,其中說到了微軟的《模擬飛行》,其容量是需要70G,當然了,這還不如是最大的遊戲,那麽其實在世界上有很多的各種各樣的遊戲吉尼斯世界紀錄,那麽你又知道多少,了解多少個關於遊戲的吉尼斯世界紀錄

強----機器學習經典總結---入門必讀----心血總結-----回味無窮

在本篇文章中,我將對機器學習做個概要的介紹。本文的目的是能讓即便完全不瞭解機器學習的人也能瞭解機器學習,並且上手相關的實踐。這篇文件也算是EasyPR開發的番外篇,從這裡開始,必須對機器學習瞭解才能進一步介紹EasyPR的核心。當然,本文也面對一般讀者,不會對閱讀有相關的前提要求。   在進入正

200種最佳機器學習教程彙總【史全】

摘要: 不吹不黑,絕對史上最全的機器學習學習材料! 本文包含了迄今為止大家公認的最佳教程內容。它絕不是網上每個ML相關教程的詳盡列表,而是經過精挑細選而成的,畢竟網上的東西並不全是好的。我作者彙總的目標是為了補充我即將出版的新書,為它尋找在機器學習和NLP領域中找

簡單好玩的機器學習課程

用四個遊戲,完成機器學習入門。通俗易懂,生動有趣。入門的同學可以看一下。 讓機器學會打遊戲【第二彈】守衛紅城(主要介紹感知器演算法) 看看機器是如何守衛紅城的,利用感知器演算法,判斷湧入的是敵軍還是難

機器學習資源整理

機器學習資源浩如煙海,本文對機器學習資源做了相關整理,希望大家能夠根據自己的細分研究領域,著重關注某些學習資源。可能某幾個網頁連結打不開,那說明需要“科學”上網。 機器學習也是一門實踐學科,最好的學習就是不斷的實踐,推薦 BigQuant 人工智慧量化投資 一站式的python+機器學習

厲害了,Word姐世界早一批程式設計師原來是她們

大家看到這張照片,腦袋裡蹦出的第一個想法是啥? 還有這張 沒錯了,這是美國超模Karlie Kloss,同時也是前維密天使。你是不是以為小編今天要給大家介紹超模的時尚之路了。No No No,今天小編要說的是她另外一個身份。你可能已經猜到了,她居然也是一個程式媛!!!!是的你沒有聽錯,這位膚白貌美大長腿

非常好用世界快最好的視訊壓縮轉換工具(精品)

測試了20多款 各種視訊壓縮 擷取軟體 真的是這款最快 快好用 效果也好!!! 最快的視訊轉換壓縮工具。WisMencoder 能夠把您的電腦上的所有視訊格式,包括avi,mpg,rmvb,wmv,mp4,mov,dat等格式以最快的速度和最高的質量轉換為AVI格式。速度和質

從一張圖看清世界大的數據中心分布區域

內蒙古 項目 ace net 監控 現場 萬維網 居住 為我 原文地址 去年年底,全球網站總數估計約970864745個,以每秒約2個網站的速度遞增。據互聯網研究公司Netcraft聲稱,活躍網站大約有1.77億個,使用數億個現有的主機名。 去年年底,全球網站總數估計

世界偉大的十個公式(轉載)

charles 深深 位移 數字信號 重要 方程組 font pan -h 這些公式不僅僅是數學家和物理學家的智慧結晶,更是人類文明的集中體現。每一個公式都深深影響了人類社會的變革,甚至塑造了人類的思想。這些公式中有些你會很熟悉,有些你也許不那麽熟悉。作為人類的我們

iMindmap 10世界專業的手繪3D思維導圖軟件

們的 視覺 圖庫 構建 goods tube 多個 可樂 分享圖片 下載iMindmap 10.0.4 - 世界上最專業的手繪3D思維導圖軟件 iMindMap是由Tony Buzan開發的思維導圖軟件,幫助用戶在思考和實現思想的過程中更有效地創建和工作。這是一個非常強大

[轉]為什麽股票投資是世界難成功的行業

試用 之間 靠譜 智商 產品 不想 辦理 打羽毛球 基本 我在二級市場摸滾打爬的時間已經十多年,接觸過的投資者起碼超過1000個,但真正成功實現財務自由的不足10人,即成功率不到1%。這裏把那些證券服務行業的人剔除,例如投行精英、券商老總。他們並不是靠炒股賺錢,而是靠提

全Python從入門到資深書籍資料分享

暢銷書 jpeg 集成 mar sha 鞏固 技能 ima 能力 今天我來為大家分享十本不可錯過的Python好書,分別適合入門、進階到精深三個不同階段的人來閱讀。 Python高性能編程 Amazon 五星暢銷書。 Python 入門進階必讀。 Python代碼僅僅能夠

天搜科技:從世界快的攝像機中看技術化未來

不可 近日 一個 時代 並且 更新 ado 過程 未來 你想知道光是如何運動的嗎?世界上最快的攝像機可以實現讓你的夢想。近日一段出自麻省理工大學研究人員之手的視頻在網絡上爆紅。在視頻裏,一小段激光脈沖從瓶口進入水瓶,高速攝像機記錄下激光在水瓶中運動的過程。這是一個以技術為標

世界有用的100個網站

網民需要在網上找到能包含自己最感興趣的事,那麼Newsgator 和 Google Reader就是一個很好的選擇。免費版本提供250MB的儲存空間,並且支援POP3 和SMTP標準,因而網民從中可以獲得一個很好的郵件程式和網路通道。Reciva做的事情也是一樣,但是如果你購買了它的網路收音