IGNG - рд╡реГрджреНрдзрд┐рд╢реАрд▓ рддрдВрддреНрд░рд┐рдХрд╛ рдЧреИрд╕ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рдПрдХ рд╡рд┐рд╕рдВрдЧрддрд┐ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп , рдореИрдВрдиреЗ рдЗрдВрдХреНрд░реАрдореЗрдВрдЯрд▓ рдЧреНрд░реЛрдЗрдВрдЧ рдиреНрдпреВрд░рд▓ рдЧреИрд╕ рдирд╛рдордХ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред


рд╕реЛрд╡рд┐рдпрдд рд╕рд╛рд╣рд┐рддреНрдп рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд░реВрд╕реА рдЦрдВрдб, рдпрд╣ рд╡рд┐рд╖рдп рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд▓реЗрдЦ рдерд╛ , рдФрд░ рдлрд┐рд░ рднреА рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рдеред


рддреЛ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рддрдВрддреНрд░рд┐рдХрд╛ рдЧреИрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрдврд╝ рд░рд╣рд╛ рд╣реИ?


рдкрд░рд┐рдЪрдп


IGGG, GNG рдХреА рддрд░рд╣, рдПрдХ рдЕрдиреБрдХреВрд▓реА рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ 2005 рдХреЗ рд▓рд┐рдП рдкреНрд░реВрдбреЗрдВрдЯ рдФрд░ рдПрдирдирд╛рдбрдЬреА рдХреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред


рдЬреАрдПрдирдЬреА рдХреА рддрд░рд╣, рдХрдИ рдбреЗрдЯрд╛ рд╡реИрдХреНрдЯрд░ рд╣реИрдВ X рдпрд╛ рдЙрддреНрдкрд╛рджрди рд╕рдорд╛рд░реЛрд╣ рдЪ(t)рдЪ , рдЬреЛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдбреЗрдЯрд╛ (рдкреИрд░рд╛рдореАрдЯрд░) рд╕реЗ рд╡реИрдХреНрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЯреАрдЯреА - рд╕рдордп, рдпрд╛ рдирдореВрдиреЗ рдореЗрдВ рдирдореВрдирд╛ рд╕рдВрдЦреНрдпрд╛)ред


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрди рдбреЗрдЯрд╛ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдВрджрд░ рдЬреАрдПрдирдЬреА рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред


рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ GNG рдореЙрдбрд▓ рдиреНрдпреВрд░реЛрдЬреЗрдиреЗрд╕рд┐рд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реИред


рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╡рд┐рд╡рд░рдг


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред
рдЬреАрдПрдирдЬреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдЪреНрдЪ рдЕрднрд┐рд╕рд░рдг рджрд░ рд╣реИред


рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдЪрд╛рд░:


  • рдПрдбреЗрдкреНрдЯрд┐рд╡ рд░реЗрдЬреЛрдиреЗрдВрд╕ рдереНрдпреЛрд░реА : рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рдХрдЯрддрдо рдиреНрдпреВрд░реЙрди рдХреА рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдЕрдВрддрд░ рдереНрд░реЗрд╢реЛрд▓реНрдб ("рд╕рддрд░реНрдХрддрд╛ рдкреИрд░рд╛рдореАрдЯрд░") рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рдЬрди рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛, рдЕрдиреНрдпрдерд╛, рдбреЗрдЯрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдиреНрдпреВрд░реЙрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдереНрд░реЗрд╢реЛрд▓реНрдб рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдирдП рдиреНрдпреВрд░реЙрдиреНрд╕ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛ рдирдореВрдиреЗ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдмреЗрд╣рддрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВред
  • рджреЛрдиреЛрдВ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдиреНрдпреВрд░реЙрдиреНрд╕ рдореЗрдВ рдПрдХ рдЖрдпреБ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ (рдЬреАрдПрдирдЬреА рдореЗрдВ рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди рд╣реЛрддреЗ рд╣реИрдВ), рдЬреЛ рдкрд╣рд▓реЗ рддреЛ рд╢реВрдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдЖрдк рд╕реАрдЦрддреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдмрдврд╝рддрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдПрдХ рдиреНрдпреВрд░реЙрди рддреБрд░рдВрдд рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдкрд╣рд▓реЗ рдПрдХ рднреНрд░реВрдг (рдпрд╛ рдЬрд░реНрдорд┐рдирд▓ рдиреНрдпреВрд░реЙрди) рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдЖрдпреБ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдмрдврд╝рддреА рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкрдХ рдирд╣реАрдВ рдЬрд╛рддрд╛ред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдмрд╛рдж, рдХреЗрд╡рд▓ рдкрд░рд┐рдкрдХреНрд╡ рдиреНрдпреВрд░реЙрдиреНрд╕ рд╡рд░реНрдЧреАрдХрд░рдг рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ ред

рдореБрдЦреНрдп рдЪрдХреНрд░


рдХрд╛рдо рдПрдХ рдЦрд╛рд▓реА рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░  рд╕рд┐рдЧреНрдорд╛рд╕рд┐рдЧреНрдорд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдирдореВрдиреЗ рдХреЗ рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рджреНрд╡рд╛рд░рд╛ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛:


 sigma= sqrt frac1N sum limitNi=1 left(xiтИТ barx right)2


рдЬрд╣рд╛рдВ:  рдмрд╛рд░xрдмрд╛рд░ - рдирдореВрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмреАрдЪ рдХрд╛ рдФрд╕рддред


рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рдореБрдЦреНрдп рд▓реВрдк рдореВрд▓реНрдп рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ  рд╕рд┐рдЧреНрдорд╛рд╕рд┐рдЧреНрдорд╛ , рдЬреЛ рдирд┐рдХрдЯрддрд╛ рд╕реАрдорд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕реНрддрд░ рдФрд░ IGNG рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рд╕реНрддрд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред



рдЪрд╛рд░реНрдЯ рдХреЛрдбред
@startuml start :TrainIGNG(S); :<latex>\sigma = \sigma_S,x,y \in S</latex>; :<latex>IGNG(1, \sigma, age_{mature}, S)</latex>; :<latex>old = 0</latex>; :<latex>calin = CHI()</latex>; while (<latex>old - calin \leq 0</latex>) :<latex>\sigma=\sigma - \sigma / 10</latex>; :<latex>IGNG(1, \sigma, age_{mature}, S)</latex>; :<latex>old = calin</latex>; :<latex>calin = CHI()</latex>; endwhile stop @enduml 

рд╕реАрдПрдЪрдЖрдИ рдХрд▓рд┐рдВрд╕реНрдХреА-рдЦрд░рд╛рдЬрд╛рдЬрд╝ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рдЬреЛ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:


CHI= fracB/(cтИТ1)W/(nтИТc)


рдЬрд╣рд╛рдВ:


  • рдПрдирдПрди - рдбреЗрдЯрд╛ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред
  • рд╕реАрд╕реА - рд╕рдореВрд╣реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛)ред
  • рдмрдм - рдЖрдВрддрд░рд┐рдХ рдлреИрд▓рд╛рд╡ рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рдХреЗ рдФрд╕рдд рдХреЗ рдмреАрдЪ рд╡рд░реНрдЧ рджреВрд░реА рдХрд╛ рдпреЛрдЧ)ред
  • рдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВ - рдмрд╛рд╣реНрдп рдлреИрд▓рд╛рд╡ рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рд╕рднреА рдбреЗрдЯрд╛ рдФрд░ рдирд┐рдХрдЯрддрдо рдиреНрдпреВрд░реЙрди рдХреЗ рдмреАрдЪ рд╡рд░реНрдЧ рджреВрд░реА рдХрд╛ рдпреЛрдЧ)ред

рд╕реВрдЪрдХрд╛рдВрдХ рдореВрд▓реНрдп рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рдЧрдпрд╛ рдФрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛, рдЕрд░реНрдерд╛рддреНред рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реНрдг рд╣реБрдИред


IGNG рдкреНрд░рдХреНрд░рд┐рдпрд╛


рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред


рдЗрд╕реЗ рддреАрди рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


  • рдХреЛрдИ рдиреНрдпреВрд░реЙрди рдирд╣реАрдВ рдорд┐рд▓рд╛ред
  • рдПрдХ рд╕рдВрддреЛрд╖рдЬрдирдХ рдиреНрдпреВрд░реЙрди рдкрд╛рдпрд╛ рдЧрдпрд╛ред
  • рджреЛ рдкрд╛рдпрд╛ рдЬреЛ рдиреНрдпреВрд░реЙрди рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рд╢рд░реНрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдиреНрдп рдЪрд░рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдиреНрдпреВрд░реЙрди рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдбреЗрдЯрд╛ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ:


c1=рдорд┐рдирдЯ(dist( xi, omegac))

рдорд┐рдирдЯ


рдпрд╣рд╛рдВ рдбрд┐рд╕реНрдЯ(x omega,x xi)рдбрд┐рд╕реНрдЯ - рджреВрд░реА рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдореАрдЯреНрд░рд┐рдХ рд╣реИ ред


рдпрджрд┐ рдиреНрдпреВрд░реЙрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдбреЗрдЯрд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдЕрд░реНрдерд╛рддред рдирд┐рдХрдЯрддрд╛ рдорд╛рдирджрдВрдб рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдбрд┐рд╕реНрдЯ( xi, omegac) leq sigmaрдбрд┐рд╕реНрдЯ , рдбреЗрдЯрд╛ рд╕реНрдкреЗрд╕ рдореЗрдВ рдирдореВрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмрд░рд╛рдмрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рднреНрд░реВрдг рдиреНрдпреВрд░реЙрди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдпрджрд┐ рдирд┐рдХрдЯрддрд╛ рдЬрд╛рдВрдЪ рдкрд╛рд╕ рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рдПрдХ рджреВрд╕рд░реЗ рдиреНрдпреВрд░реЙрди рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдирдореВрдиреЗ рд╕реЗ рдирд┐рдХрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
рдпрджрд┐ рджреВрд╕рд░рд╛ рдиреНрдпреВрд░реЙрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдпрджрд┐ рджреЛ рдиреНрдпреВрд░реЙрдиреНрд╕ рдкрд╛рдП рдЧрдП рдереЗ рдЬреЛ рдбреЗрдЯрд╛ рдирдореВрдиреЗ рдХреЗ рдирд┐рдХрдЯрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рдореНрди рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдареАрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


 epsilon(t)hc,ci= startcase epsilonb, ifc=ci epsilonn, ifthere , ,рдХрдиреЗрдХреНрд╢рдирдмреАрдЪрдореЗрдВ,c,c==ci0,inotherрдХреЗрд╕ рдПрдВрдбрдХреЗрд╕

рдХрдиреЗрдХреНрд╢рдирдмреАрдЪрдореЗрдВрдХреЗрд╕рдПрдВрдбрдХреЗрд╕


 Delta omegac= epsilon(t)hc,c1 рд╕рдорд╛рдирд╛рдВрддрд░ xiтИТ omegac рд╕рдорд╛рдирд╛рдВрддрд░ omegac= omegac  Delta omegac

рд╕рдорд╛рдирд╛рдВрддрд░рд╕рдорд╛рдирд╛рдВрддрд░


рдЬрд╣рд╛рдВ:


  •  epsilon(t) - рдЕрдиреБрдХреВрд▓рди рдХрджрдоред
  • ci рдиреНрдпреВрд░реЙрди рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред
  • hc,c1 - рдиреНрдпреВрд░реЙрди рдиреЗрдмрд░рд╣реБрдб рдлрдВрдХреНрд╢рди рд╕реАрд╕реА рд╡рд┐рдЬреЗрддрд╛ рдиреНрдпреВрд░реЙрди рдХреЗ рд╕рд╛рде (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП 1 рд▓реМрдЯреЗрдЧрд╛, 0 рдЕрдиреНрдпрдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХрджрдо, рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП  рдУрдореЗрдЧрд╛рдУрдореЗрдЧрд╛ рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпрдХреНрд╖ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЙрдирдЬрд╝рд░реЛ рд╣реЛрдЧрд╛)ред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬреАрддрдиреЗ рд╡рд╛рд▓реЗ рдиреНрдпреВрд░реЙрди рдХреЗ рд╕рдордиреНрд╡рдп (рд╡рдЬрди) рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ  epsilonbтИЧ Delta omegai , рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рдкреНрд░рддреНрдпрдХреНрд╖ рдкрдбрд╝реЛрд╕реА (рдЬреЛ рдЧреНрд░рд╛рдл рдХреЗ рдПрдХ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ)  epsilonnтИЧ Delta omegai рдЬрд╣рд╛рдБ  omegai - рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдмрдВрдзрд┐рдд рдиреНрдпреВрд░реЙрди рдХрд╛ рд╕рдордиреНрд╡рдпред


рдлрд┐рд░ рджреЛ рд╡рд┐рдЬреЗрддрд╛ рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреА рдЙрдореНрд░ рд░реАрд╕реЗрдЯ рд╣реИред
рдЕрдиреНрдп рд╕рднреА рд░рд┐рд╢реНрддреЛрдВ рдХреА рдЙрдореНрд░ рдмрдврд╝ рд░рд╣реА рд╣реИред


рд╕рднреА рд╕рдВрдЪрд╛рд░ рдЬрд┐рдирдХреА рдЖрдпреБ рдирд┐рд░рдВрддрд░ рд╕реЗ рдЕрдзрд┐рдХ рдереА ageрдЕрдзрд┐рдХрддрдордЕрдзрд┐рдХрддрдо рд╣рдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рднреА рдкреГрдердХ (рдЬрд┐рдирдХрд╛ рджреВрд╕рд░реЛрдВ рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИ) рдкрд░рд┐рдкрдХреНрд╡ рдиреНрдпреВрд░реЙрдиреНрд╕ рдирд┐рдХрд╛рд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рдЬреАрддрдиреЗ рд╡рд╛рд▓реЗ рдиреНрдпреВрд░реЙрди рдХреЗ рддрддреНрдХрд╛рд▓ рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреА рдЙрдореНрд░ рдмрдврд╝ рд░рд╣реА рд╣реИред
рдпрджрд┐ рдХрд┐рд╕реА рднреА рд░реЛрдЧрд╛рдгреБ рдиреНрдпреВрд░реЙрдиреНрд╕ рдХреА рдЙрдореНрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рд╡рдпрдкрд░рд┐рдкрдХреНрд╡рд╡рдпрдкрд░рд┐рдкрдХреНрд╡ рд╡рд╣ рдПрдХ рдкрд░рд┐рдкрдХреНрд╡ рдиреНрдпреВрд░реЙрди рдмрди рдЬрд╛рддрд╛ рд╣реИред


рдЕрдВрддрд┐рдо рдЧреНрд░рд╛рдл рдореЗрдВ рдХреЗрд╡рд▓ рдкрд░рд┐рдкрдХреНрд╡ рдиреНрдпреВрд░реЙрдиреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред


рдиреАрдЪреЗ IGNG рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдПрдХ рд╢рд░реНрдд рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪрдХреНрд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЪрд┐рддреНрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ):



рдЪрд╛рд░реНрдЯ рдХреЛрдбред
 @startuml skinparam nodesep 10 skinparam ranksep 20 start :IGNG(age, sigma, <latex>a_{mature}</latex>, S); while (  ) is () -[#blue]-> :   e  S; :   c<sub>1</sub>; if (  \n<latex>dist(\xi, \omega_{c_1}) \leq \sigma</latex>) then () :     <latex>\omega_{new} = \xi</latex>; else () -[#blue]-> :   ; if (     \n <latex>dist(\xi, \omega_{c_2}) \leq \sigma</latex>) then () :     <latex>\omega_{new} = \xi</latex>; :   <latex>c_1</latex>  <latex>c_2</latex>; note     ,      end note else () -[#blue]-> :   ,\n  <latex>c_1</latex>; :<latex>\omega_{c_1} = \omega_c + \epsilon_b(\xi - \omega_{c_1})</latex>; :<latex>\omega_n = \omega_n + \epsilon_n(\xi - \omega_n)</latex>; note n -     <latex>c_1</latex> (..     ) end note if (c<sub>1</sub>  c<sub>2</sub> ) then () :  : <latex>age_{c_1 -> c_2} = 0</latex>; else () -[#blue]-> :   c<sub>1</sub>  c<sub>2</sub>; endif :  \n  c<sub>1</sub>; note ,    ,   . end note endif repeat if (<latex>age(c) \geq a_{mature}</latex>) then () :  $<!-- math>c</math -->$  ; else () -[#blue]-> endif repeat while (  ?) endif : ,    ; :   ; note          IGNG,   ,     GNG.     . endnote endwhile () stop @enduml 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


NetworkX рдЧреНрд░рд╛рдл рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рдХреЛрдб рдХрд╛рдЯрдирд╛ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рднреА рд╣реИрдВред


рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдкреВрд░реНрдг рдХреЛрдб рдореЗрдВ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:



рдХреЛрдб рдХрд╛ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛
 class NeuralGas(): __metaclass__ = ABCMeta def __init__(self, data, surface_graph=None, output_images_dir='images'): self._graph = nx.Graph() self._data = data self._surface_graph = surface_graph # Deviation parameters. self._dev_params = None self._output_images_dir = output_images_dir # Nodes count. self._count = 0 if os.path.isdir(output_images_dir): shutil.rmtree('{}'.format(output_images_dir)) print("Ouput images will be saved in: {0}".format(output_images_dir)) os.makedirs(output_images_dir) self._start_time = time.time() @abstractmethod def train(self, max_iterations=100, save_step=0): raise NotImplementedError() def number_of_clusters(self): return nx.number_connected_components(self._graph) def detect_anomalies(self, data, threshold=5, train=False, save_step=100): anomalies_counter, anomaly_records_counter, normal_records_counter = 0, 0, 0 anomaly_level = 0 start_time = self._start_time = time.time() for i, d in enumerate(data): risk_level = self.test_node(d, train) if risk_level != 0: anomaly_records_counter += 1 anomaly_level += risk_level if anomaly_level > threshold: anomalies_counter += 1 #print('Anomaly was detected [count = {}]!'.format(anomalies_counter)) anomaly_level = 0 else: normal_records_counter += 1 if i % save_step == 0: tm = time.time() - start_time print('Abnormal records = {}, Normal records = {}, Detection time = {} s, Time per record = {} s'. format(anomaly_records_counter, normal_records_counter, round(tm, 2), tm / i if i else 0)) tm = time.time() - start_time print('{} [abnormal records = {}, normal records = {}, detection time = {} s, time per record = {} s]'. format('Anomalies were detected (count = {})'.format(anomalies_counter) if anomalies_counter else 'Anomalies weren\'t detected', anomaly_records_counter, normal_records_counter, round(tm, 2), tm / len(data))) return anomalies_counter > 0 def test_node(self, node, train=False): n, dist = self._determine_closest_vertice(node) dev = self._calculate_deviation_params() dev = dev.get(frozenset(nx.node_connected_component(self._graph, n)), dist + 1) dist_sub_dev = dist - dev if dist_sub_dev > 0: return dist_sub_dev if train: self._dev_params = None self._train_on_data_item(node) return 0 @abstractmethod def _train_on_data_item(self, data_item): raise NotImplementedError() @abstractmethod def _save_img(self, fignum, training_step): """.""" raise NotImplementedError() def _calculate_deviation_params(self, distance_function_params={}): if self._dev_params is not None: return self._dev_params clusters = {} dcvd = self._determine_closest_vertice dlen = len(self._data) #dmean = np.mean(self._data, axis=1) #deviation = 0 for node in self._data: n = dcvd(node, **distance_function_params) cluster = clusters.setdefault(frozenset(nx.node_connected_component(self._graph, n[0])), [0, 0]) cluster[0] += n[1] cluster[1] += 1 clusters = {k: sqrt(v[0]/v[1]) for k, v in clusters.items()} self._dev_params = clusters return clusters def _determine_closest_vertice(self, curnode): """.""" pos = nx.get_node_attributes(self._graph, 'pos') kv = zip(*pos.items()) distances = np.linalg.norm(kv[1] - curnode, ord=2, axis=1) i0 = np.argsort(distances)[0] return kv[0][i0], distances[i0] def _determine_2closest_vertices(self, curnode): """Where this curnode is actually the x,y index of the data we want to analyze.""" pos = nx.get_node_attributes(self._graph, 'pos') l_pos = len(pos) if l_pos == 0: return None, None elif l_pos == 1: return pos[0], None kv = zip(*pos.items()) # Calculate Euclidean distance (2-norm of difference vectors) and get first two indexes of the sorted array. # Or a Euclidean-closest nodes index. distances = np.linalg.norm(kv[1] - curnode, ord=2, axis=1) i0, i1 = np.argsort(distances)[0:2] winner1 = tuple((kv[0][i0], distances[i0])) winner2 = tuple((kv[0][i1], distances[i1])) return winner1, winner2 class IGNG(NeuralGas): """Incremental Growing Neural Gas multidimensional implementation""" def __init__(self, data, surface_graph=None, eps_b=0.05, eps_n=0.0005, max_age=5, a_mature=1, output_images_dir='images'): """.""" NeuralGas.__init__(self, data, surface_graph, output_images_dir) self._eps_b = eps_b self._eps_n = eps_n self._max_age = max_age self._a_mature = a_mature self._num_of_input_signals = 0 self._fignum = 0 self._max_train_iters = 0 # Initial value is a standard deviation of the data. self._d = np.std(data) def train(self, max_iterations=100, save_step=0): """IGNG training method""" self._dev_params = None self._max_train_iters = max_iterations fignum = self._fignum self._save_img(fignum, 0) CHS = self.__calinski_harabaz_score igng = self.__igng data = self._data if save_step < 1: save_step = max_iterations old = 0 calin = CHS() i_count = 0 start_time = self._start_time = time.time() while old - calin <= 0: print('Iteration {0:d}...'.format(i_count)) i_count += 1 steps = 1 while steps <= max_iterations: for i, x in enumerate(data): igng(x) if i % save_step == 0: tm = time.time() - start_time print('Training time = {} s, Time per record = {} s, Training step = {}, Clusters count = {}, Neurons = {}, CHI = {}'. format(round(tm, 2), tm / (i if i and i_count == 0 else len(data)), i_count, self.number_of_clusters(), len(self._graph), old - calin) ) self._save_img(fignum, i_count) fignum += 1 steps += 1 self._d -= 0.1 * self._d old = calin calin = CHS() print('Training complete, clusters count = {}, training time = {} s'.format(self.number_of_clusters(), round(time.time() - start_time, 2))) self._fignum = fignum def _train_on_data_item(self, data_item): steps = 0 igng = self.__igng # while steps < self._max_train_iters: while steps < 5: igng(data_item) steps += 1 def __long_train_on_data_item(self, data_item): """.""" np.append(self._data, data_item) self._dev_params = None CHS = self.__calinski_harabaz_score igng = self.__igng data = self._data max_iterations = self._max_train_iters old = 0 calin = CHS() i_count = 0 # Strictly less. while old - calin < 0: print('Training with new normal node, step {0:d}...'.format(i_count)) i_count += 1 steps = 0 if i_count > 100: print('BUG', old, calin) break while steps < max_iterations: igng(data_item) steps += 1 self._d -= 0.1 * self._d old = calin calin = CHS() def _calculate_deviation_params(self, skip_embryo=True): return super(IGNG, self)._calculate_deviation_params(distance_function_params={'skip_embryo': skip_embryo}) def __calinski_harabaz_score(self, skip_embryo=True): graph = self._graph nodes = graph.nodes extra_disp, intra_disp = 0., 0. # CHI = [B / (c - 1)]/[W / (n - c)] # Total numb er of neurons. #ns = nx.get_node_attributes(self._graph, 'n_type') c = len([v for v in nodes.values() if v['n_type'] == 1]) if skip_embryo else len(nodes) # Total number of data. n = len(self._data) # Mean of the all data. mean = np.mean(self._data, axis=1) pos = nx.get_node_attributes(self._graph, 'pos') for node, k in pos.items(): if skip_embryo and nodes[node]['n_type'] == 0: # Skip embryo neurons. continue mean_k = np.mean(k) extra_disp += len(k) * np.sum((mean_k - mean) ** 2) intra_disp += np.sum((k - mean_k) ** 2) return (1. if intra_disp == 0. else extra_disp * (n - c) / (intra_disp * (c - 1.))) def _determine_closest_vertice(self, curnode, skip_embryo=True): """Where this curnode is actually the x,y index of the data we want to analyze.""" pos = nx.get_node_attributes(self._graph, 'pos') nodes = self._graph.nodes distance = sys.maxint for node, position in pos.items(): if skip_embryo and nodes[node]['n_type'] == 0: # Skip embryo neurons. continue dist = euclidean(curnode, position) if dist < distance: distance = dist return node, distance def __get_specific_nodes(self, n_type): return [n for n, p in nx.get_node_attributes(self._graph, 'n_type').items() if p == n_type] def __igng(self, cur_node): """Main IGNG training subroutine""" # find nearest unit and second nearest unit winner1, winner2 = self._determine_2closest_vertices(cur_node) graph = self._graph nodes = graph.nodes d = self._d # Second list element is a distance. if winner1 is None or winner1[1] >= d: # 0 - is an embryo type. graph.add_node(self._count, pos=copy(cur_node), n_type=0, age=0) winner_node1 = self._count self._count += 1 return else: winner_node1 = winner1[0] # Second list element is a distance. if winner2 is None or winner2[1] >= d: # 0 - is an embryo type. graph.add_node(self._count, pos=copy(cur_node), n_type=0, age=0) winner_node2 = self._count self._count += 1 graph.add_edge(winner_node1, winner_node2, age=0) return else: winner_node2 = winner2[0] # Increment the age of all edges, emanating from the winner. for e in graph.edges(winner_node1, data=True): e[2]['age'] += 1 w_node = nodes[winner_node1] # Move the winner node towards current node. w_node['pos'] += self._eps_b * (cur_node - w_node['pos']) neighbors = nx.all_neighbors(graph, winner_node1) a_mature = self._a_mature for n in neighbors: c_node = nodes[n] # Move all direct neighbors of the winner. c_node['pos'] += self._eps_n * (cur_node - c_node['pos']) # Increment the age of all direct neighbors of the winner. c_node['age'] += 1 if c_node['n_type'] == 0 and c_node['age'] >= a_mature: # Now, it's a mature neuron. c_node['n_type'] = 1 # Create connection with age == 0 between two winners. graph.add_edge(winner_node1, winner_node2, age=0) max_age = self._max_age # If there are ages more than maximum allowed age, remove them. age_of_edges = nx.get_edge_attributes(graph, 'age') for edge, age in iteritems(age_of_edges): if age >= max_age: graph.remove_edge(edge[0], edge[1]) # If it causes isolated vertix, remove that vertex as well. #graph.remove_nodes_from(nx.isolates(graph)) for node, v in nodes.items(): if v['n_type'] == 0: # Skip embryo neurons. continue if not graph.neighbors(node): graph.remove_node(node) def _save_img(self, fignum, training_step): """.""" title='Incremental Growing Neural Gas for the network anomalies detection' if self._surface_graph is not None: text = OrderedDict([ ('Image', fignum), ('Training step', training_step), ('Time', '{} s'.format(round(time.time() - self._start_time, 2))), ('Clusters count', self.number_of_clusters()), ('Neurons', len(self._graph)), (' Mature', len(self.__get_specific_nodes(1))), (' Embryo', len(self.__get_specific_nodes(0))), ('Connections', len(self._graph.edges)), ('Data records', len(self._data)) ]) draw_graph3d(self._surface_graph, fignum, title=title) graph = self._graph if len(graph) > 0: draw_graph3d(graph, fignum, clear=False, node_color=(1, 0, 0), title=title, text=text) mlab.savefig("{0}/{1}.png".format(self._output_images_dir, str(fignum))) #mlab.close(fignum) 

Source: https://habr.com/ru/post/hi414209/


All Articles