ç®ç颿°ã®æ¥µå€ïŒæå°ãŸãã¯æå€§ïŒãèŠã€ããããšã¯ãæ°åŠãšãã®å¿çšã«ãããéèŠãªã¿ã¹ã¯ã§ãïŒç¹ã«ãæ©æ¢°åŠç¿ã«ã¯æ²ç·è¿äŒŒã®åé¡ããããŸãïŒã 確ãã«èª°ããææ¥éäžæ³ ïŒMHCïŒãšãã¥ãŒãã³æ³ ïŒMHïŒã«ã€ããŠèããã æ®å¿µãªããããããã®æ¹æ³ã«ã¯å€ãã®éå€§ãªæ¬ ç¹ããããŸããç¹ã«ãææ¥éäžæ³ã¯æé©åã®çµäºæã«éåžžã«é·ãæéåæããå¯èœæ§ãããããã¥ãŒãã³æ³ã§ã¯2次å°é¢æ°ã®èšç®ãå¿
èŠã§ãããå€ãã®èšç®ãå¿
èŠã§ãã
å€ãã®å Žåã«çºçããæ¬ ç¹ãè§£æ¶ããã«ã¯ããµããžã§ã¯ãé åãããã«æ·±ãæãäžããå
¥åããŒã¿ã«å¶éã远å ããå¿
èŠããããŸãã ç¹ã«ãMHCãšMHã¯ä»»æã®æ©èœãåŠçããŸãã çµ±èšããã³æ©æ¢°åŠç¿ã§ã¯ãå€ãã®å Žåãæå°äºä¹æ³ ïŒOLSïŒã«å¯ŸåŠããå¿
èŠããããŸãã ãã®æ¹æ³ã¯ãäºä¹èª€å·®ã®åèšãæå°åããŸãã ç®ç颿°ã¯æ¬¡ã®ããã«è¡šãããŸã
Levenberg-Marquardtã¢ã«ãŽãªãºã ã¯ãéç·åœ¢æå°äºä¹æ³ã§ãã èšäºã«ã¯ä»¥äžãå«ãŸããŸãã
ã³ãŒãã¯ã numpyãmatplotlibãªã©ã®è¿œå ã®ã©ã€ãã©ãªã䜿çšããŸãã ãããããªãå Žåã¯ã Anaconda for Pythonããã€ã³ã¹ããŒã«ããããšã匷ããå§ãããŸãã
äŸåé¢ä¿
Levenberg-Marquardtã¢ã«ãŽãªãºã ã¯ããããŒãã£ãŒãã«ç€ºãããæ¹æ³ã«äŸåããŠããŸã
ãããã£ãŠãæåã«ããããå匷ããå¿
èŠããããŸãã ãããããŸã
å®çŸ©
-ã¿ãŒã²ãã颿°ã æå°åããŸã
ã ãã®å Žåã
æå€±ã®é¢æ°ã§ã
-颿°åŸé
ãã®æç¹ã§ 
-
ã©ãã§
ã¯æ¥µå°å€ãã€ãŸã ãã³ã¯ããè¿æãããå Žå
ãã®ãã㪠%5C%20%5C%20%5C%20F(x%5E*)%5Cle%20F(x))
-ã°ããŒãã«æå°
ãã€ãŸã
é¢ä¿ãããŸãã )
-颿°ã®ã€ã³ãè¡å
ãã®æç¹ã§
ã ã€ãŸã ããã¯ããã¹ãŠã®äžæ¬¡åå°é¢æ°ã®è¡šã§ãã å®éãããã¯æ¬¡ã®åŸé
ã®é¡äŒŒç©ã§ãã
ããã®å Žåã¯ããã®ãããã³ã°ãæ±ã£ãŠãããã
次å
ãã¯ãã«
次å
ã§ãããããåŸé
ã§çºçããããã«ã1次å
ã§1次å°é¢æ°ãèšç®ããããšã¯ã§ããŸããã 詳现
- ããã»è¡å ïŒ2次å°é¢æ°ã®è¡åïŒã äºæ¬¡è¿äŒŒã«å¿
èŠ
æ©èœéžæ
æ°åŠçæé©åã«ã¯ãæ°ããã¡ãœããããã¹ãããã颿°ããããŸãã
ãã®ãããªé¢æ°ã®1ã€ãRosenbrock Functionã§ãã 2ã€ã®å€æ°ã®é¢æ°ã®å Žåãæ¬¡ã®ããã«å®çŸ©ãããŸã
åãå
¥ããŸãã
ã ã€ãŸã 颿°ã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
ééã§ã®é¢æ°ã®åäœãæ€èšããŸã 
ãã®é¢æ°ã¯éè² ã§å®çŸ©ãããæå°å€ãæã¡ãŸã )
ã³ãŒãã§ã¯ã颿°ã«é¢ãããã¹ãŠã®ããŒã¿ã1ã€ã®ã¯ã©ã¹ã«ã«ãã»ã«åããå¿
èŠãªé¢æ°ã®ã¯ã©ã¹ãååŸããæ¹ãç°¡åã§ãã çµæã¯ãæé©åã®éå§ç¹ã«ãã£ãŠç°ãªããŸãã 圌女ãéžã¶
ã ã°ã©ããããããããã«ããã®æç¹ã§é¢æ°ã¯ééã®æå€§å€ãåããŸãã
functions.py
class Rosenbrock: initialPoint = (-2, -2) camera = (41, 75) interval = [(-2, 2), (-2, 2)] """ """ @staticmethod def function(x): return 0.5*(1-x[0])**2 + 0.5*(x[1]-x[0]**2)**2 """ - - r """ @staticmethod def function_array(x): return np.array([1 - x[0] , x[1] - x[0] ** 2]).reshape((2,1)) @staticmethod def gradient(x): return np.array([-(1-x[0]) - (x[1]-x[0]**2)*2*x[0], (x[1] - x[0]**2)]) @staticmethod def hesse(x): return np.array(((1 -2*x[1] + 6*x[0]**2, -2*x[0]), (-2 * x[0], 1))) @staticmethod def jacobi(x): return np.array([ [-1, 0], [-2*x[0], 1]]) """ : http://www.mathworks.com/help/matlab/matlab_prog/vectorization.html """ @staticmethod def getZMeshGrid(X, Y): return 0.5*(1-X)**2 + 0.5*(Y - X**2)**2
ææ¥éäžæ³
ã¡ãœããèªäœã¯éåžžã«ç°¡åã§ãã åãå
¥ãã
ãã€ãŸã ç®ç颿°ã¯äžãããããã®ãšäžèŽããŸãã
èŠã€ããå¿
èŠããã
-颿°ã®ææ¥éäžã®æ¹å
ãã®æç¹ã§
ã
ã§ç·åœ¢è¿äŒŒã§ããŸã
ïŒ
ã©ãã§
ãã¯ãã«éã®è§åºŠã§ã
ã
ã¹ã«ã©ãŒç©ããç¶ã
ããã§ã¯ãæå°åããæ¹æ³
ãããŠãå·®ã倧ããã»ã©
ããè¯ãã ã§
åŒã¯æå€§åãããŸãïŒ
ããã¯ãã«ã®ãã«ã ã¯åžžã«è² ã§ã¯ãããŸããïŒãããã³
ãã¯ãã«ã®å Žåã®ã¿
ãããã£ãŠå察ã«ãªããŸã
ç§ãã¡ã®æ¹åã¯æ£ããããäžæ©èžã¿èŸŒãã§ãã
ããªãã¯ééã£ãéãè¡ãããšãã§ããŸãã äžæ©èžã¿åºãïŒ
çè«çã«ã¯ãã¹ããããå°ããã»ã©è¯ãã§ãã ãããããã®åŸãåæçãäœäžããŸãã æšå¥šå€ 
ã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãããŸããåºæ¬ãªããã£ãã€ã¶ãŒã¯ã©ã¹ã å°æ¥å¿
èŠã«ãªããã¹ãŠã®ãã®ã転éããŸãïŒãã·ã¢ã³ããã³ã€ã³ãè¡åã¯çŸåšå¿
èŠãããŸããããä»ã®æ¹æ³ã«ã¯å¿
èŠã§ãïŒ
class Optimizer: def __init__(self, function, initialPoint, gradient=None, jacobi=None, hesse=None, interval=None, epsilon=1e-7, function_array=None, metaclass=ABCMeta): self.function_array = function_array self.epsilon = epsilon self.interval = interval self.function = function self.gradient = gradient self.hesse = hesse self.jacobi = jacobi self.name = self.__class__.__name__.replace('Optimizer', '') self.x = initialPoint self.y = self.function(initialPoint) " " @abstractmethod def next_point(self): pass """ """ def move_next(self, nextX): nextY = self.function(nextX) self.y = nextY self.x = nextX return self.x, self.y
ãªããã£ãã€ã¶ãŒèªäœã®ã³ãŒãïŒ
class SteepestDescentOptimizer(Optimizer): ... def next_point(self): nextX = self.x - self.learningRate * self.gradient(self.x) return self.move_next(nextX)
æé©åçµæïŒ
å埩 | X | Y | Z |
---|
25 | 0.383 | -0.409 | 0.334 |
75 | 0.693 | 0.32 | 0.058 |
532 | 0.996 | 0.990 | 
|
é©ãã¹ãããšã§ããæé©åã¯0ã25åã®å埩ã§ã©ãã ãéãé²è¡ãããã§ã«25ã75åã¯é
ããæåŸã«ã¯ãŒãã«è¿ã¥ãã«ã¯457åã®å埩ãå¿
èŠã§ããã ãã®åäœã¯MHFã®éåžžã«ç¹åŸŽçãªãã®ã§ããæåã¯éåžžã«è¯å¥œãªåæçã§ãæåŸã¯äžååã§ãã
ãã¥ãŒãã³æ³
ãã¥ãŒãã³æ³èªäœã¯ãæ¹çšåŒã®æ ¹ãã€ãŸã ãã®ãããª
ãã
ã ããã¯ãŸãã«ç§ãã¡ãå¿
èŠãšãããã®ã§ã¯ãããŸããããªããªã 颿°ã«ã¯æ¥µå€ãããå ŽåããããŸãããå¿
ããããŒãã§ã¯ãããŸããã
ãããŠãæé©åã®ããã®ãã¥ãŒãã³æ³ããããŸãã æé©åã®ã³ã³ããã¹ãã§äººã
ãMNã«ã€ããŠè©±ããšããããã¯ãããæå³ããŸãã ç§èªèº«ãç ç©¶æã§å匷ããŠããéããããã®æ¹æ³ãæããã§æ··ä¹±ãããããã¥ãŒãã³æ³ã«ã¯æ¬ ç¹ããããŸã-äºæ¬¡å°é¢æ°ãèæ
®ããå¿
èŠãããããšããå¥ãçè§£ã§ããŸããã§ããã
èæ
®ãã %3A%20R%20%5Cto%20R)
åãå
¥ãã
ãã€ãŸã ç®ç颿°ã¯äžãããããã®ãšäžèŽããŸãã
åè§£å¯èœ
ãã€ã©ãŒçŽæ°ã§ã¯ãMHFãšã¯ç°ãªãã2次è¿äŒŒãå¿
èŠã§ãã
ããã瀺ãã®ã¯ç°¡åã§ã
ã颿°ã¯æ¥µå€ãæã€ããšãã§ããŸãã
ã ãã€ã³ã
å®çœ®ãšåŒã°ããã
ç§ãã¡ã¯ãã«é¢ããŠäž¡åŽãåºå¥ããŸã
ã ç§ãã¡ã®ç®æšã¯
ããããã£ãŠãæ¹çšåŒãè§£ããŸãã
-ããã¯æ¥µå€ã®æ¹åã§ãããæå€§å€ãšæå°å€ã®äž¡æ¹ã«ããããšãã§ããŸãã ãã€ã³ãããããã©ããã確èªããã«ã¯
æå°-äºæ¬¡å°é¢æ°ãåæããå¿
èŠããããŸãã ãã
極å°å€ã®å Žå
-æå€§ã
倿¬¡å
ã®å Žåã1次å°é¢æ°ã¯åŸé
ã«ã2次å°é¢æ°ã¯ããã»è¡åã«çœ®ãæããããŸãã è¡åãåå²ããããšã¯ã§ããŸããã代ããã«ãéæ°ãæããŸãïŒå¯ææ§ããªããããåŽé¢ã芳å¯ããŸãïŒã
1次å
ã®å Žåãšåæ§ã«ãæ£ãããã©ããã確èªããå¿
èŠããããŸããïŒ ããã»è¡åãæ£å®å€ã®å Žåãæ¹åã¯æ£ããã§ããããã§ãªãå Žåã¯ãMHCã䜿çšããŸãã
ã³ãŒãå
ïŒ
def is_pos_def(x): return np.all(np.linalg.eigvals(x) > 0) class NewtonOptimizer(Optimizer): def next_point(self): hesse = self.hesse(self.x)
çµæïŒ
å埩 | X | Y | Z |
---|
25 | -1.49 | 0.63 | 4.36 |
75 | 0.31 | -0.04 | 0.244 |
179 | 0.995 | -0.991 | 
|
MHCãšæ¯èŒããŠãã ããã 25åã®å埩ãŸã§éåžžã«åŒ·ãäžéããããŸããïŒã»ãŒå±±ããèœã¡ãŸããïŒãããã®åŸåæã¯å€§å¹
ã«é
ããªããŸããã ãããœã¿å·ã§ã¯ãéã«ãæåã¯ãã£ãããšå±±ãäžã£ãŠãããŸããããã®åŸã¯éãåããŸãã MNSã¯ã25ãã532åã®ç¹°ãè¿ãã§ãŒãã«éããŸããã
ã MNæé©å
æåŸã®154åã®ç¹°ãè¿ãã
ããã¯äžè¬çãªåäœã§ããããŒã«ã«æ¥µå€ã«è¿ããã€ã³ãããéå§ããå ŽåãMNã¯2次åæçãæã¡ãŸãã MHCã¯æ¥µç«¯ããã¯ã»ã©é ãã§ãã
MNã¯ãäžã®å³ã§èŠãããæ²çã®æ
å ±ã䜿çšããŸãïŒäžããã®æ»ãããªéäžïŒã
ãã®ã¢ã€ãã¢ã瀺ãå¥ã®äŸïŒäžã®å³ã§ã¯ãèµ€ããã¯ãã«ã¯MNSã®æ¹åã§ãããç·ã¯MNã§ã
[éç·åœ¢vsç·åœ¢]æå°äºä¹æ³
MNCã«ã¯ãã¢ãã«ããããŸã
æã£ãŠãã
æå°åããããã«æ§æããããã©ã¡ãŒã¿ãŒ
ã©ãã§
-
芳å¯ã
ç·åœ¢æå°äºä¹æ³ã§ã¯ã$ m $æ¹çšåŒãããããããããç·åœ¢æ¹çšåŒãšããŠè¡šãããšãã§ããŸã
ç·åœ¢æå°äºä¹æ³ã®ãœãªã¥ãŒã·ã§ã³ã¯äžæã§ãã è¡åæ¹çšåŒã®1ã€ã®è¿äŒŒè§£ã§ç·åœ¢OLSã®è§£ãèŠã€ããããšãã§ããQRåè§£ ã SVDåè§£ãªã©ã®åŒ·åãªæ¹æ³ããããŸãã
ã
éç·åœ¢æå°äºä¹ãã©ã¡ãŒã¿ãŒ
ããšãã°ãããèªäœã颿°ã§è¡šãããå ŽåããããŸã
ã ãŸãããã©ã¡ãŒã¿ã®ç©ããããããããŸãããäŸãã°
ãªã©
ããã§ã¯ã解決çãç¹°ãè¿ãèŠã€ããå¿
èŠãããã解決çã¯éå§ç¹ã®éžæã«äŸåããŸãã
以äžã®æ¹æ³ã¯ãéç·åœ¢ã®å Žåãæ±ããŸãã ããããæåã«ãã¿ã¹ã¯ã®ã³ã³ããã¹ãã§éã·ã§ãã£ã³ã°æå°äºä¹æ³ãèŠãŠã¿ãŸããã-颿°ãæå°å
äœã«ã䌌ãŠããŸãããïŒ ããã¯OLSã®åãªã圢åŒã§ãïŒ ãã¯ãã«é¢æ°ãå°å
¥ããŸã 
ãããŠç§ãã¡ã¯éžæããŸã
é£ç«æ¹çšåŒãè§£ãããã«ïŒå°ãªããšããããïŒïŒ
次ã«ã枬å®å€ãå¿
èŠã§ããã€ãŸããè¿äŒŒå€ã¯ã©ãã»ã©è¯ãã®ã§ããããã ããã«ãããŸãïŒ
éæŒç®ãé©çšããŸããïŒãã¯ãã«é¢æ°ã埮調æŽããŸãã
ã¿ãŒã²ããã®äž
ã ããããããã¯å¯èœã§ããããã®éãåæ§ã§ãããã¯ãã«é¢æ°ãäžããããå Žå
建ç©
ïŒ5ïŒããã äŸïŒ
æåŸã«ãéåžžã«éèŠãªç¬éã æ¡ä»¶ãæºããå¿
èŠããããŸã
ãã以å€ã®å Žåã¯ãã¡ãœããã䜿çšã§ããŸããã ç§ãã¡ã®å Žåãæ¡ä»¶ã¯æºããããŠããŸã
ã¬ãŠã¹ã»ãã¥ãŒãã³æ³
ãã®æ¹æ³ã¯åãç·åœ¢è¿äŒŒã«åºã¥ããŠããŸãããçŸåšã¯2ã€ã®é¢æ°ãæ±ã£ãŠããŸãã
次ã«ããã¥ãŒãã³æ³ãšåãããšãè¡ããŸã-æ¹çšåŒãè§£ããŸãïŒ
ïŒïŒ
è¿ãããšã瀺ãã®ã¯ç°¡åã§ã
ïŒ
ãªããã£ãã€ã¶ãŒã³ãŒãïŒ
class NewtonGaussOptimizer(Optimizer): def next_point(self):
çµæã¯ç§ã®æåŸ
ãè¶
ããŸããã ããã3åã®ç¹°ãè¿ãã§ã
ã è»éã瀺ãããã«ã åŠç¿çã0.2ã«æžãããŸãã
ã¬ãŒãã³ããŒã°ã»ãã«ã«ãŒãã¢ã«ãŽãªãºã
ããã¯ãGauss-Newton Methodã®ããããã®ããŒãžã§ã³ïŒã æžè¡°ããŒãžã§ã³ ãïŒã«åºã¥ããŠããŸãã
èŠå¶ãã©ã¡ãŒã¿ãšåŒã°ããŸã ã æã
ã«çœ®ãæããããŸãã
åæãæ¹åããŸãã
察è§èŠçŽ
ããžãã£ãã«ãªããã èŠçŽ
è¡å
è¡ãã¯ãã«ã®ã¹ã«ã©ãŒç©ã§ã
ã§
èªåã§ã
å€§èŠæš¡
ããã¯å°ããªãã®ã®ããã®æãæ¥ãªéäžã®æ¹æ³-ãã¥ãŒãã³æ³ã倿ããŸããã
æé©åããã»ã¹ã®ã¢ã«ãŽãªãºã èªäœãç®çã®ãã®ãéžæããŸã
次ã®ããã«å®çŸ©ãããã²ã€ã³æ¯ã«åºã¥ããŸãã
ãã
ãããã
-ã®è¯ãè¿äŒŒ
ããã§ãªããã°ãå¢ããå¿
èŠããããŸã
ã
åæå€
ãšããŠäžããããŸã
ã©ãã§
-è¡åèŠçŽ
ã
ã«æšå¥š
ã åæ¢åºæºã¯ãã°ããŒãã«ãªæå°å€ãéæããããšã§ãã %3Dg(x%5E*)%3D0)
ãªããã£ãã€ã¶ãŒã§ã¯ãåæ¢åºæºãå®è£
ããŸããã§ãã-ãŠãŒã¶ãŒããããæ
åœããŸãã æ¬¡ã®ãã€ã³ãã«ç§»åããã ãã§ããã
class LevenbergMarquardtOptimizer(Optimizer): def __init__(self, function, initialPoint, gradient=None, jacobi=None, hessian=None, interval=None, function_array=None, learningRate=1): self.learningRate = learningRate functionNew = lambda x: np.array([function(x)]) super().__init__(functionNew, initialPoint, gradient, jacobi, hessian, interval, function_array=function_array) self.v = 2 self.alpha = 1e-3 self.m = self.alpha * np.max(self.getA(jacobi(initialPoint))) def getA(self, jacobi): return np.dot(jacobi.T, jacobi) def getF(self, d): function = self.function_array(d) return 0.5 * np.dot(function.T, function) def next_point(self): if self.y==0:
çµæãè¯å¥œã§ãã
å埩 | X | Y | Z |
---|
0 | -2 | -2 | 22.5 |
4 | 0.999 | 0.998 | 
|
11 | 1 | 1 | 0 |
learningrate = 0.2ã®å ŽåïŒ
ã¡ãœããæ¯èŒ
ã¡ãœããå | 察象æ©èœ | é·æ | çæ | åæ |
---|
ææ¥éäžæ³ | 埮åå¯èœ | -å¹
åºãã¢ããªã±ãŒã·ã§ã³ ç°¡åãªå®è£
-1åã®å埩ã§äœã³ã¹ã
| -ã°ããŒãã«æå°å€ã¯ä»ã®æ¹æ³ãããæªãèŠãã
-極å€è¿ãã®äœãåæç
| ããŒã«ã« |
ãã¥ãŒãã³ã®æ¹æ³ | äºåºŠåŸ®åå¯èœ | -極å€ä»è¿ã®é«ãåæç
-æ²çæ
å ±ã䜿çšããŸã
| -颿°ã¯2å埮åå¯èœã§ãªããã°ãªããŸãã
-ããã»è¡åãçž®éããŠããå ŽåïŒéè¡åããªãå ŽåïŒããšã©ãŒãè¿ããŸã
-ãããæ¥µç«¯ããããé¢ããŠããå Žåãééã£ãŠããŸãå¯èœæ§ããããŸã
| ããŒã«ã« |
ã¬ãŠã¹ã»ãã¥ãŒãã³æ³ | éç·åœ¢æå°äºä¹ | -éåžžã«é«ãåæç
-ã«ãŒããã£ããã£ã³ã°ã¿ã¹ã¯ãšããŸãæ©èœããŸã
| -è¡åJã®åã¯ç·åœ¢ç¬ç«ã§ãªããã°ãªããªã
-ç®ç颿°ã®ã¿ã€ãã«å¶éã課ã
| ããŒã«ã« |
ã¬ãŒãã³ããŒã°ã»ãã«ã«ãŒãã¢ã«ãŽãªãºã | éç·åœ¢æå°äºä¹ | -èæ
®ãããæ¹æ³ã®äžã§èµ€ã¡ããã®å®å®æ§
-ã°ããŒãã«ãªæ¥µå€ãèŠã€ããæå€§ã®ãã£ã³ã¹
-éåžžã«é«ãåæçïŒé©å¿ïŒ
-ã«ãŒããã£ããã£ã³ã°ã¿ã¹ã¯ãšããŸãæ©èœããŸã
| -è¡åJã®åã¯ç·åœ¢ç¬ç«ã§ãªããã°ãªããªã
-ç®ç颿°ã®ã¿ã€ãã«å¶éã課ã
-å®è£
ã®è€éã
| ããŒã«ã« |
ç¹å®ã®äŸã§ã¯è¯å¥œãªçµæãåŸãããŠããŸãããæ€èšããæ¹æ³ã§ã¯ã°ããŒãã«åæãä¿èšŒããŠããŸããïŒããã¯èŠã€ããã®ãéåžžã«é£ããã¿ã¹ã¯ã§ãïŒã ããã«ããããããããããéæã§ããå°æ°ã®æ¹æ³ã®äŸã¯ã æµåãããã³ã°ã¢ã«ãŽãªãºã ã§ãã
çµåãããçµæïŒç¹ã«æåŸã®2ã€ã®æ¹æ³ã®é床ãäœäžããŸããïŒïŒ
ãœãŒã¹ ã¯githubããããŠã³ããŒãã§ããŸã
ãœãŒã¹
- K.ããã»ã³ãHBããŒã«ã»ã³ãOããã£ã³ã¬ãïŒ2004ïŒïŒ éç·åœ¢æå°äºä¹æ³
- Florent BrunetïŒ2011ïŒïŒ ç¶ç¶çæé©åã®åºç€
- æå°äºä¹åé¡