C # рдореЗрдВ k- рд╕рд╛рдзрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд╕рд╛рде)

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



рд╕рдорд╕реНрдпрд╛


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВ рди рдХреЗрд╡рд▓ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПред рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ k- рд╕рд╛рдзрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рд╣реИрдВ: рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВред
  1. рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗрдВрдЯреНрд░реЛрдЗрдбреНрд╕ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрд╕ рд╕реНрдерд╛рди рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рдмрд┐рдВрджреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдЖрдк рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕рд░рдгреА, рдЖрджрд┐ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
  2. рдИ-рд╕реНрдЯреЗрдк ( рдЕрдкреЗрдХреНрд╖рд╛ ): рдбреЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЬреБрдбрд╝рд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рдХреЗрдВрджреНрд░реЛрдВ (рдХреЗрдиреНрджреНрд░рдХ) рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. рдПрдо-рд╕реНрдЯреЗрдк ( рдЕрдзрд┐рдХрддрдордХрд░рдг ): рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреЛ рдбреЗрдЯрд╛ рд╕реЗ рдФрд╕рдд рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд▓рд╕реНрдЯрд░ (рдпрд╛, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореЙрдбрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЪрдпрдирд┐рдд рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдпрджрд┐ рдЪрд░рдг 2 рдХреЗ рдмрд╛рдж рдХреНрд▓рд╕реНрдЯрд░ рдЦрд╛рд▓реА рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдкреБрдирд░реНрдирд┐рд╡реЗрд╢реАрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред
  4. рдЕрднрд┐рд╕рд░рдг рддрдХ рджреЛрд╣рд░рд╛рдП рдЧрдП рдЪрд░рдг 2-3 рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЬрдм рддрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдорд╛рдирджрдВрдб рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкрд╛рд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ)ред


рдЗрд╕ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдкреАрдЫреЗ рдХреЗ рдЧрдгрд┐рдд рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдмрд╛рдпреЗрд╕рд┐рдпрди рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдЙрдореНрдореАрдж-рдЕрдзрд┐рдХрддрдордХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

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


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

рд╡рд░реНрддрдорд╛рди рд╡рд┐рднрд╛рдЬрди рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧрдд рд╕реВрддреНрд░ рдирд┐рдореНрди рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛: рдЫрд╡рд┐ рдЬрд╣рд╛рдВ K рд╕рдореВрд╣реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЫрд╡рд┐ - рдХреНрд▓рд╕реНрдЯрд░ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХреЗрдВрджреНрд░, рдЫрд╡рд┐ рдХреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░ k, рдФрд░ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рдореВрд╣ рд╣реИ рдЫрд╡рд┐ рдХреНрд▓рд╕реНрдЯрд░ k рдХрд╛ ith рддрддреНрд╡ рд╣реИред

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

рдореИрдЯреНрд░рд┐рдХреНрд╕


рдкрд╣рд▓реЗ, рдЖрдЗрдП рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдФрд░ рдХрдИ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

public interface IMetrics<T> { double Calculate(T[] v1, T[] v2); T[] GetCentroid(IList<T[]> data); } 


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

рдЕрдм рд╣рдо рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рд░рд▓ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдХреНрд▓рд╕реНрдЯрд░реЙрдпрдб рд╕рд░реНрдЪ рдлрдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

 public abstract class MetricsBase<T> : IMetrics<T> { public abstract double Calculate(T[] v1, T[] v2); public virtual T[] GetCentroid(IList<T[]> data) { if (data == null) { throw new ArgumentException("Data is null"); } if (data.Count == 0) { throw new ArgumentException("Data is empty"); } double[][] dist = new double[data.Count][]; for (int i = 0; i < data.Count - 1; i++) { dist[i] = new double[data.Count]; for (int j = i; j < data.Count; j++) { if (i == j) { dist[i][j] = 0; } else { dist[i][j] = Math.Pow(Calculate(data[i], data[j]), 2); if (dist[j] == null) { dist[j] = new double[data.Count]; } dist[j][i] = dist[i][j]; } } } double minSum = Double.PositiveInfinity; int bestIdx = -1; for (int i = 0; i < data.Count; i++) { double dSum = 0; for (int j = 0; j < data.Count; j++) { dSum += dist[i][j]; } if (dSum < minSum) { minSum = dSum; bestIdx = i; } } return data[bestIdx]; } } 


рдЧреЗрдЯрдХреЙрдиреНрд╕реНрдЯрд╛рдпрд░ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдПрдХ рдРрд╕реЗ рддрддреНрд╡ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╢реЗрд╖ рдбреЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рджреВрд░реА рдХрд╛ рдпреЛрдЧ рдиреНрдпреВрдирддрдо рд╣реЛред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рд╕рдордорд┐рдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╣реЛрддреА рд╣реИред рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: d (x, x) = 0 рдФрд░ d (x, y) = d (y, x), рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд░реНрдг рдХреЛ рднрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореБрдЦреНрдп рд╡рд┐рдХрд░реНрдг рдХреЗ рд╕рд╛рде рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдиреНрдпреВрдирддрдо рдореВрд▓реНрдп рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП рдорд╣рд╛рд▓рдиреЛрдмрд┐рд╕ рдФрд░ рдпреВрдХреНрд▓рд┐рдб рдХреА рджреВрд░рд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рддреЗ рд╣реИрдВред

 internal class MahalanobisDistanse : MetricsBase<double> { private double[][] _covMatrixInv = null; internal MahalanobisDistanse(double[][] covMatrix, bool isInversed) { if (!isInversed) { _covMatrixInv = LinearAlgebra.InverseMatrixGJ(covMatrix); } else { _covMatrixInv = covMatrix; } } public override double Calculate(double[] v1, double[] v2) { if (v1.Length != v2.Length) { throw new ArgumentException("Vectors dimensions are not same"); } if (v1.Length == 0 || v2.Length == 0) { throw new ArgumentException("Vector dimension can't be 0"); } if (v1.Length != _covMatrixInv.Length) { throw new ArgumentException("CovMatrix and vectors have different size"); } double[] delta = new double[v1.Length]; for (int i = 0; i < v1.Length; i++) { delta[i] = v1[i] - v2[i]; } double[] deltaS = new double[v1.Length]; for (int i = 0; i < deltaS.Length; i++) { deltaS[i] = 0; for (int j = 0; j < v1.Length; j++) { deltaS[i] += delta[j]*_covMatrixInv[j][i]; } } double d = 0; for (int i = 0; i < v1.Length; i++) { d += deltaS[i]*delta[i]; } d = Math.Sqrt(d); return d; } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЧреЗрдЯрдХреЙрд╕реНрдЯреЗрд░реЙрдЗрдб рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдврд╛рд▓ рд╡рдВрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

 internal class EuclideanDistance : MetricsBase<double> { internal EuclideanDistance() { } #region IMetrics Members public override double Calculate(double[] v1, double[] v2) { if (v1.Length != v2.Length) { throw new ArgumentException("Vectors dimensions are not same"); } if (v1.Length == 0 || v2.Length == 0) { throw new ArgumentException("Vector dimension can't be 0"); } double d = 0; for (int i = 0; i < v1.Length; i++) { d += (v1[i] - v2[i]) * (v1[i] - v2[i]); } return Math.Sqrt(d); } public override double[] GetCentroid(IList<double[]> data) { if (data.Count == 0) { throw new ArgumentException("Data is empty"); } double[] mean = new double[data.First().Length]; for (int i = 0; i < mean.Length; i++) { mean[i] = 0; } foreach (double[] item in data) { for (int i = 0; i < item.Length; i++) { mean[i] += item[i]; } } for (int i = 0; i < mean.Length; i++) { mean[i] = mean[i]/data.Count; } return mean; } #endregion } 


рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЧреЗрдЯреНрд╕реЛрдПрд░реЙрдЗрдб рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдЯреАрдХ рд╕реЗрдВрдЯреНрд░реЛрдЗрдб рдореВрд▓реНрдп рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рд╕рдордиреНрд╡рдп рдХреЗ рдФрд╕рдд рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ



рдЪрд▓реЛ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдлрд┐рд░, рдкрд╣рд▓реЗ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВред

 public interface IClusterization<T> { ClusterizationResult<T> MakeClusterization(IList<DataItem<T>> data); } 


рдЬрд╣рд╛рдВ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

 public class ClusterizationResult<T> { public IList<T[]> Centroids { get; set; } public IDictionary<T[], IList<DataItem<T>>> Clusterization { get; set; } public double Cost { get; set; } } 


рдФрд░ рдбреЗрдЯрд╛ рддрддреНрд╡ рд╡рд░реНрдЧ:

 public class DataItem<T> { private T[] _input = null; private T[] _output = null; public DataItem(T[] input, T[] output) { _input = input; _output = output; } public T[] Input { get { return _input; } } public T[] Output { get { return _output; } set { _output = value; } } } 


рд╣рдо рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╢рд┐рдХреНрд╖рдХ рд░рд╣рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП k- рд╕рд╛рдзрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

 internal class KMeans : IClusterization<double> 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЗрдирдкреБрдЯ рд╣реИ (рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛рдЯ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рд╢реБрд░реБрдЖрддреА рд╕реЗрдВрдЯреНрд░реЛрдЗрдбреНрд╕ рдХреЛ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рди рди рдХрд░реЗрдВ, рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд┐рдВрджреБ рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдЗрд╕реЗ рдпрд╣рд╛рдВ рдмрд░реНрджрд╛рд╢реНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо IClusterization):
clusterCount - IMetrics metrics -
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдХрд╛ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ IClusterization):
clusterCount - IMetrics metrics -
IClusterization):
clusterCount - IMetrics metrics -

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


All Articles