機器學習基礎
- 什么是機器學習
- 機器學習的基本術語
- 監督學習和非監督學習
- 機器學習工具介紹
- 總結
人工智能的核心是機器學習,機器學習的本質是算法
機器學習的官方解釋:機器學習是指如果一個程序可以在任務 T 上,隨經驗E 的增加,效果 P 也隨之增加,則這個程序可以從經驗中學習。A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.
機器學習的真實含義:機器學習能讓我們自數據集中受到啟發,換句話說,我們會利用計算機來彰顯數據背后的真實含義。他也許不是我們所想象的那種會模仿的機器人,也不是那種具有人類感情的仿生人。 —《機器學習實戰》
機器學習的應用場景:
-
你早上到了公司,點開你的公司郵箱檢查昨晚有沒有人給你發送郵件。在你點開郵件系統的時候,垃圾郵件過濾器已經在后台幫你自動的過濾了垃圾廣告郵件。
-
工作閑暇之余,你去某寶通過關鍵字搜索某件你想要購買的東西,但是老板突然走了過了,你還沒有購買便強行退出了某寶。那么某寶會記錄你這次的行為,然后你下次登陸某寶時會發現某寶換了一批你想要的產品推薦給你。
-
工作之后,你去一個大商場購買一袋酒鬼花生,然后在結賬的時候收銀員給了你一張5元的優惠券,可以用於購買一打啤酒。之所以你會得到這張優惠券,是因為這台收費軟件基於以前的統計知識,認為買酒鬼花生的人往往也會買啤酒。
-
回到家你拿出手機點開了抖音,你會發現抖音給你推送的都是你喜歡的短視頻,你看的目不轉睛。因為抖音在你每次搜索之后都會記錄你的行為,然后把所有與你搜索相關的視頻作為推送給你的主要目標。
總而言之,機器學習技術目前應用於各種場景,例如:人臉識別、手寫數字識別、垃圾郵件過濾和某寶的產品推薦。
什么是機器學習
機器學習
把無序的數據轉換成有用的信息。
應用場景
機器學習不限制某個單獨的領域,機器學習可以應用於任何需要解釋並操作數據的領域。
注意:機器學習無法保持完美地預測,但通過統計學的知識能夠提高我們預測的正確率,並且在社會科學領域,如果某個分析的正確率能高達60%就會被認為是非常成功的。如果我們需要建立一個模型,用此來預測如何能讓每個人以同樣的方式獲得幸福。但這可想而知是很難得,因為大家對幸福的理解都是迥異不同的。
海量數據
現在智能手機上有各式各樣的傳感器,例如磁力計、偏航率陀螺儀、三軸加速器、溫度傳感器和 GPS 接收器,通過這些傳感器會產生海量的數據,也就意味着我們未來要面臨越來越多的數據,因此如何從這些海量數據中抽取到有價值的信息將是一個非常重要的課題。
機器學習的重要性
在過去的半個世紀里,發達國家的多數工作崗位都從體力勞動轉化為腦力勞動,但現在都在逐步消失,例如目前興起的無人便利店、無人加油站、無人飛機、無人駕駛等等,而這些都依賴於對信息的處理,對海量數據的處理,機器學習也就運用而生,他將幫助我們從中抽取有用的信息。
機器學習的基本術語
如果我們工作一段時候后,打算去找中介買房。中介會詢問你對房子的需求,例如:大小、布局、朝向、地理位置。當然,一定不僅僅只有這些,我們假設中介只會問你這四點,而這四點在機器學習中稱之為特征feature,有時候也會稱為屬性attribute,以后我們會統稱為特征。
之后你說出了你的需求——大小:100㎡、布局:三室一廳一衛、朝向:朝南、地理位置:上海市徐匯區——的房子,然后中介會去他們的搜索系統中找到這些特征輸入對應的值,之后該系統會列出與你想要的房子相似的房源,並打印一份帶有價格的表格給你,這個表格中的每一所房子在機器學習中都是一個具有相關特征的示例instance,也可以稱之為樣本sample。
表1-1:基於上述特征搜索的房源
大小 | 布局 | 朝向 | 地理位置 | 價格 |
---|---|---|---|---|
100㎡ | 三室一廳一衛 | 朝北 | 上海市徐匯區 | 500w |
105㎡ | 三室兩廳一衛 | 朝南 | 上海市閔行區 | 502w |
100㎡ | 三室一廳一衛 | 朝南 | 上海市黃浦區 | 505w |
…… | …… | …… | …… | …… |
輸出該表格的搜索系統就是一個機器學習系統,他會對我們給出的數據判斷並把合適的結果推薦給我們,並且在推薦給我們之前他們使用回歸算法對這些房子的價格進行了預測。此處我們只拿房價預測舉例
這個時候我們可能對買房不感興趣了,因為我們只准備了100w,然而符合我們心里預期的房子最低也要500w,所以我們認為他們的機器學習系統對房價的預測是不准確的,所以我們想自己研究一個預測房價的機器學習系統賣給他們。現在我們就開始手動實現一個機器學習算法讓我們可以通過這四個特征來預測這所房子的價格。
-
因此我們去房源官網采集了一些數據,並對這些數據進行清洗,以確保我們的數據格式是我們的機器學習算法所需要的。
-
現在我們擁有了很多房子的數據供我們測試、分析,這些數據在機器學習中被稱為訓練集training set:訓練集用於訓練機器學習算法的數據樣本集合,表1-1就是一個包含多個訓練樣本training sample的訓練集,每個訓練樣本中包含4種特征、一個標記label:本例中標記是房價,是機器學習算法的預測結果。
-
在機器學習中,通常我們會把訓練集中的數據分為訓練數據training data和測試數據testing data,我們設計一個機器學習算法對訓練數據進行訓練,之后我們用測試數據來測試該算法的精准度——比對算法輸出的結果與測試數據已有的結果,就可以得出我們該算法的精准度,如果精准度沒有達到要求,我們就需要重新設計算法然后再分析。當然還有交叉驗證集的概念,以后我們在敘述。
如果我們做出的算法的精准度很高,我們就可以把機器學習算法轉換為應用程序,我們就可以把這個系統賣給那所中介了。
監督學習和非監督學習
監督學習:supervised learning
上述的房價的實例是通過房子的特征預測房價,而房價是連續值,因此用到的是回歸regression,即通過給定的特征擬合數據點的位置,然后通過該擬合曲線與測試數據點的位置即可得到測試的結果。機器學習的另一項任務是分類classification,他的目標變量大都是離散值,如果房價≥500w 的我們稱之為高房價,否則我們稱之為低房價,則我們可以通過房子的特征判斷房價是高房價還是低房價。分類和回歸都屬於監督學習,之所以稱之為監督學習,是因為這類算法必須知道預測什么,即有明確的目標變量。
非監督學習:unsupervised learning
除了對房價的預測,我們還可以對房子分成若干個組,每組我們稱為一個簇cluster,這些自動形成的簇可能對應一些潛在的概念划分,例如電梯房、無電梯房,但是電梯房和無電梯房這樣的概念我們事先是不知道的,並且訓練樣本通常也無該標記信息,只是通過聚類clustering的方法對房子的數據進行分析,然后給出了我們這樣一個潛在的概念。
當然,機器學習遠不止這些內容,但是這些基本術語對我們這些初學者來講,已經夠用了。房子也買了,預測房價系統也實現了,相信大家對機器學習有了一個更深層次的了解,而不是《變形金剛》中的大黃蜂諸如此類…
下面我們也要從一個買房者的身份轉換成一個機器學習者,這樣我們才能實現我們的房價預測系統順帶實現我們的買房大願,而不是以程序員的口吻說出:“怎么能這么貴呢?一定是房價預測系統出了問題。”
機器學習工具介紹
Python
首先淺談我們的 Python 吧!Python 相信大家一定不陌生,這兩年已經成了風口上的那頭“神豬”,他能成為“神豬”的原因和機器學習是密不可分的,他雖然沒有 編譯語言如 C 那樣的執行效率,但是他以開發效率快著稱,他的語法清晰,易於操作純文本文件,使用廣泛,存在大量的開發文檔。並且他一度被稱作可執行偽代碼,默認附帶了很多高級數據類型,可以使用自己熟悉的編程風格,如面向對象編程、面向過程編程。
Python 自帶的 SciPy 和 NumPy 等許多科學函數庫都可以實現向量和矩陣的操作,並且這些科學函數庫使用底層語言編寫,極大的提高了相關應用程序的計算性能。
Python 自帶的科學工具還可以與繪圖工具 Matplotlib協同工作。Matplotlib 可以繪制2D、3D 圖形,也可以處理科學研究中經常用到的圖形。
Python 的好處不多敘述,不能因為我們用 Python 而去吹捧他,只是因為他是真的很適合我們這些新手吧。並且最最重要的是:Python 的核心代碼可以使用 C 來替換,而沒必要非得和編譯型語言拼執行效率,那不是自尋死路嗎?
非 Python
機器學習的工具中,在我心中除了 Python其他的都是非 Python,為什么這么講呢?讓我娓娓道來。
首先 MATLAB 不用多講了,單個軟件授權費就要花費上千美元。作為一個合格的程序員,如果讓我花錢使用某個軟件,那么我情願……當然,你也可以使用 Octave,Octave 我也使用過一段時間,怎么講呢?執行速度是不用講的,但是 Octave 功能太單一,如果只是單純的拿來操作矩陣,那是可以的,如果用它來進行機器學習程序的編寫,我只能說有點累。
Java 和 C 等強類型語言也有矩陣數學庫,但是曾經網上就流傳過一段佳話:一個程序 C 寫可能需要100行,Java 可能需要50行,而 Python 可能只需要20行。對於只寫過 Python 代碼的你來說,你可能無法體會,但對於我這個用過 C 的人來說,為什么你寫個簡單的九九乘法表那么麻煩?不論更代碼是不是給人看的,更重要一點的是,在這個快社會,相比較快速的執行效率,公司還是希望更快的開發效率吧?畢竟現在是個人都想成為第一個吃螃蟹的人。當然,你自創的公司可能例外。
NumPy 函數庫基礎
注意:如果不熟悉線性代數也不用着急,這里用到的線性代數只是簡化不同的數據點上執行的相同數學運算。將數據表示為矩陣形式,只需要執行簡單的矩陣運算而不需要復雜的循環操作。總而言之使用線性代數只是為了簡化運算,並沒有用到較深的數學只是,例如矩陣的運算其實可以使用 for 循環來代替,只不過使用矩陣運算更方便、更有效率。
測試 Numpy 庫
注意:再次重申,也許你不懂線性代數,也許你不知道什么是數組,什么是矩陣,什么是矩陣的逆,什么是單位矩陣,但這一點都不影響你成為一名機器學習專家,但他或許會影響你成為圖靈、成為馮諾依曼那樣的大師,但我極力推薦你需要去自己了解一些機器學習的原理,這就好比看 Django、看 Flask 源碼一樣令你心情舒暢。這里推薦吳恩達老師機器學習視頻,以及周志華老師的《機器學習》西瓜書,都是很好的入門教材。
from numpy import *
print(random.rand(3,3)) # 構建一個3*3的隨機數組
'''
array([[0.49464356, 0.76076607, 0.43525461],
[0.37401296, 0.83818918, 0.8630109 ],
[0.30685469, 0.65686257, 0.9354526 ]])
'''
# 將數組轉化為矩陣
rand_mat = mat(random.rand(3,3))
print(rand_mat)
'''
matrix([[0.53549597, 0.1512243 , 0.13608029],
[0.43568756, 0.75499249, 0.27348369],
[0.06484205, 0.67025154, 0.25451123]])
'''
# 對矩陣求逆
inv_rand_mat = rand_mat.I
print(inv_rand_mat.I)
'''
matrix([[ 0.37301234, 2.22174614, -2.58680522],
[ -3.92575573, 5.37174698, -3.67318659],
[ 10.24338676, -14.7124522 , 14.26142481]])
'''
# 執行矩陣乘法
my_eye = inv_rand_mat * rand_mat
'''
計算結果本應該是單位矩陣,即對角線全是1,其他元素都是0,但是由於計算機處理有誤差,矩陣里還留下了許多非常小的元素。
matrix([[1.00000000e+00, 1.76037137e-17, 1.35053809e-16],
[7.06118772e-17, 1.00000000e+00, 3.09252006e-16],
[1.93493163e-16, 1.02215889e-17, 1.00000000e+00]])
'''
# 得到誤差值:
error = my_eye - eye(3)
'''
eye(3)得到一個3*3的單位矩陣
matrix([[ 0.00000000e+00, 1.76037137e-17, 1.35053809e-16],
[ 7.06118772e-17, -1.11022302e-16, 3.09252006e-16],
[ 1.93493163e-16, 1.02215889e-17, -3.33066907e-16]])
'''
測試 NumPy 庫代碼整合
rand_arra = random.rand(3,3)
rand_mat = mat(random.rand(3,3))
inv_rand_mat = rand_mat.I
my_eye = inv_rand_mat * rand_mat
error = my_eye - eye(3)
print("""
rand_arra: {0}\n
rand_mat: {1}\n
inv_rand_mat: {2}\n
my_eye: {3}\n
error: {4}""".format(
rand_arra,rand_mat,inv_rand_mat,my_eye,error))
總結
曾經熱火朝天的互聯網+、跌落神壇的比特幣(區塊鏈),不說接盤俠們,別那么悲觀,我們更應該考慮的是他們給多少人帶來了財富自由的機會,你要知道正態分布的左端只會漲不會跌。
現如今,如本文前面所說,現如今人類所能產生的數據量是海量的,隨着大數據的推進,數據量只會越來越大,而機器學習的重要性也可想而知。雖然Python、機器學習已經踩在風口浪尖上,他隨時有可能跌落神壇,但我們是無法預測他什么時候也會跌落神壇的,事實證明我們已經無法成為那第一頭“神豬”,也正是這個無法預測、這個事實證明,我們才有機會,你要知道,最后稱王的不是陳勝吳廣、不是 ofo、不是 Uber、不是開心農場,后來者居上,正所謂“長江后浪推前浪,前浪被拍死在沙灘上”,我們要向牛頓學習——站在巨人的肩膀上,然后超過他們,而不是鄙夷之。
曾聽過一段很經典的話,如果你只是單純的做IT,那么每年會有數不清的人和你競爭,這個市場遲早會飽和,Python 也許會成為下一個 C、下一個.net、下一個 Java,但是在醫葯行業你會編程,在汽車行業你會編程,那么就是香餑餑了。而現如今機器學習給我們提供了一個很好的機會,正如本文所說機器學習不限領域,它更多地是對數據的處理。
世俗也好,名利也罷,希望本文能讓你對機器學習有一個大概的了解,能夠愛上他。也許他並沒有你想的那么神秘。
預知后事如何,請看下回分解——k-近鄰算法