最終,我想要刪除下面代碼中的所有顯式循環,以便利用C中的numpy向量化和函數調用而不是python。Numpy:如何矢量化應用於數據集的函數的函數形式的參數
下面是在python中使用numpy的簡化。 我有以下的二次函數:
def quadratic_func(a,b,c,x):
return a*x*x + b*x + c
我試圖優化的選擇,B,C具有相同的尺寸的給定輸入數據x和輸出數據y(當然,這應該通過線性迴歸來完成......但幽默我)。說len(x)= 100。易於使用標量a,b,c進行矢量化,以獲得長度爲100的結果。
假設我們知道a,b,c應該位於[-10,10]之內,並且通過構建網格並用最小平方誤差選取點。
a=np.arange(-10.0, 10.01, 2.0)
nodes=np.array(np.meshgrid(a,a,a)).T.reshape(-1,3) #3-d cartesian product with array of nodes
對於每個1331節點,我想計算長度爲100的所有1331個返回值。
res=[]
x=np.random.uniform(-5.0,5.0, 100)
for node in nodes:
res.append(quadratic_func(*node, x=x))
我怎麼能採取廣播的優勢,從而爲每一個得到我的1331項清單與100倍的值是調用quadratic_func x的結果嗎?答案必須使用矢量化,廣播等,以獲得我期待的數量級的速度改進。此外,答案必須使用調用quadratic_func - 或更一般地,my_func(* node,x = x)。
在現實生活中,我正在優化一個非線性函數,它甚至不是凸的,並且有許多局部最小值。如果我能夠達到「正確的」本地最低限度,這是一個很好的功能表單 - 我已經知道如何做到這一點,但希望更快到達那裏!使用和np.einsum
的broadcasting
組合
我看到你在做什麼,但尋找的東西不是更寬泛那 - 我不想知道這個函數是先驗的。我希望能夠將目標函數傳遞給我的優化器,並且我不能認爲函數形式是多項式,sqrt,日誌等的組合。您可以使用調用quadratic_func? – FinanceGuyThatCantCode
@FinanceGuyThatCantCode是的,這是NumPy矢量化的事情,沒有一種方法可以使用任何通用的func並加速它。如果使用某些無法轉換爲NumPy funcs或ufuncs的特定功能,則可以查看cython或numba。 – Divakar
我想這就是爲什麼我無法弄清楚自己!雖然......會是一個很好的功能......並且想到我可以問今天在我辦公室的Continuum傢伙! – FinanceGuyThatCantCode