用pytorch做簡單的最優化問題

2021-09-19 16:02:31 字數 1757 閱讀 9781

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

i​z+

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...