2016年10月26日 星期三

[Introduction to Machine Learning] 程式實做 Quiz: Features In The Enron Dataset & Quiz: How Many POIs Exist?

[Introduction to Machine Learning]  程式實做 Quiz: Features In The Enron Dataset

Python 的特色在於處理文字類型的資料,其中有個東西叫作 Dictionary

可以當作儲存不同型別的資料的工具


其中在 Datasets and Questions 這個章節中

問題1 : 我們需要找到 Enron_data 中總共有多少"人"

要計算總共有多少人的話,根據 Quiz: Size of the Enron Dataset 的提示

就相當於找到 dictionary 中的 key 的數目 (key:value pair中的key)

詳細可以看 5.5. Dictionaries 的解說


問題2 : 每個姓名總共有"幾種"不同種類的資料

要計算總共有幾種的話,根據論壇中的這篇發問 [Intro to Machine Learning] Solution to Lesson 5 quiz question (“finding the POIs in the Enron Data”) 

我們能夠順利找到總共有幾"種"

(但是實際執行的時候發現答案只有18,與真正的答案 21 差了 3 個... debug中)

附上正確答案 (Datasets and Question)

除錯:
根據目前debug的結果可以發現,我猜測是之後有題目是要求找具有 'poi' 的項目總共有幾個

裡面的確有一項是 'poi',所以要找 value 項是 poi 且為 true 的項目

所以不是python的什麼神奇指令 poi ,完全是誤會一場...XD

所以是我誤會了,程式碼本身沒有問題,是我誤會了題目跟程式碼之間的關聯性

所以上的正確答案是對的,直接用 len() 函式把任意一個 key 的子dictionary長度求出來

(想像成資料結構是父dictionary裡面有子dictionary就好,只是父dictionary存的key/value pair是一個一個的姓名,子dictionary是存一個一個的信件流向的資料)

得到的數值就是dictionary的value總個數

程式碼如下
-------------------------------------------------------
for key,value in enron_data.items(): #enron_data 是課堂練習用的資料庫
    if value["poi"] == True:
        count += 1
        print count

-------------------------------------------------------
[Introduction to Machine Learning] 程式實做 Quiz: Quiz: How Many POIs Exist?

We compiled a list of all POI names (in ../final_project/poi_names.txt) and associated email addresses (in ../final_project/poi_email_addresses.py).

How many POI’s were there total? (Use the names file, not the email addresses, since many folks have more than one address and a few didn’t work for Enron, so we don’t have their emails.)

Lesson 5 - How many POIs exist?

小心多餘的那兩行,所以記得在計算len()的時候記得把不包含姓名的那兩段劃掉!

#----------------------------------------------------------#
* Python debugger 工具 *

方案1 ubuntu cmd中搭配 Ipython/pdb 文字指令式 除錯工具
方案2 IDE gui 圖形化介面 除錯

難度 : 2 > 1
自由度(可適應Linux系統環境)與挑戰自己能力: 1>2


2016年10月18日 星期二

[Udacity-Introduction to Machine Learning] Min/Max Rescaler Coding Quiz


這次的 scaler 的實做結果,相當於 差補(Interpolation) 外加 均一化(Normalize) 功能




感謝國外網友 doug_178432664390571 的答案

Can some one please help me with the floating format #6

這次的作業發現 :

迴圈
1. 自己對於Python 的 for loop 語法不是這麼熟悉

數字運算
2. 對於Python 的數字運算規則還需要更清楚

Python 的浮點數 float 除法
How can I force division to be floating point in Python? Division keeps rounding down to 0

列表 List
3. list 的語法以及外掛append()使用功能沒這麼熟悉

2016年10月11日 星期二

[學習筆記22] 機器學習基石 - Lecture 10 Logistic Regression

[Youtube 影片38 Logistic Regression :: Logistic Regression Problem]

前面一個學習筆記 21 介紹了迴歸分析的方法,可以找到最好的W (WLin)

圖一、前情題要

如果今天我們要把這個系統應用到醫院的疾病判斷系統

我們先從二元判斷這件事情開始,我們在乎的是錯誤率是多少

圖二、心臟病的二元分類問題

在這邊我們與前一個想關注的問題不一樣

我們在意的是病患的心臟病發的機率是多少

意思是被標記為 o 的病患,判定正確的機率是多少 (還記得目標分布Target Distribution嗎?)

如果計算出的數值越高的話,就有越高的機率被評為 o

所以這邊用了一個詞叫作 Soft Binary Classification

圖三、心臟病的發生機率問題

 今天我們比較希望能夠得到一個有不同資料所計算出來的數值

但是實際上很有可能只能夠拿到 o 或 x 的二元資訊


圖四、理論與實際資料的差別

那轉念一想,我們是不是能夠將圖四中的實際資料,看作有雜訊的資料呢 ?

意思是,雖然我們的目標分布不一樣,但是二元分類的結果卻相同

問題來了,那我們要怎麼找出合適的Hypothsis來分辨這些ox資料的實際目標分布呢?

圖五、含有雜訊的資料

聰明的人想到一個辦法,就是這邊要介紹的 Logistic Hypothesis

( 在樣型識別中會學到的 Sigmoid )

加入x0項之後,將這些x們與權重w進行計算,叫作風險分數 (risk score)

再把風險分數變成估測某件事情發生的機率,便能夠達成前一個問題所問的事情

那怎麼求得  Logistic hypothesis 呢 ?

圖六、Logistic hypothesis

圖七中顯示的就是 Logistic hypothesis 的公式

是一個平滑,嚴格遞增,長得有點像s曲現的函數,稱作 Sigmoid 函數

得到了這個 Logistic hypothesis,我們就能夠將它應用在 h(x)上

圖七、Logistic Function

課後練習


Ans : 從選項裡面找到能夠與 Simoid 輸出一樣結果的,就是答案


-----------------------------------------------------------------------------------------------
[Youtube 影片39 Logistic Regression :: Logistic Regression Error]

圖八中,這三個不同的模型,都是為了要達到資料分類的目的

那今天就是要求出 logistic regression 的錯誤衡量方式 err

圖八、三個學過的模型

如果今天有一組資料 D,這些資料產生的機率 f 是多少 ?

圖九、可能性

圖十、 條件機率用 1- f(x) 取代

又因為 f  和 p是密不可分的,所以可以將條件機率的部分 P(o或x | xn) 換成 1 - f(xn)

由於 f 的取得可能有困難,因此我們假裝 h 是 f  (雖然不是真的取代,但不妨試試)

來看看 h 產生與f結果一模一樣的機率有多少 ?

如果今天 h 跟 f 很接近的話,他們一模一樣的機率就很高

圖十一、用 h 假裝取代 f

從所有的 h 找可能性最高的來當 g

由於Logistic函數的對稱性,可以將 1-h(x) 改寫成 h(-x)

那麼我們能夠把原本探討可能性的式子,變成所有項的相乘

灰色的部分得話,是因為相同,所以顯示的是圖十二與圖十三中不一樣的部分

圖十二、可能性的計算方式

將可能性計算公式 Likelihood(h) 進行改寫,將 1-h(x) 改寫成 h(-x)

就可以得到連乘的式子結果,可能性正比於所有項的相乘

圖十三、可能性的計算方式改寫

推導 Cross Entropy Error

想要知道最大的可能性,我們取 Likelihood 公式的最大值

圖十四、Cross entropy error公式 -1

將 h 換成 w,針對有興趣的權重進行計算

圖十五、Cross entropy error公式 -2

那能不能為了方便微分等,將連乘換成連加呢?

當然可以,取 log 即可

圖十六、Cross entropy error公式 -3

將 yn wT xn 代入θ (s) 中,便可得到新的 pointwise 的式子,叫作 cross entropy error

由於這邊有一個負號,因此從求取 最大值 變成求取 最小值

至於為什麼叫 cross entropy 可以參考相關數學書籍,老師不在此介紹


圖十七、Cross entropy error公式-4

課後練習


Ans :

複習符號函數,這邊符號函數應該加入 wTx > 0 / wTx < 0 比較精確


-----------------------------------------------------------------------------------------------
[Youtube 影片40 Logistic Regression :: Gradient of Logistic Regression Error]

承前一講,我們在這邊的目標是最小化Ein(w)

最小化Ein(w):Ein(w)是連續可微分的凸函數,透過微分為零的點找到 Ein(w) 的最低點

而微分就相當於求 Ein(w) 的Gradient


圖十八、最小化Ein(w)

利用微積分的鏈鎖律,並將ln()中的式子以符號代換。

以這些符號代表的目的是為了方便運算用

圖十九、Ein(w)的Gradient

以下是推導過程,並得到與 θ() 函數有關連的式子


圖二十、Ein(w) Gradient的推導過程

求得Ein(w) Gradient 最小值(谷底),意思就是要找到使Gradient為零的w

從梯度的公式可以看得出來,它是一個以θ為權重的-YnXn總合

那θ的總和怎樣會是零呢? 

其中一個可能是它們全部都是零 (只是其中一種) 

而θ怎樣會是零呢? 

很簡單,就是它們的YnXTX遠大於零(θ 的函式可以複習上面教過得內容)

因此w和x正負號會相同,因此這些資料會是線性可分割的資料(情況較為簡單的狀況)

但是請記住,真實世界的問題沒有這麼簡單!

因此還是要乖乖的去找θ權重總合真的為零的解是多少

而且很抱歉,沒有closed-form的解答,沒有一個簡單的公式可以求得...

圖二十一、關於θ權重的總和

只好回頭到先前學過的PLA去尋求解答

先從一個起點出發,並看它哪裡有錯誤,並對它進行修正

一直進行PLA的步驟直到結束為止

圖二十二、複習PLA

為了方便討論,將前兩個步驟簡化成一個步驟

如果是錯的,就加上後面ynxn那項

圖二十三、PLA 步驟合併

更新後的式子中,可以將ynxn那項看作一個常數項乘上一個向量

常數項可以看作我們執行一次PLA,它會走幾步

向量項則能夠決定要往那個方向走

它會反覆執行好幾次,這個執行好幾次的過程,就是稱作循序的(iterative)最佳化方法

圖二十四、iterative optimization approach
課後練習


Ans :

 如果忘記了,就再次複習θ函數吧:P

-----------------------------------------------------------------------------------------------
[Youtube 影片41 Logistic Regression :: Gradient Descent]

尋求最低點的方法其中之一就是 梯度下降演算法

PLA 則是透過 v 來對權重 w 進行更新的動作,v決定方向,η (唸作eta)決定跨多大步

如果貪心的話,為了快點達到谷底,我們可以讓下降速度最快

意思就是透過調整 η (eta),讓 ηv 項最大化,使得Ein(w)變得最小


圖二十五、尋找最低點

問題來了,Ein(wt+ ηv) 依然是非線性的問題,並沒有比較好解

於是,我們可以透過局部相似(local approximation)讓原本討厭的非線性問題變成線性

那,我們是不是可以探討在向量 v 上是線性呢?

如果只看局部一小段線段, η (eta) 很小

可以將原本的式子變成以前學過得線性方程式 y = b + ax 的形式

斜率 a 就相當於∇Ein(wt)

透過探討一小段線段,我們可以把原本的式子變成泰勒展開式,變成線性的問題

圖二十七、線性相似方法

我們先將不重要的部份先用灰色的值表示,Ein(wt)是常數,η是使用者自己決定的已知數

需要探討的只有後面 vT ∇Ein(wt)這項 (∇唸作nabla) (vT為向量)

又v要求為單位向量,因此需要經過normalized

如果兩個向量方向相反,內積最小

所謂的梯度下降演算法,就是往斜率變化的反方向進行移動

只要能夠求出斜率,就能夠使用梯度下降演算法

因為一次又想要移動很多步,所以會稱作greedy

Gradient Descent

圖二十八、梯度下降演算法
Choice of η

η (eta)該怎決定呢?

先來看不好的case,一步走很小以及一步走很大的案例

太小步的話,走得會太慢,反之,則可能會非常不穩定

比較聰明的方式是坡度大的時候,走大步一點 ; 坡度小的時候,就走小步一點

因此,η應該要與 ∇Ein(wt) 正相關

圖二十九、 η 的選擇

將原來的式子進行調整一下

紫色的 η 稱作fixed learning rate,以大小適中的紫色的 η 進行學習,稱作 fixed learning

圖三十、fixed learning rate (紫色 η )

實務上不需要一定非要等到∇Ein(wt) = 0才可以,大約等於零的話就可以停止了 :)

概念上與 pocket 演算法接近

圖三十一、

課後練習


Ans :
t = 0的時候,θ(...) = θ(yn * 0 * xn) = θ(0) = 1/2,如下圖所示



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


2016年10月8日 星期六

[Udacity-Deep Learning] Quiz : Softmax

開始上 Udacity 由Google所開設的Deep Learning課程

遇到了第一個Quiz問題

想吐槽的點是,Softmax 在Udacity的影片裡面根本沒提到Softmax的演算法

就直接叫我們進行python的程式撰寫

搞了一個多小時,撞了牆之後才發現原來我根本搞錯啦 XDDDD

Wiki 中,Softmax的條目說,Softmax演算法應用於機率與機器學習等不同的領域中

"In mathematics, in particular probability theory and related fields, the softmax function, or normalized exponential,[1]:198 is a generalization of the logistic function that "squashes" a K-dimensional vector  of arbitrary real values to a K-dimensional vector  of real values in the range (0, 1) that add up to 1. The function is given by

    for j = 1, …, K."

基本上,演算法就是上面的那個運算式進行撰寫

softmax : np.exp(x) / np.sum( np.exp(x), axis = 0 )



附上Udacity論壇中有人跟我有一樣的疑惑的問題

Why do we use exponentials in Softmax ? 

關於 exp() 運算複雜的問題,有相關的stackoverflow上的問題

Why use softmax as opposed to standard normalization?

2016年9月29日 星期四

[轉貼] 阳志平 - 笨方法学语言

阳志平 先生在他的個人網誌上面撰寫了 語言學習方法 的文章

原文在此 阳志平 - 笨方法学语言

-----------------------------------------------------------------------------------------------------------------
文章中介紹 Gabriel Wyner 將學習語言拆解成了七個步驟,方便大家按照步驟進行學習

Gabriel Wyner的個人網頁、 他寫在 lifehacker上的個人故事

以下是內容的濃縮 :

步骤1:明白目标

学习语言要达到什么样的程度? 可參考 歐洲通用語言標準

步骤2:熟悉国际音标

步骤3:挑选高频词汇

步骤4:使用Anki对高频词汇进行间隔重复记忆

步骤5:利用高频词汇在社交日记网站写日记等

在 lang-8 網站(一開始的頁面就說 : Let our community of native speakers support your language

learning.)練習

步骤6:阅读感兴趣的文本,听感兴趣的音频材料

步骤7:沉浸

[學習筆記21] 機器學習基石 - Lecture 9 Linear Regression

提醒 :

這邊的章節推導等,會使用到大量的線性代數 

可以以 MIT 的 Linear Algebra, Spring 2005 OCW 來作複習教材

------------------------------------------------------------------------------------------------------------
[Youtube 影片34 Linear Regression :: Linear Regression Problem]

前情回顧,學習可以在低 Ein 與 err 的情況,與有著目標分布的情況下進行

VC Bound 也能夠應用在不同的 error measure 上,也能夠應用在有noise的數據上
 
圖一、前情題要

今天如果已經分類完之後,不需要再考慮客戶是否具備發卡資格(不再是是非題了)

轉而我們想要知道要給某個顧客"多少"信用額度

而我們的 Target function 是一個能夠輸出實數的式子,並且是正的實數

在這邊我們的輸出可以使用迴歸(Regression)分析[1]

實際上Regression輸出空間就是整個實數

圖二、信用卡額度上限問題

那學習演算法該如何進行 ?

與前一個學習筆記20的內容類似

一樣是透過加權的方式算出一個分數,並以該分數來作為評斷依據

我們現在想要的就是這個實數與我們想要的值能夠越接近越好

和先前一樣,在原來的資料加上一個常數項 x0,使得式子能夠以 sigma 表示

圖三、線性迴歸假說

x對應的是實數, y對應的是輸出結果

2D平面上,我們希望得到的這個線,與數據點 o 越接近越好

3D 立體空間上, 一樣希望得到一個平面,與這些數據點 o 越接近越好

同時餘數誤差(residual)越小越好

圖四、線性迴歸圖示

該如何衡量residual是大或小 ?

這邊的衡量方式是使用前面已經學習過的 squared error來進行計算 (採用原因請看統計學)

同樣分成 in-sample 與 out-of-sample 的計算方法,同時可能會有noise在我們的輸入輸出中

圖五、誤差量衡量方法











圖六、In-sample、Out-of-sanple誤差衡量方式


如何將 Ein(w)最小化 ? 如果能夠將Ein(w)變到最小,就可能可以進行機器學習

之後的影片中將會告訴我們如何辦到這件事

圖七、如何最小化Ein(w)

課後練習


Ans:  概念不難,邏輯上收入越高者,環款能力越好,可以給予的信用額度便越高

------------------------------------------------------------------------------------------------------------
[Youtube 影片35 Linear Regression :: Linear Regression :: Linear Regression Algorithm]

為了將整體的Ein算式能夠最簡潔的表達出來,在這邊決定以矩陣的方式進行表達

以下為推導過程:

圖八、Ein(w)矩陣形式

因此,Ein(w)的式子可以轉變成圖八最後的式子

本節的任務就是求得圖九中所說的 min Ein(w)

圖九、Ein 最小值


Ein(w)是一個連續可微分的凸函數 (convex),存在最小值

這個最小值是凸函數的谷底,也就是最低點的地方,梯度是零(不能夠再往下滾, 即roll down)

我們的任務就是找到合適的 w,使得 Ein(w) 微分為零,便能夠求得Ein(w)的最小值

( 這邊先不考慮局部最小跟全域最小的問題 )

圖十、convex

圖十一列出了Ein(w)的梯度公式,並將它展開,得到主要三項,w的2次式、1次式與常數項


圖十一、Ein(w)的梯度公式

若從一個維度開始推導,相當於將w的2次式進行微分,微分後的結果相當簡單

同樣的,改成對線性代數的部分進行微分

可以發現,即使以矩陣形式來進行表達,從結果來看,其實形式是一樣的

圖十二、線性代數分析

我們的任務只有一個,就是找到合適的w,使得 Ein 的梯度為零,即可得到最小值


圖十三、線性迴歸最佳化的任務

若以psuedo inverse進行運算,可以求得w反矩陣,便能找到唯一解

大部分的情形,通常在資料數N遠大於 d+1的情況可以成立

若有很多組解的情況,便有很多種求解方法

從線性代數或是數值領域,可以知道常用的方法為何

若有現有的函式庫的話,老師建議直接使用

畢竟其他程式撰寫者已經最佳化了,我們不用重複做相同的任務

圖十四、可逆、奇異矩陣

在這邊終於將輸入X與輸出Y進行一個分拆,透過計算psuedo-inverse

我們可以得到線性迴歸的解 !

圖十五、線性迴歸演算法

透過線性代數這個強大的工具,可以輕易且有效的延伸到多維的空間

圖十六、good routine

課後練習


Ans:

推導不出來y head = XWLin這個式子...

------------------------------------------------------------------------------------------------------------
[Youtube 影片36 Linear Regression :: ]

請問 : 線性迴歸 (Linear Rregression) 真的是機器學習嗎???

No = > 就像是一個一步可以求出(instantaneos)的公式化 (Closed-form) 答案

Yes => 從某些角度上,線性迴歸可以說是機器學習的演算法

因為它可以求得最佳化的Ein,同時也有好的Eout

同時透過 Psuedo inverse 就可以算出來,每次隨著 Psuedo inverse 的解而不斷進步

但實際上,求 Psuedo inverse 需要迭代好幾次

只是我們不知道程式在計算過程中發生什麼事情

只要最後的Eout(WLin)結果很不錯,那麼就有學習!


圖十七、

現在來求,抓一把起來之後的資料平均的Ein (Ein上面加一橫的符號)

它又稱作 noise level ,d+1是我們的自由度,N是我們的資料量

利用線性迴歸的特性,將下面的結果推出來 (完整的證明過程並沒有詳細說明)

y hat 是我們的預測結果,從前一講的課後練習可以知道 y hat = X(Xhat)y

統計學家稱XXhat 叫作帽子矩陣 (Hat Matrix)

圖十八、

線性代數 帽子矩陣 Hat Matrix

y是一個在N維空間的向量(y1~yn)

要預測y hat,先讓 y hat 在做線性迴歸前,以X 乘上一個任意的向量W,

將每一個 X 的 column作線性組合,展開(span)成一個空間

而y hat就在該空間中(如圖 紅色區域)

我們希望 y 與 y hat 差異越小越好,

H 是y投影到 y hat 的矩陣

trace是指對角線上的值
----------------------------------------
線性代數知識小補充

同學 :
老師您好
想請問一下在15頁裡為什麼這邊要特別用trace(I-H)來代表residual呢?
因為I-H會投影到span(X)的正交補空間 那麼用rank不是會比較有幾何意義嗎? 還是說trace在後面會有其他運用呢?

林老師回覆 : 在這個例子裡面,建議可以去推導一下,Rank 和 Trace 是有很強的關係

同學 :
推完才想起來投影矩陣對角化的形式會得出rank=trace

圖十九、

理想的target function會落在 X 所展開的區域

因此,我們真正看到的 label 就是目標函數加上 noise 向量 (即y - yhat)

noise 就能夠由 (y-yhat) 轉變成 (I-H)

因此,Ein 與 Eout 的平均就能夠順利得到,如圖二十所示

圖二十、

有多少資料量,Ein 和 Eout 平均值的曲線圖 (VC Bound中的曲線不是平均)

如果資料筆數很大的情況底下,Ein 與 Eout 會收驗到 sigma 的平方

平均的error值會是 2(d+1)/N

圖二十一、

從這邊推導的結果,以及前面推導VC Dimension的結果

我們有理由相信,在noise不大的情況底下,線性迴歸是學習演算法

圖二十二、


課後練習


Ans:

選項1,H是對稱的

以下兩個選項可以透過證明得到

? 選項2,做了兩次投影,投影到相同的空間裡面

? 選項3,兩次轉換取餘數與一次轉換取餘數是一樣的


------------------------------------------------------------------------------------------------------------
[Youtube 影片37 Linear Regression :: ]

線性分類 vs 線性迴歸

NP-hard (non-deterministic polynomial-time hard) 名詞小解釋 [2]

線性分類 與 線性迴歸 的不同地方在於,它的輸出空間直接是實數,不再是 +1 與 -1

假設的輸出結果是wTx,錯誤量的衡量是(y hat - y)的平方

它是屬於有效率的分析解

圖二十三、

線性迴歸真的能夠這麼快速的把結果算出來嗎?  如何從數學的角度來證明這件事情?

圖二十四、

我們從圖形化的角度來比較兩個不同 error 運算方法之間的差異

可以知道 err 0/1  ≦ err sqr

圖二十五、

從VC Dimension中,可以得到圖二十六的第一個不等式

在從剛剛上面的結論,我們就可以得到第二個不等式

由於err 0/1並不好解,所以我們換成 err sqr,因此我們的err hat是採用 err sqr

以寬鬆一點的Bound,比較容易得找到想要的解

因此,可以先用線性迴歸先取得 WLin 來當作PLA 或 pocket 演算法的初始參數 w0

來加速PLA演算法

圖二十六、

課後練習


Ans:

? 畫圖出來可以得到這題的答案。

這三個答案選項都是機器學習中很重要的上限,之後會針對這個部分進行介紹


總結

介紹了線性迴歸的演算法,以解析的方式求得了線性迴歸的解

同時,新的Eout - Ein 大約等於 2(d+1) / N  (d= 維度, N = 資料量)

線性迴歸之後會拿來用在二元分類問題上面,敬請期待 : P

圖二十七、總結

------------------------------------------------------------------------------------------------------------
PS. 如果要打方程式,似乎以 Gitbook 做記錄更好

[1] 演算法筆記 - 迴歸分析

[2] 論P,NP, NP-hard, NP-complete問題
/* 載入prettify的autoloader */ /* 載入JQuery */