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?
/* 載入prettify的autoloader */ /* 載入JQuery */