星期六, 5月 09, 2015

CUDA: Rule File in VC2008

執行 CUDA file (.cu) 時, 如果發生某某預期的 header file 不能讀取, 很可能是 CUDA file 沒有使用正確的 CUDA rules, 或是該 rule file 的 include path 不正確.

以下是 VS2008/VC++ 下設定 cuda rules 的方法


1. 一般來說, cuda rule 會置於VCProjectDefaults 下, 如下

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\VCProjectDefaults
  1. NvCudaDriverApi.rules
  2. NvCudaDriverApi.v4.0.rules
  3. NvCudaRuntimeApi.rules
  4.  
  1.  
  1. NvCudaRuntimeApi.v4.0.rules

2. 如果是自訂的 project, 得先確認 project 有 CUDA Build rules.  可右擊 project, 點選"Custom Build Rules ..."; 對話盒出現 Build Rule Files 後, 點選適當的 rule path
                
        

     

3. 再指定 .cu file 使用 cuda rules..  可對該 cuda file 右擊, 點選 Properties



4. 出現該 cuda file 的 Property Pages 後指定 Tool. 本例中使用 CUDA Runtime API (會因為之前選擇的 CUDA rule file 不同而改變)

Configuration Properties > General > Tool  = "CUDA Runtime API"

5. 設定 Additional Include Directories
Configuration Properties > CUDA Runtime API > General > Additional Include Directories


Reference links
http://forums.nvidia.com/index.php?showtopic=30273http://forums.nvidia.com/index.php?showtopic=167114

最大似然估計 Maximum likelihood - I

學習筆記:ML,max likelihood 最大似然律

看到幾乎要爛的 XD

============================================
大致上來說, 會先用離散的機率說明, 從樣本猜猜主體是誰
如果有黑白棋各兩桶, A桶白子機率 1/5, B桶白子機率 4/5, 
對某桶拿了九子, W W B W W B B W W, 猜最可能是哪一桶? 

第一次遇上這類比喻, 只想把抽樣結果, 統計一下. 但 L(x) 不這樣玩,


L(x=A) = 可能是 A 的機率 = 1/5 * 1/5 * .... = 4^3 / 5^9
L(x=B) = 可能是 B 的機率 = 1/4 * 4/5 * .... = 4^6 / 5^9

可能是 A 的機率比較大, 所以是 A. 

老實說第一次在 wiki 上看到這個範例時,
很疑惑為何不能統計一下樣本呢? 比如白子出現機率是 6/9, 比較接近 4/5 之類的?

原因是,我們沒辦法說樣本的結果就是母體結果,只能從一次次的樣本累積,
判定是 A 還是 B 的可能性較大。

============================================

再繼續進入連續的機率函數 
如果知道身高是高斯分布, 但不知道 mean 和 sigma 
只有樣本, 要怎麼找出 mean 和 sigma 呢?

theta = { mean, sigma)
theta = max L(h; theta)
L(h; theta) = p(h1|theta) p(h2|theta) p(hk|theta)

未知數是 theta 
要找 theta, 能使 Likelihood 最大
而 L = 在 theta 下的連乘

通常轉個方法, 用 log 變成連加, 因為 p < 1, 就算連乘最大也只是小於 1, log P < 0
負的最大, 不如 -logP 最小. 

l = log L

而極值問題, 就可以用微分解決

∂l/∂ mean = 0 => ... 
∂l/∂ sigma = 0 => ...

python:將 list 內部分群

前面如何精簡地找出 list 中特定字的 index.
現實遇上的問題是 :  "一串 list, 自動分群, 同內容為一群"

前述討論串提供了好方法, 將 list 改成 dictionary
http://stackoverflow.com/questions/176918/finding-the-index-of-an-item-given-a-list-containing-it-in-python

a = ['foo','bar','baz','bar','any', 'foo', 'much']
l = dict(zip(set(a), map(lambda y: [i for i,z in enumerate(a) if z is y ], set(a))))
l['foo']
#[0, 5]
l ['much']
#[6]
l
{'baz': [2], 'foo': [0, 5], 'bar': [1, 3], 'any': [4], 'much': [6]}


上述等義先由 set 建立內容單一的集合, 再分群.
(老實說用 pyton, perl 會用太多內建物而失去效率. 建立 set 的過程顯然就分群了)

sub = set(a)
#set(['baz', 'foo', 'bar', 'any', 'much'])
def myset(val, a):
  return [i for i,v in enumerate(a) if v == val]
clusters = [myset(s, a) for s in sub]
# [[2], [0, 5], [1, 3], [4], [6]]

也可以再簡化為
b = [ [i for i,v in enumerate(a) if v is s] for s in sub ]
# [[2], [0, 5], [1, 3], [4], [6]]
跟 map 的結果是一樣的
map(lambda s: [i for i,v in enumerate(a) if v == s], set(a))
# [[2], [0, 5], [1, 3], [4], [6]]

希望有個 dictionary d,
d['baz'] = [2]
d['foo'] = [0,5]
d['bar'] = [1,3]
..

Dictionary 的生成方式, 要不是一個個  key:val, 要不用 zip (keys, val_list)
dict( zip(set(a), clusters) )

dict( zip(set(a), [[i for i,v in enumerate(a) if v == s] for s in set(a)] ) )
之後取用很方便
d['bar']
#[1, 3]










python: is 和 == 的區別

Python 學習筆記

is 是判定 object 相同, 
== 是判定 value 相同


所謂 object 相同,若 a 是某 class,b = a,經過這種只有 copy 外殼的 shadow copy,而非 b 另外配置記憶體,逐 byte copy a 成員的 deep copy,可說 a is b。

簡言之, a = b 只有 shadow copy,內部一樣,所以 a is b 為 True。

# code
class A:
 def f2(x): return x
a = range(100)

a1 = A   
a2 = a1 
print 'id(a1)={}, id(a2)={}'.format(id(a1), id(a2))
print id(a1.a), id(a2.a)
print a1 is a2

# output
id(a1)=34986168, id(a2)=34986168
46065184 46065184
True


而比對字串, value, 使用 is 非常危險. 
除非是同 set 內的 string, 怎知兩個是相等呢? 

a = '123.jpg'
a.split('.')[1] is 'jpg'  # FALSE
a.split('.')[1] == 'jpg' # TRUE

星期六, 2月 28, 2015

python:傳回 list 中符合條件的 index

stackoverflow 有個好問題, 怎麼在 list 用最精簡的方式找出符合條件的 index ?

Finding the index of an item given a list containing it in Python

alist = ["foo", "bar", "baz", "bar"]

**********************************
 list.index() -- list class 之 member function, 但只傳找到第ㄧ各, 
alist.index('bar') 
#1

找不到的話奉上 error, 不見得好啊 
alist.index('haha')
#error ....
要用 try except 處理, 挺麻煩不是嗎


def sublist(e, l):
try:
i = l.index(e)
return i
except ValueError:
return -1

sublist('bar', alist)
#1
sublist('err', alist)
#-1 

自寫
def match(a, alist): return [i for i,v in enumerate(alist) if v == 'bar']
match('bar', alist)
#[1, 3]

更簡化成
a = [ i for i,v in enumerate(alist) if v == 'bar' ]

上述挺簡潔的, 但太依賴 enumerate(), 用更基本的 range 寫呢?
[ i for i in range(len(alist)) if alist[i] == 'bar']
#[1, 3]

用 if .. in 呢? 
其實本題並不要找 list, 這種就夠了    
if 'bar' in alist: alist.index('bar')
#1



星期六, 8月 17, 2013

PCA

學習筆記:PCA降維  

X = { xi | xi is m-dimension vector. i = 1 to n}
reduce to Y
Y = { yi | yi is r-dimension vector. i = 1 to n}

作法:
PCA 降維是將 x 投射到 X 主成分上 - X covariance matrix σ(X) eigenvectors上。
投射到前 r eigenvector,就可將原本 m 維度降低到 r 維度,可大幅減少資料。
eigenvectors { e1, e2, … em } 依照 eigenvalue { λ1, …,λm } 由大到小排列。


假說:
A' = arg. max. σ(y1)  ^  a1' a1 = 1, where y = A'x,  y1 = a1' x. 

可證明得,當 a1   σ(X) first eigenvector e1σ(y1) 有最大值 λ1


說明:
能用最少維度描述資料, 也就是新維度的鑑別率夠大,
也就是轉換後要最大化新維度上的 variance
通常從最大化第一個維度 y1 作起。

y = A'x  x A 每個 column vector 的投影 結果。
我們找能使得 variance y1 最大化之 a1
這裡 A = [a1 .. am]

其實一群資料目測就可找到主成分,
如下圖,顯然將資料投影到 v1 上,變異度會大,鑑別力大。
v1 是可保留之主成分。




而投影到 v2 上,變異度會被壓縮差異不大,可以忽略該項,達成降維。 


證明:
Proof that the A' can maximize σ(y1) is A is the eigenmatrix of X ordered by eigenvalue 
A' = arg. max. σ(y1)  ^  a1' a1 = 1,  where y = A'x. 

let Σ = σ(X)   .... covarince matrix of X

σ(Y) = σ(A'x)
= E[ (A'x - A'x) (A'x - A'x)' ]
= E[ A'xx'A - A'xxA- A'xx'A + A'xx'A ]
= A' E[ (x-x)(x-x)' ]
= A' σ(X) A
[ ai' Σ ai ] ij    .... covarince matrix of Y

let
P is
the eigenmatrix of Σ  and P'P = I
P = [e1 .. em] where the corresponding eigenvalue is λ1, …,λm that λ1 is the largest
Σ P = P Λ  where Λ = diag(λ1, …,λm)
Σ = P Λ P'


σ(y1) = σ(Y)11 
= a1' Σ a= a1' P Λ P'a1
= z' Λ z   ...  by let  z = P'a1
= sum { λ1 zi2 }


since z = P'a1a1 =  Pz
a1'a1 = z' P' P z = z'z = sum { zi2 } 


將上述  σ(y1) 和 a1'a1 代入 max. σ(y1) / a1'a1  




若令 a1 = e1,則 σ(y1) / a1'a1 能得最大值 λ1,為所求。

參考:
[1] 多變量分析。陳順宇。