2017-09-15 133 views
0

我試圖實現高斯分佈的矢量化實現,而不使用任何numpy函數。正態分佈的Vectorised實現

只是想明確我想在沒有forloop的情況下達到與以下相同的結果。

import numpy as np 
import matplotlib.pyplot as plt 
import math 

x = np.linspace(-1, 1, 100) 
y = np.linspace(-1, 1, 100) 

for i in range(0, len(x)): 
    y[i] = normpdf(y[i], 0, .1) 

plt.plot(x, y) 
plt.show() 

def normpdf(x, mean, sd): 
    var = float(sd)**2 
    denom = (2*math.pi*var)**.5 
    num = math.exp(-(float(x)-float(mean))**2/(2*var)) 
    return num/denom 
+0

您可以更改您的代碼,以便在for循環中調用normpdf之前進行定義嗎? –

+0

你有什麼理由想要這樣做,而不使用任何numpy功能?您已經在使用'np.linspace',並且您已經說過您需要一個矢量化解決方案,通常意味着利用numpy數組方法。你是否知道['scipy.stats.norm.pdf'](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html)? –

+0

這就是iv'e在我的筆記本中定義它的方式,仍然不能實現矢量化。@ ali_m沒有任何功能原因,它是矢量化ML算法的練習的一部分。 –

回答

1

不同於math.expnp.exp可以在陣列操作(逐點)直接。所以用下面的代碼替換normpdf:

def normpdf(x, mean, sd): 
    var = float(sd)**2 
    denom = (2*math.pi*var)**.5 
    num = np.exp(-(x - mean)**2/(2*var)) 
    return num/denom 

你可以直接在x上調用normpdf而不用循環。

我真的不明白你想從numpy矢量化中獲益而不使用numpy函數。

+0

給我這個錯誤:TypeError:只有長度爲1的數組可以轉換爲Python標量 –

+0

@CharlesLucienFried我刪除了不必要的float(),現在它可以工作。 –

+0

啊,非常感謝! –