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

рдФрд░ рднреМрдЧреЛрд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдЯреАрдХ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

рдпреЛрдЬрдирд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪрд┐рдХрдиреА рдФрд░ рдПрдХрд╛рдЧреНрд░ рдирд╣реАрдВ рд╣реИрдВ, рд░реЗрдЦрд╛рдПрдВ рдпреЛрдЬрдирд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЭреБрдХрддреА рд╣реИрдВ, рдФрд░ рд╢рд╣рд░ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХрд╛ рдШрдирддреНрд╡ рдЗрддрдирд╛ рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдпреЛрдЬрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред
рдФрд░ рдпрджреНрдпрдкрд┐ рджреВрд╕рд░реА рдЫрд╡рд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рддреА рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореЗрдЯреНрд░реЛ рдореЗрдВ рдорд╛рд░реНрдЧ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдФрд░ рдлрд┐рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛: "рдЕрдЧрд░ рдореЗрдЯреНрд░реЛ рдХреЛ рдПрдХ рд╕реНрдЯреЗрд╢рди рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдЯреЗрд╢рди рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рддреЛ рдореЗрдЯреНрд░реЛ рдХреИрд╕реА рджрд┐рдЦреЗрдЧреА?" рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдЯреЗрд╢рди рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдЯреЗрд╢рди рдкрд░ рдЬрд▓реНрджреА рд╕реЗ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рд╡реЗ рдЖрд░реЗрдЦ рдкрд░ рдкрд╛рд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рджреНрд╡рд┐-рдЖрдпрд╛рдореА рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдРрд╕реА рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдореЗрдЯреНрд░реЛ рдЧреНрд░рд╛рдл рдХреА рдЬрдЯрд┐рд▓ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЗ рдХрд╛рд░рдг рдпрд╛рддреНрд░рд╛ рдХреЗ рд╕рдордп рдХреЛ рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рдмрд░рд╛рдмрд░ рдХрд░ рджреЗрдЧреАред
рдПрдХ рдХреВрдмрдбрд╝ рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЙрдЪреНрдЪ рдЖрдпрд╛рдо рд╡рд╛рд▓реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдПрдХ рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрднрд╡ рд╣реИ (рдКрдкрд░реА рдЕрдиреБрдорд╛рди n-1 рд╣реИ, рдЬрд╣рд╛рдВ n рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ)ред рдХрдо рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рдЖрдпрд╛рдореЛрдВ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреА рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд▓рдЧрднрдЧ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╛рддреНрд░рд╛ рдХреЗ рд╕рдордп рдореЗрдВ рдореЗрдЯреНрд░реЛ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдХрд╛рд░реНрдп рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдХреВрд▓рди рдХрд╛рд░реНрдп рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рд╕реНрдЯреЗрд╢рдиреЛрдВ (рдПрдХреНрд╕, рд╡рд╛рдИ, рдЬреЗрдб) рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдЬреЛрдбрд╝реА рд╡рд╛рдЗрдЬ рдЯрд╛рдЗрдо (рджреВрд░реА) рдХрд╛ рдПрдХ рд▓рдХреНрд╖реНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рджрд┐рдП рдЧрдП рд╕реЗрдЯ рдХреЗ "рдЧрд▓рддрддрд╛" рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреЗрд╢рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдврд╛рд▓ рдореВрд▓ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХрд░реЗрдВред рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рджреВрд░рд┐рдпреЛрдВ рдХреЗ рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рдХрд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдареАрдХ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдмрдЪреА рд╣реБрдИ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдореЙрд╕реНрдХреЛ рдореЗрдЯреНрд░реЛ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдЯреЗрд╢рди рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░ рдпрд╛рддреНрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╕рдордп рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпреИрдВрдбреЗрдХреНрд╕ рдореЗрдЯреНрд░реЛ рдПрдкреАрдЖрдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ рд╣рдЯрд╛рдПрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдкреАрдЖрдИ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрд╛рд░ рджреЗрдЦреЗрдВ (рдореЗрдЯреНрд░реЛ рдореЗрдВ 268 рд╕реНрдЯреЗрд╢рди рд╣реИрдВ рдФрд░ рд╕рдордп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ 268 * 268 = 71824 рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдпреИрдВрдбреЗрдХреНрд╕ рдореЗрдЯреНрд░реЛ рдХреЗ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рд╕рд░реНрд╡рд░ рддрдХ рдХреЛрдИ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреАрдХреЗ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдорд┐рд▓рд╛ред рдореЗрдЯреНрд░реЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрдкрддреНрддрд┐ / рдореЗрдЯреНрд░реЛрдХрд┐рдЯ / рдПрдкреАрдХреЗ рдЖрд░реНрдХрд╛рдЗрд╡ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬреЗрдПрд╕рдПрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд╕рднреА рдбреЗрдЯрд╛ рд╕реНрд╡-рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред Meta.json рдореЗрдВ рдЙрди рд╢рд╣рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдЬрд┐рдирдХреА рдпреЛрдЬрдирд╛рдПрдВ рдЖрд╡реЗрджрди рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЗрди рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдЖрдИрдбреА рднреАред
{ "id": "sc77792237", "name": { "en": "Nizhny Novgorod", "ru": " ", "tr": "Nizhny Novgorod", "uk": "╤Ц " }, "size": { "packed": 30300, "unpacked": 145408 }, "tags": [ "published" ], "aliases": [ "nizhny-novgorod" ], "logoUrl": "https://avatars.mds.yandex.net/get-bunker/135516/f2f0e33d8def90c56c189cfb57a8e6403b5a441c/orig", "version": "2c27fe1", "geoRegion": { "delta": { "lat": 0.168291, "lon": 0.219727 }, "center": { "lat": 56.326635, "lon": 43.992153 } }, "countryCode": "RU", "defaultAlias": "nizhny-novgorod" }
рдпреЛрдЬрдирд╛ рдХреА рдЖрдИрдбреА рд╕реЗ, рд╣рдореЗрдВ рдореЙрд╕реНрдХреЛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд JSON рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдорд┐рд▓рддрд╛ рд╣реИред
Data.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЗрдЯреНрд░реЛ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдиреЛрдбреНрд╕ рдХреЗ рдирд╛рдо, рдиреЛрдб рдЖрдИрдбреА, рдиреЛрдбреНрд╕ рдХреЗ рднреМрдЧреЛрд▓рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдПрдХ рд╕реНрдЯреЗрд╢рди рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдЯреЗрд╢рди рдкрд░ рд╕рдВрдХреНрд░рдордг (рдЖрдИрдбреА, рд╕рдВрдХреНрд░рдордг рд╕рдордп, рд╕рдВрдХреНрд░рдордг рдХрд╛ рдкреНрд░рдХрд╛рд░ - рдбреНрд░рд╛рдЗрд╡рд┐рдВрдЧ рдпрд╛ рдЪрд▓рдирд╛, рд╕рдбрд╝рдХ рдкрд░ рдпрд╛ рдирд╣реАрдВ, рд╕рдордп рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рдо рд╕реЗрдХрдВрдб рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ) рдФрд░ рд╕реНрдЯреЗрд╢рди рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдФрд░ рдирд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рднреАред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рд╣рдорд╛рд░реЗ рд╕рд░реНрдХрд┐рдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред
рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:
import numpy as np import json import codecs import networkx as nx import matplotlib.pyplot as plt import pandas as pd import itertools import keras import keras.backend as K from mpl_toolkits.mplot3d import Axes3D from mpl_toolkits.mplot3d.proj3d import proj_transform from matplotlib.text import Annotation import pickle
рдЕрдЬрдЧрд░ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдФрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреЛрдВрд╕ рдкреНрд░рд╛рд░реВрдк рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдореЗрдЯреНрд░реЛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЬреЛрдВрд╕ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред
names = json.loads(codecs.open( "l10n.json", "r", "utf_8_sig" ).read() ) graph = json.loads(codecs.open( "data.json", "r", "utf_8_sig" ).read() )
рд╣рдо рдПрдХ рдРрд╕рд╛ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЧреНрд░рд╛рдлрд╝ рдФрд░ рд╕реНрдЯреЗрд╢рди рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рдореИрдк рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЛ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдиреЛрдбреНрд╕)
рд╕рд╛рде рд╣реА, рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рднреМрдЧреЛрд▓рд┐рдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдиреЛрдбреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗ (0-1 рдХреА рд╕реАрдорд╛ рддрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд)
nodeStdict={} for stop in graph['stops']['items']: nodeStdict[stop['nodeId']]=stop['stationId'] coordDict={} for node in graph['nodes']['items']: coordDict[node['id']]=(node['attributes']['geoPoint']['lon'],node['attributes']['geoPoint']['lat']) lats=[] longs=[] for value in coordDict.values(): lats.append(value[1]) longs.append(value[0]) for k,v in coordDict.items(): coordDict[k]=((v[0]-np.min(longs))/(np.max(longs)-np.min(longs)),(v[1]-np.min(lats))/(np.max(lats)-np.min(lats)))
рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдЯреНрд░реЛ рдЧреНрд░рд╛рдл рдмрдирд╛рдПрдВред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╡рдЬрди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡рдЬрди рдпрд╛рддреНрд░рд╛ рд╕рдордп рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рд╣рдо рдЙрди рдиреЛрдбреНрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ рдЬреЛ рд╕реНрдЯреЗрд╢рди рдирд╣реАрдВ рд╣реИрдВ (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпреЗ рдореЗрдЯреНрд░реЛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдпреИрдВрдбреЗрдХреНрд╕ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛), рдПрдХ рдиреЛрдб рдЖрдИрдбреА рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдПрдВ - рд░реВрд╕реА рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд╛рдо
G=nx.Graph() for node in graph['nodes']['items']: G.add_node(node['id'])
рд╣рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХрд┐рд╕ рд╢рд╛рдЦрд╛ (рдХрд┐рд╕ рд╢рд╛рдЦрд╛ рдЖрдИрдбреА) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ (рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЖрд░реЗрдЦ рдореЗрдВ рдореЗрдЯреНрд░реЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд░рдВрдЧрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛)
def getlines(graph, G): nodetoline={} id_from={} id_to={} for lk in graph['tracks']['items']: id_from[lk['id']]=lk['fromNodeId'] id_to[lk['id']]=lk['toNodeId'] for line in graph['linesToTracks']['items']: if line['trackId'] in id_from.keys(): nodetoline[id_from[line['trackId']]]=line['lineId'] nodetoline[id_to[line['trackId']]]=line['lineId'] return nodetoline lines=getlines(graph,G)
рдиреЗрдЯрд╡рд░реНрдХрдПрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ nx.shortest_path_length (рдЬреА, рдЖрдИрдбреА 1, рдЖрдИрдбреА 2, рд╡рдЬрди = 'рд▓рдВрдмрд╛рдИ') рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдиреЛрдб рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдкрде рд▓рдВрдмрд╛рдИ рдЦреЛрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА рдкреВрд░реА рдХрд░ рд▓реА рд╣реИред рдЕрдЧрд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрдирдкреБрдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рд╕реНрдЯреЗрд╢рди рд╕рдордиреНрд╡рдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (3x268) рдХрд╛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИред рдЗрд╕ рд╕рдордиреНрд╡рдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЖрдпрд╛рдо 268 рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╡рди-рд╣реЙрдЯ рд╡реЗрдХреНрдЯрд░ (рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЬрд╣рд╛рдВ 0 рд╣рд░ рдЬрдЧрд╣ n рдХреА рд╕рдордиреНрд╡рд┐рдд рдЗрдХрд╛рдИ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рд╣реИ, рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛, рд╕реНрдЯреЗрд╢рди n рдХреЗ рдЕрдиреБрд░реВрдк 3 рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреЗрдЧрд╛ред рдпрджрд┐ рд╣рдо рдПрдХ-рдЧрд░реНрдо рд╡реИрдХреНрдЯрд░ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рджреЛ рддреНрд░рд┐рднреБрдЬ рдорд┐рд▓рддреЗ рд╣реИрдВред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╕реЗ рдЖрдк рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдмреАрдЪ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рд╣рдо рдХреБрдЫ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЛ рджреЗрддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдо рдЙрдирдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдЬрдм рд╣рдордиреЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдкрд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЧреНрд░рд╛рдл рдкрд░ рджреВрд░реА рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
myIDs=list(G.nodes()) listofinputs1=[] listofinputs2=[] listofoutputs=[] for pair in itertools.product(G.nodes(), repeat=2): vec1=np.zeros((len(myIDs))) vec2=np.zeros((len(myIDs))) vec1[myIDs.index(pair[0])]=1 vec2[myIDs.index(pair[1])]=1 listofinputs1.append(vec1) listofinputs2.append(vec2)
рд╣рдо рдврд╛рд▓ рд╡рдВрд╢ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреЗрд╢рди рд╕рдордиреНрд╡рдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВред
рдЕрдЧрд░ рд╣рдо рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЗрд░рд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:
np.random.seed(0) initweightmatrix=np.zeros((len(myIDs),3)) for i in range(len(myIDs)): initweightmatrix[i,:2]=coordDict[myIDs[i]] initweightmatrix[i,2]=np.random.randn()*0.001 def euclidean_distance(vects): x, y = vects sum_square = K.sum(K.square(x - y), axis=1, keepdims=True) return K.sqrt(K.maximum(sum_square, K.epsilon())) def eucl_dist_output_shape(shapes): shape1, shape2 = shapes return (shape1[0], 1) inp1=keras.layers.Input((len(myIDs),)) inp2=keras.layers.Input((len(myIDs),)) layer1=keras.layers.Dense(3,use_bias=None, activation=None) x1=layer1(inp1) x2=layer1(inp2) x=keras.layers.Lambda(euclidean_distance, output_shape=eucl_dist_output_shape)([x1, x2]) out=keras.layers.Dense(1,use_bias=None,activation=None)(x) model=keras.Model(inputs=[inp1,inp2],outputs=out) model.layers[2].set_weights([initweightmatrix]) model.layers[2].trainable=False model.compile(optimizer=keras.optimizers.Adam(lr=0.01), loss='mse')
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрдЧреЛрд▓рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЗрдпрд░ 1 рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕реНрдерд╛рдиреАрдп рдиреНрдпреВрдирддрдо рдореЗрдВ рди рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдо рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рд╡рд╛рд▓реЗ рддреАрд╕рд░реЗ рдХреЛ рд╕рдордиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдпрджрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирдХреНрд╢рд╛ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдкрд╛рдЯ рд╣реИ, рддреЛ рдХрд┐рд╕реА рднреА рд╕реНрдЯреЗрд╢рди рдХреЗ рдКрдкрд░ рдпрд╛ рдиреАрдЪреЗ рдХреА рд╢рд┐рдлреНрдЯ рд╕рдорд╛рди рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ 0 рд╣реИ рдФрд░ z рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХрд╛ рдЕрдВрддрд┐рдо рддрддреНрд╡ (рдбреЗрдВрд╕ (1)) рдЯрд╛рдЗрдорд▓рд╛рдЗрди рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреАрдо рдХреЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╣рдо рджреВрд░реА рдХреЛ рдШрдВрдЯреЛрдВ рдореЗрдВ рдорд╛рдкреЗрдВрдЧреЗ, рд╕реЗрдХрдВрдб рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд░реА рдХреЗ рдЖрджреЗрд╢ рд▓рдЧрднрдЧ 1 рдШрдВрдЯреЗ рд╣реИрдВ, рдФрд░ рдореЙрдбрд▓ рдХреЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рднреА рдорд╛рди (рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛, рднрд╛рд░, рд▓рдХреНрд╖реНрдп) рдкрд░рд┐рдорд╛рдг рдХреЗ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдХреНрд░рдо рд╣реИрдВред рдпрджрд┐ рдпреЗ рдорд╛рди 1 рдХреЗ рдХрд░реАрдм рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЪрд░рдг рдорд╛рди (0.001-0.01) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓рд╛рдЗрди рдореЙрдбрд▓.рд▓реЗрдпрд░ [2] .trainable = рдЧрд▓рдд рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд┐рд╡рд┐рдз рд╣реИ - рдкреИрдорд╛рдирд╛ред рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХреЗ рдкреИрдорд╛рдиреЗ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЕрдирдлреНрд░реАрдЬ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдирдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ:
hist=model.fit([listofinputs1,listofinputs2],listofoutputs,batch_size=71824,epochs=200) model.layers[2].trainable=True model.layers[-1].trainable=False model.compile(optimizer=keras.optimizers.Adam(lr=0.01), loss='mse') hist2=model.fit([listofinputs1,listofinputs2],listofoutputs,batch_size=71824,epochs=200)
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕рднреА рджреВрд░реА рдкрд░ рдПрдХ рд╕рд╛рде рд╕рднреА рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЛ рдЦрд┐рд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░рд╛ рдЕрдиреБрдХреВрд▓рди рдкреВрд░реНрдг рдмреИрдЪ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдбрд┐рд╕реЗрдВрдЯ (рд╕рднреА рдбреЗрдЯрд╛ рдкрд░ рдПрдХ рдХрджрдо) рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреБрдХрд╕рд╛рди рдХрд╛ рдХрд╛рд░реНрдп рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди рд╣реИ, рдФрд░ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдореЗрдВ рдпрд╣ 0.015 рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдЬреЛрдбрд╝реА рдХреЗ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП 1 рдорд┐рдирдЯ рд╕реЗ рдХрдо рдХрд╛ рдорд╛рдирдХ рд╡рд┐рдЪрд▓рдиред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдореА рдпреЛрдЬрдирд╛ рдЖрдкрдХреЛ рдЙрд╕ рджреВрд░реА рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ + -1 рдорд┐рдирдЯ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдореЗрдВ рджреВрд░реА рд╕реЗ рдПрдХ рд╕реНрдЯреЗрд╢рди рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдЯреЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ!
рд▓реЗрдХрд┐рди рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рд░реНрдХрд┐рдЯ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ!
рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд░рдВрдЧ рдХреЛрдбрд┐рдВрдЧ рд▓реЗрдВ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ 3 рдбреА рдЫрд╡рд┐ рдмрдирд╛рдПрдВ (рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдПрдХ рд╕реБрдВрджрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб
рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛
рдЧрдпрд╛ рд╣реИ ):
class Annotation3D(Annotation): '''Annotate the point xyz with text s''' def __init__(self, s, xyz, *args, **kwargs): Annotation.__init__(self,s, xy=(0,0), *args, **kwargs) self._verts3d = xyz def draw(self, renderer): xs3d, ys3d, zs3d = self._verts3d xs, ys, zs = proj_transform(xs3d, ys3d, zs3d, renderer.M) self.xy=(xs,ys) Annotation.draw(self, renderer) def annotate3D(ax, s, *args, **kwargs): '''add anotation text s to to Axes3d ax''' tag = Annotation3D(s, *args, **kwargs) ax.add_artist(tag) fincoords=model.layers[2].get_weights() ccode={} for obj in graph['services']['items']: ccode[obj['id']]=('\#'+obj['attributes']['color'])[1:] xn = fincoords[0][:,0] yn = fincoords[0][:,1] zn = fincoords[0][:,2] l=[labels[idi] for idi in myIDs] colors=[ccode[lines[idi]] for idi in myIDs] xyzn = zip(xn, yn, zn) fig = plt.figure() ax = fig.gca(projection='3d') ax.scatter(xn,yn,zn, c=colors, marker='o') for j, xyz_ in enumerate(xyzn): annotate3D(ax, s=labels[myIDs[j]], xyz=xyz_, fontsize=9, xytext=(-3,3), textcoords='offset points', ha='right',va='bottom') plt.show()
рдЪреВрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ 3 рдбреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдереАрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ gif рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ:

рдкрд╛рда рдХреЗ рдмрд┐рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдФрд░ рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддрд╛ рд╣реИ:
xn = fincoords[0][:,0] yn = fincoords[0][:,1] zn = fincoords[0][:,2] l=[labels[idi] for idi in myIDs] colors=[ccode[lines[idi]] for idi in myIDs] xyzn = zip(xn, yn, zn) fig = plt.figure() ax = fig.gca(projection='3d') ax.scatter(xn,yn,zn, c=colors, marker='o') plt.show()

UPD: рд╡рд╛рдВрдЫрд┐рдд рд░рдВрдЧ рдХреА рдореЗрдЯреНрд░реЛ рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдПрдХ gif рдмрдирд╛рдПрдВред рдХрд╛рд▓реА рд░реЗрдЦрд╛рдПрдБ - рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг:
myedges=[(myIDs.index(edge[0]),myIDs.index(edge[1]))for edge in G.edges] xn = fincoords[0][:,0] yn = fincoords[0][:,1] zn = fincoords[0][:,2] l=[labels[idi] for idi in myIDs] c=[ccode[lines[idi]] for idi in myIDs] fig = plt.figure() ax = fig.gca(projection='3d') ax.scatter(x,y,z, c=c, marker='o',s=25) for edge in myedges: col='black' if c[edge[0]]==c[edge[1]]: col=c[edge[0]] ax.plot3D([x[edge[0]], x[edge[1]]], [y[edge[0]], y[edge[1]]], [z[edge[0]], z[edge[1]]], col) ims = [] def rotate(angle): ax.view_init(azim=angle) rot_animation = animation.FuncAnimation(fig, rotate, frames=np.arange(0, 362, 3), interval=70) rot_animation.save('rotation2.gif', dpi=80, writer=matplotlib.animation.PillowWriter(80))

рдЗрд╕ рдпреЛрдЬрдирд╛ рд╕реЗ, рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдЗрддрдиреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВред рдХреБрдЫ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд░реЗ, рдиреАрд▓реЗ рдпрд╛ рдмреИрдВрдЧрдиреА, MCC (рдЧреБрд▓рд╛рдмреА рдЕрдВрдЧреВрдареА) рдЕрд╕рд╣рдЬ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреЗ рдХрд╛рд░рдг рд▓рдЧрднрдЧ рдмреЗрдХрд╛рд░ рд╣реИ, рдЬреЛ рдЗрди рд╢рд╛рдЦрд╛рдУрдВ рд╕реЗ рдЕрдВрдЧреВрдареА рдХреА рджреВрд░реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рдорд╛рд░реНрдЧ - рдПрдХ рд╕рд╛рдВрдкреНрд░рджрд╛рдпрд┐рдХ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╕реЗ рдПрдХ рддрдбрд╝рдХ рдпрд╛ рд╢реБрдХреНрд░рд╡рд╛рд░ рд░рд╛рдЬрдорд╛рд░реНрдЧ (рд▓рд╛рд▓ рдФрд░ рдЧреБрд▓рд╛рдмреА / рдиреАрд▓реЗ рдШреЛрдбрд╝реЛрдВ) рдХреЗ рд▓рд┐рдП, рд▓рдВрдмреЗ рдорд╛рд░реНрдЧ рднреА рдЕрд▓реНрдорд╛-рдЕрддрд╛ рдХрд╣рд╛рдиреА рдФрд░ рдмреНрдпреВрди рдЕрд▓рд▓реЗ-рдиреЗрдХреНрд░рд╛рд╕реЛрд╡реНрдХрд╛ рд╣реИрдВред рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдорд╛рд╕реНрдХреЛ рдХреЗ рдЙрддреНрддрд░ рдореЗрдВ рдЧреНрд░реЗ рдФрд░ рд╣рд▓реНрдХреЗ рд╣рд░реЗ рд░рдВрдЧ рдХреА рд╢рд╛рдЦрд╛рдУрдВ рдХрд╛ рдЖрдВрд╢рд┐рдХ рджреЛрд╣рд░рд╛рд╡ рд╣реИ - рд╡реЗ рдЖрд░реЗрдЦ рдореЗрдВ рдкрд╛рд╕ рд╣реИрдВред рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдирдИ рд▓рд╛рдЗрдиреЗрдВ (рдбрдмреНрд▓реНрдпреВрдбреАрд╕реА, рдмреАрдХреЗрдПрд▓) рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреМрди рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд░реЗрдЧрд╛ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдкреНрд░реЗрд░рдгрд╛ рдФрд░ рдпрд╛рддреНрд░рд╛ рдХреА рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдРрд╕реА рдпреЛрдЬрдирд╛рдПрдВ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдХрд░рдг рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
PS 3D рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, 2D рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд▓реЗрдХрд┐рди 2 рдбреА рдпреЛрдЬрдирд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреВрд░реА рдХреА рдЗрддрдиреА рд╕рдЯреАрдХрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
