pytorch的自動求導很好用,可以利用它對一些求導困難的問題做一些最優化問題,比如昨天狗菜提了乙個問題:
求乙個三維點的位置,使得它到乙個直線族(三維)的距離之和最小實際上就是求如下最優化問題
m in
∑i∣a
ix+b
iy+c
iz+d
i∣ai
2+bi
2+ci
2+ci
2min\sum_i \frac}
mini∑
ai2
+bi2
+ci
2+c
i2
∣ai
x+bi
y+c
iz+
di∣
這個含絕對值的求導不太好做,如果交給pytorch的話就比較容易了,構造乙個簡單的例子,即過(1,1,1)的三條直線,顯然,最優解就是(1,1,1):
from torch.autograd import variable
import torch
#ax+by+cz+(-a-b-c)=0
tmp1 = torch.rand(3)
a1,b1,c1 = tmp1
d1 = -sum(tmp1)
tmp1 = torch.rand(3)
a2,b2,c2 = tmp1
d2 = -sum(tmp1)
tmp1 = torch.rand(3)
a3,b3,c3 = tmp1
d3 = -sum(tmp1)
x = torch.rand(1)
y = torch.rand(1)
z = torch.rand(1)
x = variable(x,requires_grad=true)
y = variable(y,requires_grad=true)
z = variable(z,requires_grad=true)
lr = 0.0001
for i in range(20000):
l1 = abs(a1*x+b1*y+c1*z+d1)/torch.sqrt(a1**2+b1**2+c1**2+d1**2)
l2 = abs(a2*x+b2*y+c2*z+d2)/torch.sqrt(a2**2+b2**2+c2**2+d2**2)
l3 = abs(a3*x+b3*y+c3*z+d3)/torch.sqrt(a3**2+b3**2+c3**2+d3**2)
loss = l1 + l2 + l3
loss.backward()
x.data = x.data - lr*x.grad.data
y.data = y.data - lr*y.grad.data
z.data = z.data - lr*z.grad.data
x.grad.data.zero_()
y.grad.data.zero_()#重要
z.grad.data.zero_()
x,y,z
最後的結果是:
(tensor([1.0004], requires_grad=true),
tensor([0.9996], requires_grad=true),
tensor([0.9999], requires_grad=true))
同樣的框架可以用來做很多簡單的最優化問題 用keep alive做網路優化
keep alive是vue提供的乙個抽象元件,用來對元件進行快取,從而節省效能,由於是乙個抽象元件,所以在v頁面渲染完畢後不會被渲染成乙個dom元素 例如我們有首頁和城市列表頁面兩個頁面,在沒有加keep alive之前兩個頁面每次顯示都會傳送ajax請求,這樣的話頁面效能特別不好。頁面的邏輯應該...
《用Python學習數值分析 最優化》
2017 09 13 最優化對應的術語是 optimization 是工科的基礎課程。數值分析與最優化是高度相關的,都大概在四年級或者研一時教授。最優化課程更加基礎一些,覆蓋了理論基礎,想要把課程裡的演算法實現出來,需要深入的線性代數 矩陣計算 數值計算的知識。最優化就是機器學習的核心,在圖形學方向...
用C 做的簡單工廠模式
簡單工廠模式 1 uml設計圖 簡單工廠模式 2 核心實現 簡單工廠模式 工廠 class factory 車險類 class cardamage detailofinsurance 司機險 class driverhurt detailofinsurance 介面 inte ce detailof...