1. 程式人生 > 實用技巧 >01-01 機器學習

01-01 機器學習

目錄
更新、更全的《機器學習》的更新網站,更有python、go、資料結構與演算法、爬蟲、人工智慧教學等著你:https://www.cnblogs.com/nickchen121/p/11686958.html

機器學習

可能有很多同學想到高大上的人工智慧、機器學習和深度學習,會在懷疑我是否能學會。在自我懷疑之前,我希望你能考慮一個問題,你瞭解機動車的構造原理嗎?難道你不瞭解機動車的構造就不能開車了嗎?我們的機器學習也是如此,你只要拿到一張“駕駛證”,你就能很好的應用它,並且能通過本文的學習,快速的為公司、為企業直接創造價值。

機器學習已經不知不覺的走入了我們的生活,我們可能無法干涉它的崛起,也可能無法建立如十大演算法一樣的演算法。但現如今生活的方方面面都有著機器學習的身影,為什麼我們不試著去認識它呢,讓我們能在機器學習徹底降臨之前做好駕馭它的準備呢?

一、學習目標

  1. 瞭解人工智慧、機器學習和深度學習之間的區別
  2. 掌握機器學習中的監督學習和無監督學習問題

二、人工智慧

人工智慧(artificial intelligence, AI):通過機器來模擬人類認知的技術。

人工智慧被新聞媒體吹捧的讓人遙不可及,但是細心的你可能會發現人工智慧其實已經走入了我們的生活,並且已經步入以下幾個領域。

  1. 人臉識別應用中,他根據輸入的照片,判斷照片中的人是誰
  2. 醫療診斷中,他根據輸入的醫療影像,判斷疾病的成因
  3. 語音識別中,他根據人說話的音訊訊號,判斷說話的內容
  4. 電子商務網站中,他根據使用者曾經的購買記錄,預測使用者感興趣的商品,網站進而達到推薦商品的目的
  5. 自動駕駛應用中,他根據對當前汽車所處情況的分析,判斷汽車接下來的速度和方向
  6. 金融應用中,他根據股票曾經的價格和其他交易資訊,預測股票未來的價格走勢
  7. 圍棋對弈中,他根據當前的盤面形式,預測在哪個地方落子勝率最大(2016年3月的alphago大戰李世石)
  8. 基因測序應用中,他根據對人的基因序列的分析,預測這個人未來患病的可能性
  9. 智慧家居、智慧玩具、網路安全……

最後,引用《終極演算法》中的一段話:"我們可能無法阻擋人工智慧發展的趨勢,但是我們可以學會和他做朋友。"

三、機器學習

機器學習(machine learning):通過學習獲得進行預測或判斷的能力的人工智慧。

機器學習是人工智慧實現的一種方法(演算法)。他主要是從已知資料中去學習資料中蘊含的規律或者判斷規則,也可以理解成把無序的資訊變得有序,然後他通過把這種規律應用到未來的新資料上,並對新資料做出判斷或預測。

例如某個機器學習演算法從全球70億人類的資料集中學得了某種判斷規則,這個判斷規則可以通過輸入Nick老師的身高180cm、體重70Kg,判斷他是個帥哥。

3.1 機器學習基本術語

# 機器學習基本術語圖例
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 顯示plt.show()的圖片,如若不使用jupyter,請註釋
%matplotlib inline
# 中文字型設定,找到與之對應的中文字型路徑
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

# 樣本
plt.text(1, 70, s='{身高(180),體重(70),年齡(19),五官(精緻)',
fontproperties=font, fontsize=13, color='g')
plt.annotate(text='樣本', xytext=(90, 70), xy=(78, 71), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='特徵', xytext=(30, 90), xy=(10, 73), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='', xytext=(30, 90), xy=(30, 73), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='', xytext=(30, 90), xy=(50, 73), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='', xytext=(30, 90), xy=(70, 73), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')

plt.hlines(67, 0, 100, linestyle='--', color='gray')

# 特徵
plt.text(1, 40, s='{身高(180),體重(70),年齡(19),五官(精緻),帥}',
fontproperties=font, fontsize=10, color='g')
plt.annotate(text='樣例(例項)', xytext=(90, 40), xy=(70, 41), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='特徵', xytext=(30, 60), xy=(8, 43), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='', xytext=(30, 60), xy=(23, 43), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='', xytext=(30, 60), xy=(38, 43), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='', xytext=(30, 60), xy=(53, 43), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='標記', xytext=(67, 60), xy=(67, 43), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')

plt.hlines(37, 0, 100, linestyle='--', color='gray')

# 特徵空間
plt.text(1, 30, s='\(\{(x_1^{(1)},x_1^{(2)},\cdots,x_1^{(n)}),(x_2^{(1)},x_2^{(2)},\cdots,x_2^{(n)}),\cdots,(x_m^{(1)},x_m^{(2)},\cdots,x_m^{(n)})\}\)',
fontproperties=font, fontsize=10, color='g')
plt.annotate(text='特徵空間(\(m\)個樣本)', xytext=(90, 15), xy=(92, 30), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')
plt.annotate(text='特徵向量(\(n\)維特徵)', xytext=(15, 15), xy=(15, 28), ha='center', arrowprops=dict(
arrowstyle="<-", color='b'), fontproperties=font, fontsize=15, color='r')

plt.xlim(0, 100)
plt.ylim(10, 100)
plt.title('機器學習基本術語圖例', fontproperties=font, fontsize=20)
plt.show()

通過上圖,我們可以習得以下機器學習的基本術語:

  • 特徵(feature):描述一件事物的特性,如一個人的身高、體重、年齡和五官。
  • 樣本(sample):由一個人的特徵組成的資料,如{180,70,19,}
  • 標記(label):描述一件事物的特性,如一個人帥或醜、一個人的財富數量。注:特徵和標記沒有明確的劃分,由於問題的不同可能導致A問題的特徵是B問題的標記,B問題的標記是A問題的特徵。
  • 樣例(example):由一個人的特徵和標記組成的資料,如{180,70,19,,}
  • 特徵空間(feature space):由{x(1),x(2),,x(n)}這n個特徵張成的n維空間,如以身高張成的一維空間(線);以身高和體重張成的二維空間(面);以身高、體重和年齡張成的三維空間(體)。
  • 特徵向量(feature vector):特徵空間內的某一個具體的向量,即特種空間中的某一個具體的點,

{xi(1),xi(2),,xi(n)},iR

其中xm(n)表示第m個人的第n個特徵。如身高、體重、年齡張成的三維空間中的某一個具體的點(180,70,19)

四、深度學習

深度學習(deep learning):通過組合低層屬性特徵形成更加抽象的高層屬性特徵。如學英語的時候,“Nick handsome”這12個英文單詞是低層屬性特徵,而“Nick handsome”的語義則是抽象的高層屬性特徵。

深度學習的概念源於人工神經網路的研究,它屬於機器學習中的某一個方法,其中深度學習中的“深度”是指神經網路的層數。

五、機器學習分類

機器學習依據資料集資料格式的不同,可以劃分成監督學習和無監督學習;依據演算法模式的不同可以劃分為監督學習、無監督學習、半監督學習和強化學習。

5.1 監督學習

監督學習(supervised learning):通過輸入一組已知標記的樣本,輸出一個模型(model),然後通過這個模型預測未來新資料的預測值或預測類別。

監督學習的流程:

  1. 輸入:一組已知類別的樣本
  2. 輸出:一個模型
  3. 預測未來新資料的預測值或預測類別

由於資料標記的型別不同,監督學習問題又分為迴歸問題和分類問題:

  • 如果模型的輸出為連續值,如股票價格2.2,2.4,2.6,3型別的資料稱為連續值,則該監督學習問題稱作迴歸問題
  • 如果模型的輸出為離散值,如,,{0,1}(輸出不是0就是1),則該監督學習問題稱作分類問題。

5.1.1 迴歸問題

序號 房子面積(m2) 房價(元)
1 10 100
2 20 200
3 40 400
4 100 1000
5 200 2000
# 迴歸問題圖例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

x = np.linspace(0, 200, 10)
y = 10*x

plt.plot(x, y)
plt.xlabel('房子面積', fontproperties=font, fontsize=15)
plt.ylabel('房價', fontproperties=font, fontsize=15)
plt.title('迴歸問題圖例', fontproperties=font, fontsize=20)
plt.show()

通過上表給出的資料集(一組已知標記的樣本)舉例,通過資料集中的資料,我們可以假設房子面積和房價之間存在某種關係(模型)為

=10

假設你在得到房子面積和房價之間的關係後,得到了上海二環某一所房子H1的面積為1000m2的訊息(未來新資料),這個時候你就可以通過H1的房子面積和房價之間的關係得到這所房子的價格為

H1=10H1=101000=10000()預測值

在這個迴歸問題中:

  1. 房子面積稱為特徵(feature)
  2. 房價稱為標記(label)

5.1.2 分類問題

序號 房子面積(m2) 房子所在區域
1 10 A區
2 20 A區
3 40 A區
4 100 B區
5 200 B區
# 分類問題圖例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

a_area = [10, 20, 40]
a_y = [0, 0, 0]

b_area = [100, 200]
b_y = [0, 0]

plt.scatter(a_area, a_y, label='A', color='r')
plt.scatter(b_area, b_y, label='B', color='g')
plt.vlines(50, ymin=-0.015, ymax=0.015, color='gray', linestyles='--')
plt.xlabel('房子面積', fontproperties=font, fontsize=15)
plt.title('分類問題圖例', fontproperties=font, fontsize=20)
plt.legend()
plt.show()

同樣通過上表給出的資料集舉例,通過資料集的資料,我們可以假設房子面積和房子所在區域存在某種關係為

={P(A|<50m2)P(B|>50m2)

其中P(A|<50m2)為條件概率,即當滿足<50m2條件時房子所在區域為A的概率;P(B|>50m2)也為條件概率,當滿足>50m2條件時房子所在區域為B區的概率。

假設你在得到房子面積和房子所在區域的關係後,得到了上海二環內兩所房子H1H2面積分別為30m21000m2的訊息,這個時候你就可以通過房子面積和房子所在區域之間的關係得到這兩所房子所在的區域

{H1<50m2,H1A1,H1B0預測類別H2>50m2,H2B1,H2A0預測類別

在這個分類問題中:

  1. 房子面積稱為特徵
  2. 房子所在區域稱為標記

5.2 無監督學習

無監督學習(unsupervised learning):通過輸入一組未知標記的樣本,可以通過聚類(clustering)的方法,將資料分成多個簇(cluster)。

無監督學習的流程:

  1. 輸入:一組未知類別的樣本
  2. 輸出:分成多個簇的一組樣本

5.2.1 聚類

聚類(clustering):將資料集分成由類似的資料組成的多個類的過程被稱為聚類。由聚類所生成的簇是一組資料的集合,同一個簇中的資料彼此相似,不同簇中的物件相異。

需要注意的是,組成多個簇的概念是由某種非人為定義的潛在概念自動生成的,而我們在監督學習中的分類都有明確的定義,即按照房子面積和房價的關係、房子面積和房子所在區域的關係。

序號 房子面積(m2)
1 10
2 20
3 40
4 100
5 200

通過上表給出的資料集舉例,通過聚類可能把資料集中的5個數據分成兩個簇,即房子面積大於50的分為一個簇,房子面積小於50的為另一個簇,而這種通過面積分類並不是我們事先設定的,而是由聚類演算法自己實現的。也就是說通過聚類把上表的資料集分為兩簇,但是我們需要在把資料集分成兩個簇後再去決定用什麼概念定義這兩個簇的劃分。

5.3 半監督學習

半監督學習(semi-supervised learning):監督學習與無監督學習相結合的一種學習方法。

監督學習和無監督學習的區別主要在於資料集中的資料是否具有標記,當某個問題中的資料集中的資料具有標記時,我們稱之為監督學習;反之,我們稱之為無監督學習。

目前,由於無監督學習演算法的不穩定性,它一般作為中間演算法,工業上使用較多的是監督學習演算法。但是目前工業上累積較多的是不帶標記的資料,因此無監督學習在未來將是一個技術突破的重點目標。為了處理這批不帶標記的資料,也有科學家提出了半監督學習,它可以簡單的理解為監督學習和無監督學習的綜合運用,它即使用帶有標記的資料也使用不帶有標記的資料。

5.4 強化學習

強化學習(reinforcement learning):學習系統從環境到行為對映的學習,目標是使智慧體獲得最大的獎勵,即強化訊號最大。

強化學習類似於無監督學習,但是又不同於無監督學習,強化學習針對的是無標記的資料,但是在強化學習演算法對無標記的資料進行處理的同時會給出一個特定的目標,如果演算法的處理結果偏離目標,則會給出懲罰;反之,給出獎勵,而該演算法的目標就是為了獲得最大獎勵。強化學習一般用於無人駕駛。

六、Python語言的優勢

我們可以通過Python、R、C、Java、MATLAB、Octave等工具實現機器學習演算法。本文接下來將通過Python實現,因此在這裡簡單說說Python的優勢:語法清晰簡單、易於操作文字檔案、優秀的開源社群提供了大量的開源軟體庫,如scikit-learn、tensorflow等。

本文基於Python3.6+版本,不建議使用Python2.7版本。可以從https://www.python.org/downloads/下載Python。

Anaconda作為Python的科學計算軟體包同樣非常適合機器學習。可以從https://www.anaconda.com/download/下載Anaconda。

本文使用的機器學習軟體庫:

  • numpy 1.15.2
  • scipy 1.1.0
  • scikit-learn 0.20.0
  • matplotlib 3.0.2
  • xlrd 1.2.0
  • pandas 0.23.4
  • tensorflow 1.1.0
# 終端輸入,安裝numpy,其他第三庫同理
!pip install numpy==1.15.2
Requirement already satisfied: numpy==1.15.2 in /Applications/anaconda3/lib/python3.6/site-packages (1.15.2)
import numpy

# 列印sklearn的版本
numpy.version

'1.15.2'

七、小結

機器學習可以淺顯的認為對資料做處理,分析資料得到某種預測或者判斷的能力。也就是說,只要有資料產生的地方,就會有機器學習的用武之地。在這個感測器發達的時代,各行各業都積累著大量的資料,因此機器學習其實不僅僅是計算機專業的人需要習得的,就比如最早的專家系統,需要的是某個領域的專家和電腦科學家兩者共同努力才能完成一個專家系統。在未來,相信機器學習將會變得和英語一樣普及,它將會變得大眾化。

本章主要帶大家介紹了人工智慧、機器學習和深度學習的區別,並通過人體特徵帶大家瞭解了機器學習中常用的術語。之後,使用房價/房子所在區域的例子帶大家認識了機器學習的目前最流行的四大分類演算法,分別是監督學習、無監督學習、半監督學習和強化學習。本章最後也和大家介紹了我們未來需要使用的Python第三方庫。

歡迎來到機器學習的世界。