ãã®èšäºã¯BASE Advent Calendar 2019ã®20æ¥ç®ã®èšäºã§ãã devblog.thebase.in DataStrategyã®å²¡ãæ
åœããŸãã Prophet is äœïŒ Prophetã¯Facebookç€Ÿè£œã®æç³»åäºæž¬ã©ã€ãã©ãªã§ããRãšPythonããå©çšã§ãäžèšgitã§å
¬éãããŠããŸãã https://github.com/facebook/prophet åæè
仲éã®éã§ãæç³»åäºæž¬ãªããŸãããã䜿ã£ãšãããšèšããããããé«ç²ŸåºŠãããã®ã§ãããç§èªèº«ãã€ãã€ãçè«ãææ¡ããŠãªã & ã°ã°ã£ãŠãããã£ãšããè§£èª¬ã®æ¥æ¬èªããã¥ã¡ã³ããããªãå°è±¡ã§ãã Prophetã®å
ãšãªãè«æã¯äžèšã«ãŠå
¬éãããŠããŸãã https://peerj.com/preprints/3190.pdf åé ã ãèªããšãæç³»ååæã®ç¥èŠã®ãªã人ã§ããã¡ã€ã³ç¥èãçµã¿èŸŒã¿ãªããäºæž¬ãã§ãããããªããŒã«ãç®æããŠéçºãããããã§ããè«æã¿ã€ãã«ããForecasting at Scaleããšãªã£ãŠããŠãScaleããšããã®ã¯ããã§ã¯ã誰ã§ã䜿ãããã¹ã±ãŒã«ããããäºæž¬ããŒã«ãã¿ãããªæå³ã§äœ¿ãããŠããŸãã è«æã«æžãããŠããProphetã®ã¢ãã«åŒããã£ããçè§£ã§ããããã«äžå¯§ã«ãªãã£ãŠãããããšããã®ããã®èšäºã®è¶£æšã§ãã ã¢ãã«åŒã®æŠèŠ æç³»åããŒã¿ã¯ããã¬ã³ã + å£ç¯èŠå + ãã€ãº ãªã©ã®è€æ°ã®èŠçŽ ããæãç«ã£ãŠããŠããããã®èŠçŽ ã«åè§£ããããšã§çè«å€ã®äºæž¬ãã§ããããšããèãæ¹ããããŸãã Prophetã§ã¯ãæç³»åã¯äžèšã®ãããªæ§æèŠçŽ ããã€ãšæããŠããŸãã ããã«ãæç³»åã¯ãããã®èŠçŽ ã®åãšæãäžèšã®ãããªã¢ãã«åŒãçµã¿ç«ãŠãŠããŸãã ãã®ã¢ãã«åŒãçè§£ããããã誀差é
以å€ã®3èŠçŽ ãäžã€ãã€èŠãŠãããŸãã 1. : ãã¬ã³ã颿° ãŸã ã§ãã ããžã¹ãã£ãã¯éç·åœ¢ãã¬ã³ã ç·åœ¢ãã¬ã³ã ã®2çš®é¡ããããŸãã1ã®ã»ãããèªã¿è§£ããŠã¿ãŸãã 1-1. ããžã¹ãã£ãã¯éç·åœ¢ãã¬ã³ã ããåçŽåãããšäžèšã®ããã«è¡šãããŸãã ããã¯ããžã¹ãã£ãã¯æ²ç·ãããŒã¹ã«äœãããŠãããããªã®ã§æ¯ã¹ãŠã¿ãŸãã Prophetã®ãã¬ã³ã颿°(1)åŒãšæ¯ã¹ããšã ãšãªã ã®äžèº«ãã·ã³ãã«ã«ãªã£ãŠããŸãã ãã®é¢æ°ã®åããææ¡ããããã ãåãããšã ãã©ã®ããã«ãªããå³ç€ºããŠã¿ãŸãã ã®ãšã ã®ãšã ãšãªãåºå ã®äžéãšäžéãæ±ºãŸã£ãŠããŸãããã®åºæ¬ãšãªãåŒ(2)ã«äžã€ã〠ã®3èŠçŽ ãç¶ãè¶³ããŠãã¬ã³ã颿°ã®åœ¢ã«è¿ã¥ããŠãããŸãã çç©ã®åäœæ°ãããã°ã©ã ã®ãã°çºèŠæ°ãªã©ãåãã¯å°ãªã â éäžã¯å€ããªã â ãã®åŸãŸãå°ãªããªã ãšããæµããæã€çŸè±¡ã¯ããžã¹ãã£ãã¯æ²ç·ã§èª¬æãããããšããããŸãã çç©ã®åäœæ°ãªã©ã«ã¯äœãããäžéæ°ããããšèãããããã¬ã³ã颿°ã§ã¯ ãã€ããããšã§ãã®äžéãèšå®ããŠããŸãã ãã¬ã³ã颿°ã«ãªãã£ãŠãããžã¹ãã£ãã¯é¢æ°ïŒåŒ(2)ïŒã®ååã ã«å€ããŠã¿ãŸãã ãã® ã®å€ã1, 2, 3,...ãšå€åããããšå
ã»ã©ã®æ²ç·ã¯äžå³ã®ããã«å€åããŸãã ã®maxå€ã ã®å€ã«çãããªããããã§äžéãèšå®ã§ããããã«ãªããŸããã ç¶ã㊠ãå ããŠã¿ãŸãããã ãåºå®ããç¶æ
ã§ã ã®å€ã-1, 0.5, 1,...ãšå€åããããšæ²ç·ã¯äžå³ã®ããã«å€åããŸãã ã倧ããã»ã©æ²ç·ãæ¥ã«ãªããå°ããã»ã©ç·©ããã«ãªãã®ãèŠãŠåããŸãã ã®æã¯ãã¯ãæžå°é¢æ°ãšãªãã ã¯ãåŸããã®ãããªãã®ã ãšè§£éã§ããŸãã çç©ã®åäœæ°ã§ãããªããæé·ã¹ããŒãã®æ©ã矀ã¯ããæ©ãäžéã«éããæé·ã®é
ã矀ã¯äžéã«éããã®ãé
ãããšãã£ãç¥èŠããã©ã¡ã¿ ã§è¡šçŸã§ããŸãã ç¶ããŠã ã远å ããŠãããŸãã ããã§åé ã®ãã¬ã³ã颿°ïŒåŒ(1)ïŒãšåæ§ã®åŒã«ãªããŸããïŒ ãšèªã¿æ¿ããŠã¿ãŠãã ããïŒãããã ãå€åãããªããæ²ç·ã®åããèŠãŠã¿ãŸãããã 㯠ã®å€ããã€ã¬ã¯ãã«æžç®ããåŒã«ãªã£ãŠããã®ã§åã«æ²ç·ãå·Šå³ã«åãã ãã§ãããèšãæãããšåã ã§ã ã®å€ãäžäžãããåããæã£ãŠããŸããç·åœ¢ååž°ã§ãããšããã®åçã®ãããªãã®ãšã€ã¡ãŒãžããŠäžããã 以äžã§äžèšã®åŒã®èª¬æã¯çµããã§ãã ãã ãããã¯ãããŸã§ãã¬ã³ã颿°ãåçŽåããåŒã§ãã è«æã§ã¯ããã«ã ã ãäžå®ã§ã¯ãªãæéã«ãã£ãŠå€åãããã®ãšæãã ãšå±éããŠããŸãã ã¯å æç¹ã§ç°ãªãäžéãèšå®ã§ããããã«ãªã£ãããšããã ãã®è©±ãªã®ã§èª¬æã¯ãããããã«çãã ã®ã»ãããã£ããèŠãŠãããŸãã ã¯è»¢ææã®ãããªãã®ãè¿ããå Žåããªãç°ãªã£ãã¬ãŒãã«å€åããã¯ãããšãããã¥ã¢ã³ã¹ãæ°åŒã§è¡šçŸããããšããŸããä»®ã«ãã®ãããªè»¢æç¹ãSåãã£ããšããŠããã®ãšãã® æç¹ã ãšè¡šããŸãããŸãããã® ã«ãããæé·çã調ç¯ãã倿ŽçãšããŠã ãå®çŸ©ããŸãã ã«å¯Ÿå¿ããŠSååããã®ã§ ãšãããã¯ãã«ïŒæ
£äŸã«ãªãã£ãŠãã¯ãã«ã¯å€ªåã§è¡šèšïŒãå®çŸ©ããŠãããŸãã ããæé ã«ãããæé·çã¯åºæ¬ã¬ãŒã ãš æç¹ãŸã§ã«åºçŸãã倿Žç ã®ç·åãšããŠäžèšã®åŒã§è¡šãããŸãã è«æã§ã¯ããã« ã®éšåãæ±ãããããã¯ãã«ã§è¡šèšããããã ãšããSååã®0ãŸãã¯1ã®èŠçŽ ããæããã¯ãã«ãçšæãããã®åèŠçŽ ã ãšå®çŸ©ããŠããŸããäŸãã°å
šéšã§10æç¹ã® ããã£ãŠããã®ãã¡3åã®å€æŽç¹ ã3,5,7çªç®ã«èµ·ãããšãããš ã®å
èš³ã¯äžèšã®ããã«ãªããŸãã çµå± ã¯å倿Žç¹ ãè¿ããããšã«ã²ãšã€ãã€å€æŽç¹ã®ãã©ã°ãç«ã€ã ãã®ãã¯ãã«ãšèšããŸãããããšå
ã»ã©å®çŸ©ãã倿Žç ã®ãã¯ãã«ã ãçµã¿åããããšåŒ(3)ã¯ã ãšå€åœ¢ã§ãããäžå®ã§ã¯ãªãæéã«ãã£ãŠå€åããæé·çãã衚çŸããããšãã§ããŸããã ãããŸã§ã®åŒããã¬ã³ã颿°ã«åæ ããŠã¿ãŸãããã ããã§t軞ã®è»¢æç¹ããšã«æ²ç·ã®åŸãã ã¶ãå€åããŠããã°è¯ãããã§ãããå®ã¯ãã®ãŸãŸã ãšæ²ç·ã®å€åããªã ããã«ãªããŸããã ãã®æé·çã®å€åã«ãã£ãŠã©ã®ãããªæ²ç·ãæããããå¯èŠåããŠã¿ãŸãããã import numpy as np from matplotlib import pyplot as plt T = np.linspace(- 6 , 6 , 100 ) S = np.array([- 3 , 1 , 3 ]) # -3, 1, 3ã®æç¹ã§æé·çã«å€åãèµ·ãã delta = np.array([ 0.1 , 0.3 , - 0.6 ]) # åSæç¹ã§ã®æé·çã®å€æŽç def logistic_trend (T, S, delta, k= 1 , C= 1 , m= 0 ): a = np.vstack([np.where(S < t, 1 , 0 ) for t in T]) y = C / ( 1 + np.exp(-(k + (a * delta).sum(axis= 1 )) * (T - m))) return y out = logistic_trend(T, S, delta, k= 0.1 , m= 0 ) plt.plot(T, out) plt.xlabel( "t" , fontsize= 16 ) plt.ylabel( "y" , fontsize= 16 ) # plot change point ymax = out.max() ymin = out.min() plt.vlines( S, ymin=ymin, ymax=ymax, linestyle= 'dashed' , color= 'gray' , label= 'change point' ) plt.legend() plt.show() å€åç¹ããšã«æ²ç·ãåããŠããŸã£ãŠãŸãã ããã»ã© ã¯ãåŸããã®ãããªãã®ã§ã ã¯ãåçãã®ãããªãã®ã ãšèª¬æããŸããã ã®ãããªã·ã³ãã«ãªäžæ¬¡é¢æ°ãšåãããã«èããŠæ¬²ããã®ã§ãããåŸãaã¯ã ã®ããã«xã®é åã«ãã£ãŠå€åãåçbã¯äžå®ã§0ãšããŠå¯èŠåãããšãããã»ã©ãšåãããã«éåããçŽç·ã«ãªã£ãŠããŸããŸãã T1 = np.linspace(- 6 , - 2 , 30 ) T2 = np.linspace(- 2 , 6 , 70 ) def sample_linear (T, a= 1 ): y = a * T return y out1 = sample_linear(T1, a= 1 ) out2 = sample_linear(T2, a=- 1 ) plt.plot( np.hstack([T1, T2]), np.hstack([out1, out2]), ) plt.xlabel( "t" , fontsize= 16 ) plt.ylabel( "y" , fontsize= 16 ) plt.show() ãã®å Žåã¯åçbã調ç¯ããããšã§é£ç¶ããçŽç·ãåŸãããŸããã話ããã¬ã³ã颿°ã«æ»ããŠèãããšãªãã»ããé
mã調æŽããã°é£ç¶ããæ²ç·ãåŸããããã§ãã 転æç¹Såã ã調ç¯ããå€ãå¿
èŠãªã®ã§ ãšåãã ãšãããã¯ãã«ãçšæãããã®å
èš³ãäžèšã®ããã«å®çŸ©ããŸãã ãããçšããŠåŒ(4)ã®ãªãã»ããé
mã調æŽãããšãã¬ã³ã颿°ã¯æçµçã«äžèšã®ããã«ãªããŸãã ãã®ä¿®æ£ãå
ã»ã©ã®ã³ãŒãã«å ãããšäžèšã®ããã«ã°ã©ãåã§ããŸãã T = np.linspace(- 6 , 6 , 100 ) S = np.array([- 3 , 1 , 3 ]) delta = np.array([ 0.1 , 0.3 , - 0.6 ]) def logistic_trend (T, S, delta, k= 1 , C= 1 , m= 0 ): a = np.vstack([np.where(S < t, 1 , 0 ) for t in T]) gamma = np.zeros(S.shape) for j in range ( 0 , gamma.shape[ 0 ]): gamma[j] = (S[j] - m - gamma[:j].sum()) * ( 1 - ((k + delta[:j].sum()) / (k + delta[:j + 1 ].sum()))) y = C / ( 1 + np.exp(-(k + (a * delta).sum(axis= 1 )) * (T - (m + (a * gamma).sum(axis= 1 ))))) return y out = logistic_trend(T, S, delta, k= 0.1 , m= 0 ) plt.plot(T, out) plt.xlabel( "t" , fontsize= 16 ) plt.ylabel( "y" , fontsize= 16 ) # plot change point ymax = out.max() ymin = out.min() plt.vlines( S, ymin=ymin, ymax=ymax, linestyle= 'dashed' , color= 'gray' , label= 'change point' ) plt.legend() plt.show() ããã§é£ç¶ããæ²ç·ãåŸãããŸããã 1-2. ç·åœ¢ãã¬ã³ã ç·åœ¢ãã¬ã³ãã¯äžèšã®åŒã§è¡šãããŸãã åŒ(5)ãšèŠæ¯ã¹ããšãexpã®äžèº«ãåºãŠããŠæé·çã®éšåã¯ããžã¹ãã£ãã¯ã®æãšåæ§ã®åŒã§ãã ãªãã»ããé
ã®éšåã ãç°ãªã£ãŠããŠãããã§ã¯ ãšããå®çŸ©ã® ãã¯ãã«ã§é£ç¶ããçŽç·ãåŸããããã調æŽãããŠããŸãã åèãŸã§ã«ã³ãŒããæžããšäžèšã®ããã«ãªããŸãã T = np.linspace(- 6 , 6 , 100 ) S = np.array([- 3 , 1 , 3 ]) delta = np.array([ 0.1 , 0.3 , - 0.6 ]) def linear_trend (T, S, delta, k= 1 , m= 0 ): a = np.vstack([np.where(S < t, 1 , 0 ) for t in T]) gamma = -S * delta y = (k + (a * delta).sum(axis= 1 )) * T + (m + (a * gamma).sum(axis= 1 )) return y out = linear_trend(T, S, delta, k= 0.1 , m= 0 ) plt.plot(T, out) plt.xlabel( "t" , fontsize= 16 ) plt.ylabel( "y" , fontsize= 16 ) # plot change point ymax = out.max() ymin = out.min() plt.vlines( S, ymin=ymin, ymax=ymax, linestyle= 'dashed' , color= 'gray' , label= 'change point' ) plt.legend() plt.show() 1-3. å€åç¹ã®èªåæ€åº å€åç¹ ã¯ãŠãŒã¶ãŒèªèº«ã§èšå®ããããšãã§ããŸãããã¹ããŒã¹æšå®ã®ãããªããšãããŠèªåæ€åºãå¯èœã§ãã è«æã«ãããšå€åç¹ ã®äžéæ°ãå€ãã«ãšããåç¹ã®å€æŽç ã«å¯Ÿã ãšããäºåååžãä»®å®ããã°è¯ããšãããŸãã ã¯ã©ãã©ã¹ååžã®ããšã§ããããã®åœ¢ç¶ã確èªããŠã¿ãŸãããã æ£èŠååžããã0ä»è¿ã®å€ãåºçŸãããããªã£ãŠããããšããç¹åŸŽãããããã§ãã ããã« ã®éšåãå€åããããšäžèšã®ãããªååžãåŸãããŸãã ã0ã«è¿ã¥ãã«ã€ããã»ãšãã©0ã®å€ããåºçŸããªãïŒã¹ããŒã¹ãªïŒååžã«ãªã£ãŠããããšãèŠãŠåããŸãã ãããŸã§ã®è©±ããŸãšãããšããã倿Žç ã«ã©ãã©ã¹ååžãä»®å®ãããšãå€ãã®å€æŽç¹ããšã£ãŠãããŠã倿Žçã¯ã»ãŒ0ã«ãªãããã€çšã«å€§ããªå€æŽçãçºçãããšããäºè±¡ãåçŸããããšãã§ããŸãããŸãã倿Žçã®å€§ãããã®ãã®ã¯ ãå°ãã調æŽããããšã§æããããšãå¯èœã«ãªããŸãã 1-4. ãã¬ã³ã颿°ã®äºæž¬ ãããŸã§æ±ã£ãŠãã倿Žç ã§ãããå®éã®äºæž¬ã®éã«ã¯ã©ã®ãããªå€ãåããšè¯ãã§ãããããè«æãèªããšãæç³»åããŒã¿ãäºæž¬ããéã«å€æŽç ãäžèšã®ããã«ã·ãã¥ã¬ãŒã·ã§ã³ããããšãããŸãã ãŸãã©ãã©ã¹ååžã®ã¹ã±ãŒã« ãæ±ºå®ãããããã€ãºæšå®ã§äºåŸååžãåŸãããããã§ãªããã°æå°€æšå®çã«è§£ã㊠ãååžã®ã¹ã±ãŒã«ãšããŸãããã®å Žåã® ã¯éå»ã«åºçŸãã倿Žç ã®çµ¶å¯Ÿå€ã®å¹³åã§ãã éå»ã®æç³»åã®é·ãã åããã®ãã¡æé·çã®å€æŽã®ãã£ãæç¹ã åãšå®çŸ©ããã®ã§ã倿Žç¹ã®çºç確ç㯠ãçºçããªã確ç㯠ãšèšããŸãã ããããèžãŸããè«æã§ã¯å°æ¥ã® ã«ã€ããŠäžèšã®ããã«å®çŸ©ããŠããŸãã å·Šã®åŒã§ããã ã¯å
šç§°èšå·ãªã®ã§ ãã倧ããä»»æã® ã€ãŸãæªæ¥ã«èµ·ãããã¹ãŠã®å€æŽç¹ã«ã€ããŠããšããæå³ã«ãªããŸããå³ã®åŒã¯ã 㯠with probability ã®ç¥ãªã®ã§ ã®ç¢ºçã§ ã®ç¢ºç㧠㯠ã®ååžã«åŸãä¹±æ° ãšããæå³ã«ãªããŸãã ãŸãšãããšãæªæ¥ã®å€æŽç ãæ±ããã«ã¯ããŸã ã®ç¢ºçã§ ã0ã«ãªããã©ãã©ã¹ååžã«åŸãä¹±æ°ãšãªãããæ±ºãŸããã©ãã©ã¹ååžã«åŸãå Žå㯠ãã®ååžã®ä¹±æ°ã倿Žç ãšãªã...以äžã®ããã»ã¹ãäºæž¬ãããæç¹ã¶ãç¹°ãè¿ãããšã«ãªããŸãã ãã®äžé£ã®ã·ãã¥ã¬ãŒã·ã§ã³ãã³ãŒãã§æžããšäžèšã®ããã«ãªããŸãããã¬ã³ã颿°ã«ã¯ããžã¹ãã£ãã¯ã®ã»ããçšããŠããŸãã class LogisticTrendEstimator : def fit (self, T, S, delta, k= 1 , C= 1 , m= 0 ): self._T = T self._S = S self._delta = delta self._k = k self._C = C self._s_freq = len (S) / len (T) self._mu_delta = np.abs(delta).mean() self._y, self._gamma = self._logistic_trend(T, S, delta, k, C, m) def _logistic_trend (self, T, S, delta, k= 1 , C= 1 , m= 0 ): a = np.vstack([np.where(S < t, 1 , 0 ) for t in T]) gamma = np.zeros(S.shape) for j in range ( 0 , gamma.shape[ 0 ]): gamma[j] = (S[j] - m - gamma[:j].sum()) * ( 1 - ((k + delta[:j].sum()) / (k + delta[:j + 1 ].sum()))) y = C / ( 1 + np.exp(-(k + (a * delta).sum(axis= 1 )) * (T - (m + (a * gamma).sum(axis= 1 ))))) return y, gamma def forecast (self, length= 10 , seed= None ): np.random.seed(seed=seed) # generate future change point, and its change rate occurrence = np.random.binomial(n= 1 , p=self._s_freq, size=length) generated_s = np.where(occurrence == 1 )[ 0 ] + self._T.max() generated_delta = np.random.laplace( 0 , self._mu_delta, generated_s.shape[ 0 ]) # predict future = np.arange(length) + self._T.max() future_y, _ = self._logistic_trend( T=future, S=generated_s, delta=generated_delta, k=self._k, C=self._C, m=self._gamma[- 1 ] ) # plot y plt.plot(self._T, self._y, c= 'steelblue' , label= 'past' ) plt.plot(future, future_y, c= 'darkorange' , label= 'predict' ) plt.xlabel( "t" , fontsize= 16 ) plt.ylabel( "y" , fontsize= 16 ) # plot change point ymax=np.max([self._y.max(), future_y.max()]) ymin=np.min([self._y.min(), future_y.min()]) plt.vlines( np.hstack([self._S, generated_s]), ymin=ymin, ymax=ymax, linestyle= 'dashed' , color= 'gray' , label= 'change point' ) plt.legend() plt.show() return future_y T = np.arange( 100 ) S = np.array([ 20 , 60 , 80 ]) delta = np.array([- 0.03 , 0.01 , 0.02 ]) estimator = LogisticTrendEstimator() estimator.fit(T=T, S=S, delta=delta, k= 0.01 , m= 0 ) pred = estimator.forecast(length= 100 , seed= 123 ) 2. : å£ç¯å€å 次ã«å£ç¯å€åã衚çŸããäžèšã®åŒãçè§£ããŠãããŸãã è±èªã®çŽèš³ã§ãå£ç¯å€åããšæžããŸããããæå³çã«ã¯å£ç¯ãå«ããé±ãæã幎ãšãã£ãããããåšææ§ã ã§æ±ããŸãã å£ç¯ã«ããå€åããã â åšææ§ããã â ä¿¡å·åŠçã£ãœã衚çŸã§ããããšããçºæ³ã§ ã¯äžèšã®ããã«äžè¬çãªããŒãªãšçŽæ°ã§è¡šçŸãããŠããŸãã ãã®åŒãçè§£ããããã«ããŸãããŒãªãšçŽæ°å±éã®æ°æã¡ãç°¡åã«åŸ©ç¿ããŸãã ããŒãªãšçŽæ°å±éã«ã€ã㊠äžèšã®ãããªæ²ç·ãã©ãã«ãããŠé¢æ° ã§è¡šããããšããŸãã ïŒããã¯ãã¡ããç§ãäœã£ãã®ã§äºåã«ç¥ã£ãŠãã ãã§ããïŒèª¿ã¹ããäžèšã®åŒã§è¡šããããšãããããŸããã ã©ããããã®æ²ç·ã¯3ã€ã®äžè§é¢æ°ã®åã§è¡šçŸãããŠããããã§ãã3ã€ã®äžè§é¢æ°ããã©ãã©ã«ããããããå³ãã¿ããšäžèšã®ããã«ãªããŸãã ãã®ããã«ãã¯ããŒãªã³å±éãªã©ãšéã£ãŠãsinãcosãªã©ã®äžè§é¢æ°ã®åã§é¢æ°è¿äŒŒããããšããã®ãããŒãªãšçŽæ°å±éã®ç¹åŸŽã§ãã å£ç¯æ§ã®å£²äžãªã©ãåšææ§ããã£ã波圢ã®ããŒã¿ã§ããã° ãšããããã«ååšæ³¢æ°(ããã§ã¯t, 2t, 3t...ã®ããš)ã®æåã远å ããŠããã°ã©ã®ãããªæ³¢åœ¢ã§ã衚çŸå¯èœã«ãªããŸãã ãããŸã§ã®è©±ããŸãšãããããå°ã匷åŒã«äžè¬åããåŒã«çŽããš ã®ããã«sinæ³¢ãšcosæ³¢ã®åã§è¡šçŸã§ããŸãã äžè§é¢æ°ã®åšæ³¢æ°ã«ã€ã㊠Prophetã®å£ç¯é¢æ°ãçè§£ããããã«ããšäžç¹ã ããåšæ³¢æ° ã®éšåã«ã€ããŠæ·±æã£ãŠãããŸãã åšæ³¢æ°ã¯sinæ³¢cosæ³¢ã®æ¯å¹
æ°ã衚ããŠããŸãã ãšããåäœã§äžåšããã®ã§ãäŸãã°30æ¥ã®ãã¡1é±éããšã«äžåšããsinæ³¢ã衚çŸãããå Žå㯠ãšããåŒã«ãªããåšæ³¢æ°ã®åæ¯ã§åšæã®åäœïŒããã§ã¯ïŒé±éãªã®ã§7ïŒãæå®ããŸãã ãããã°ã©ãåãããšäžèšã®ããã«ãªãã30æ¥ã®éã«sinæ³¢ã4åšããŠããïŒ30æ¥ãšã¯4é±éã¡ãã£ãšã®æéãªã®ã§ïŒããšãèŠãŠãšããŸãã Prophetã®å£ç¯é¢æ°ã§ã¯ããã®ãããªé±ãæã幎åäœã®åšæãæã€ããšãæè»ã«è¡šçŸã§ãããã倿° ãçšã㊠ãšããå€åœ¢ãããŠããŸããããã« ãç¡é倧ã ãšèšç®éãéå€ã«ãªã & æ£ã®å®æ°ã®ã¿ã§ååã«å£ç¯å€åã衚çŸã§ããããã ã ã«çŽãã ã«æžãæãããš ãšå€åœ¢ã§ããæåã«ç€ºããå£ç¯å€åã®é¢æ° ãåŸãããŸãã ãã©ã¡ã¿æšå®ãããã圢ã«å€åœ¢ãã ãã®ãšãæé©åãã¹ã㯠] ã®éšåãåèš2Nåã®ãã©ã¡ã¿ãªã®ã§æ±ãããããã¯ãã«ã§æãåºããŠè¡šçŸããŸãã æ®ãã®äžè§é¢æ°ã®éšåããã¯ãã«åããŠæãåºããŸãã仮㫠ã®ç²åºŠãŸã§ã§é¢æ°è¿äŒŒãã幎åäœã®å£ç¯å€åã«èŠãããã« ãšããå Žåã«ã¯ã ãšãããã¯ãã«ãäœããŸãã â» é幎ãå«ãããš1幎ã®å¹³åæ¥æ°ã¯365.25 ããããçšããŠçµå± ã¯äžèšã®ããã«å€åœ¢ã§ããŸãã è«æã§ã¯ããã« ãšããããŒãªãšçŽæ°ã®åä¿æ°ã«æ£èŠååžãä»®å®ããŠããããã§ãã ã¡ãªã¿ã«ãã©ã¡ã¿ ã¯å€ãã»ã©åšæå€åã«ããŸãåœãŠã¯ãŸãããã«ãªããŸãããåæã«ãªãŒããŒãã£ããã£ã³ã°ããŠããŸãåé¡ãæ±ããŠããŸããè«æã§ã¯ã幎åäœã®åšæãªã ãé±åäœãªã ãããã§çšãããã£ããã£ã³ã°ãããšæžããŠãããŸãïŒå人çã«N = 10 ã¯ããå€ãã®ã§ã¯ããšããæ°ãããŸããïŒã 3. : äŒæ¥å¹æ æåŸã«çªçºçãªã€ãã³ã广ãã¢ãã«ã«çµã¿èŸŒã ã«ã€ããŠèŠãŠãããŸãã ãããè±èªã®çŽèš³ã§ãäŒæ¥å¹æããšæžããŸããããæå³çã«ã¯äŒæ¥å«ãã€ãã³ãå
šãŠã ã§æ±ããŸãã äŒæ¥ãã€ãã³ãã®å€ãã¯äºåã«äºèŠã§ããããã«åšæãšãã£ããã®ã¯ãªããå£ç¯å€å ã§ã¯åãå
¥ãã«ããèŠçŽ ã§ãããã®ããèªåæ€ç¥äºã
ã¯è«ŠããProphetã§ã¯åæè
èªèº«ãã€ãã³ãã«ã¬ã³ããŒã®ãªã¹ããäœã£ãŠã¢ãã«ã«çµã¿èŸŒããããã«èšèšããŠããŸãã ãã®èšèšãProphetã§ã¯ã©ã®ãããªæ°åŒã§è¡šããŠããã®ããèŠãŠãããŸãã ããã€ãã³ãã ãšããããã«è©²åœããæ¥ä»ãå
šãŠå«ãã ãã¯ãã« ãäœããŸãã ããšãã° ãªã ãšããããã«éå»ãšæªæ¥å
šãŠã®12æ25æ¥ãå«ãããšã«ãªããŸããããã«åæç¹ ã ã«è©²åœãããåŠãã衚ãã€ã³ãã£ã±ãŒã¿ãŒãšã㊠ãšãããã¯ãã«ãå®çŸ©ããŸããããæç¹ ãåã€ãã³ã ã«è©²åœãããã®ãã©ã°ã 0 or 1ã§å
¥ã£ãŠããŸãã åã€ãã³ã ã«å¯Ÿããä¿æ°ãã©ã¡ã¿ã ãšãããã®ãã¯ãã«ã ã§è¡šããšãæçµçã«äŒæ¥å¹æ 㯠ãšãªããå£ç¯å€å ãšåæ§ã«ãã©ã¡ã¿éšåã ãããã¯ãã«ã«åé¢ããŠè¡šãããŠããŸãã å£ç¯å€åã®ãã©ã¡ã¿ ãšåæ§ã« ãäžèšã®ããã«æ£èŠååžãä»®å®ãããŠããŸãã ãŸãšã åé ã®Prophetã®ã¢ãã«åŒãåæ²ãããšäžèšã®ãããªãäž»ã«3ã€ã®ã³ã³ããŒãã³ãããã§ããŠããŸããã åèŠçŽ ã¯æçµçã«äžèšã®ããã«å±éã§ããŸããã ...æ¬åœã¯ãããæªç¥ã®ãã©ã¡ã¿ã®æé©åã«ã€ããŠæžããªããšããªãæªãã®ã§ããã ããäœåã èšäºã®ããªã¥ãŒã ãéçãªã®ã§ç°¡åã«è¿°ã¹ãŸãã 諞ã
ã®ãã©ã¡ã¿ãå®çŸ©ããŠããäžã§ãèšäºäžã§ã¯äžèšã®3ã€ã«ã€ããŠãããã確çååžãä»®å®ããŠããŸããã ãã©ã¡ã¿ããšã«ååžãä»®å®ããŠãããšç¶æ
空éã¢ãã«ãšããŠæ±ãããšãã§ããŸããå®éã«Prophetã§ã¯ãã®ã¢ãã«åŒãStanã§èšè¿°ãããL-BFGSæ³ãªã©ã§æé©åãããŠããããã§ãã æåŸã« ç§èªèº«ãæ°åŠãããŸãåŸæã§ãªãã®ã§ããªãåã¿ç ããŠæžããŠã¿ãŸãããã©ãªããã®çè§£ã®ãšã£ãããã«ãªãã°å¹žãã§ãã ææ¥ã®ã¢ããã³ãã«ã¬ã³ããŒã¯ Owners GrowthããŒã ã®å€§æšãããšãPAYæ ªåŒäŒç€Ÿã®ã»ãã¥ãªãã£ãšã³ãžãã¢ãã¯ãªã¹ããã§ãïŒ ãæ¥œãã¿ã«ïŒ