{"id":350350,"date":"2023-07-17T15:01:06","date_gmt":"2023-07-17T15:01:06","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=350350"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=350350","title":{"rendered":"<span>\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f: \u043f\u0440\u044f\u043c\u0430\u044f, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043d\u0430 \u0442\u043e\u0447\u043a\u0438 2 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b93\/a6e\/bba\/b93a6ebba4eb25246c8f26c6aa595933.PNG\" alt=\"\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b\" title=\"\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b\" width=\"1398\" height=\"1391\"\/><\/p>\n<div><figcaption>\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u0443\u044e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0431\u044b\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u0443\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0435 \u2014 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Python \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 tkinter.<\/p>\n<h2>\u041a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e?<\/h2>\n<p>\u041f\u0443\u0441\u0442\u044c \u0438\u0441\u043a\u043e\u043c\u0430\u044f \u043f\u0440\u044f\u043c\u0430\u044f \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w_1x+w_2y+b=0\" alt=\"w_1x+w_2y+b=0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/90f\/a01\/c64\/90fa01c64a48189983078f4a9ab25336.svg\" width=\"156\" height=\"20\"\/>. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w_1, w_2, b\" alt=\"w_1, w_2, b\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/845\/2a5\/1d1\/8452a51d17689b3425e71626c3750b84.svg\" width=\"71\" height=\"20\"\/>. \u0412 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u0443\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (\u0434\u043b\u044f \u043d\u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043e\u0437\u0434\u043d\u0435\u0435, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"1\" alt=\"1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ae8\/616\/8a9\/ae86168a920730d70257b149a082a92e.svg\" width=\"10\" height=\"16\"\/>, \u0430 \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0439 \u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u043b\u0443\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u2014 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"-1\" alt=\"-1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fe4\/c6a\/162\/fe4c6a162ba83813763ead6c134e0e00.svg\" width=\"25\" height=\"17\"\/>)<\/p>\n<p>\u0412\u0432\u0435\u0434\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p(x, y)=w_1x+w_2y+b\" alt=\"p(x, y)=w_1x+w_2y+b\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6e1\/551\/c4f\/6e1551c4f134eda743dff455bfafe8ce.svg\" width=\"201\" height=\"22\"\/>.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0435\u0441\u043b\u0438 <img class=\"formula inline\" source=\"p(x, y) > 0&#8243; alt=&#187;p(x, y) > 0&#8243; src=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4be\/650\/afb\/4be650afb3b1719642e63dbc1f57a6ad.svg&#187; width=&#187;90&#8243; height=&#187;22&#8243;\/>, \u0442\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"1\" alt=\"1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/731\/242\/1ed\/7312421ed81bd1cfa0d1a5183809c80c.svg\" width=\"10\" height=\"16\"\/>. \u0418\u043d\u0430\u0447\u0435 \u2014 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"-1\" alt=\"-1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ce\/0ea\/722\/1ce0ea722feb10b3b4198251acd0ece0.svg\" width=\"25\" height=\"17\"\/>.<\/p>\n<p>\u0412\u0432\u0435\u0434\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <img class=\"formula inline\" source=\"f(x)=\\begin{equation*}\\begin{cases}1, x > 0; \\\\ -1, x \\le 0 \\end{cases}\\end{equation*}&#187; alt=&#187;f(x)=\\begin{equation*}\\begin{cases}1, x > 0; \\\\ -1, x \\le 0 \\end{cases}\\end{equation*}&#187; src=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c0b\/ff4\/7bf\/c0bff47bf95b997f14818aaaff414f43.svg&#187; width=&#187;163&#8243; height=&#187;49&#8243;\/>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p\" alt=\"p\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc0\/c75\/bf4\/fc0c75bf43a1af3437b4bf17349cd322.svg\" width=\"10\" height=\"15\"\/>.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u0439\u0442\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w_1, w_2, b\" alt=\"w_1, w_2, b\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5ea\/12f\/a39\/5ea12fa3969bb9fde50816d8f7fe01cf.svg\" width=\"71\" height=\"20\"\/>.<\/p>\n<h2>\u041a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/h2>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w_1=w_2=1,\\ b=0\" alt=\"w_1=w_2=1,\\ b=0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a1f\/5a8\/825\/a1f5a882542002e7c3292022d78b30eb.svg\" width=\"163\" height=\"20\"\/>. <\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443. \u0423 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\u2116i\" alt=\"\u2116i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/188\/531\/084\/1885310848b9ad1a557e2b6408748f61.svg\" width=\"24\" height=\"24\"\/> \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"x_i, y_i, p_i\" alt=\"x_i, y_i, p_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c33\/556\/b7b\/c33556b7b00f151183c1a67326e4d8ad.svg\" width=\"67\" height=\"15\"\/>\u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043a\u043b\u0430\u0441\u0441, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f. <\/p>\n<\/li>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. <\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"f(p(x_i, y_i)) = p_i\" alt=\"f(p(x_i, y_i)) = p_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5bf\/7ff\/b09\/5bf7ffb09c3d044014134740316e9108.svg\" width=\"135\" height=\"22\"\/>, \u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"f(p(x_i, y_i)) \\ne p_i\" alt=\"f(p(x_i, y_i)) \\ne p_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3be\/063\/f72\/3be063f72e70dbb3e241d32238963e55.svg\" width=\"135\" height=\"22\"\/>, \u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0435\u0441\u0430 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"b\" alt=\"b\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec4\/c55\/876\/ec4c55876d5172f90c10a28837bf84f5.svg\" width=\"8\" height=\"17\"\/>) \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w_j'=w_j+\\lambda n_j (y_i - y_i')\" alt=\"w_j'=w_j+\\lambda n_j (y_i - y_i')\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/061\/16a\/25d\/06116a25dc238b90f0808eafb434dcb1.svg\" width=\"193\" height=\"26\"\/>, \u0433\u0434\u0435:<\/p>\n<ol>\n<li>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\lambda\" alt=\"\\lambda\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f8\/456\/d46\/4f8456d46d6ae19a2627a085f3159148.svg\" width=\"11\" height=\"17\"\/>\u2014 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b)<\/p>\n<\/li>\n<li>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"n_j\" alt=\"n_j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bbb\/173\/bd5\/bbb173bd5496cc416fc838ddbccec124.svg\" width=\"19\" height=\"17\"\/>\u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0430\u043a\u0442\u043e\u0440\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\u2116j\" alt=\"\u2116j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3ef\/ea9\/2bb\/3efea92bbc52aa55f010b19d357a7da6.svg\" width=\"25\" height=\"24\"\/>(<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"x_i, y_i\" alt=\"x_i, y_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/775\/463\/594\/7754635947f6db7fc5bcb744c2eda65f.svg\" width=\"42\" height=\"15\"\/>\u0438\u043b\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"1\" alt=\"1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce0\/b92\/cf7\/ce0b92cf735470509a5b4dd077b5b4ce.svg\" width=\"10\" height=\"16\"\/> \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"b\" alt=\"b\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/19f\/114\/37a\/19f11437a180c5bf25011871ac9954e9.svg\" width=\"8\" height=\"17\"\/>)<\/p>\n<\/li>\n<li>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"y_i'\" alt=\"y_i'\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/655\/d24\/94e\/655d2494e321a1409d7c247f51597168.svg\" width=\"16\" height=\"23\"\/>\u2014 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438\u0441\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c, \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0445\u043e\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u0435\u0441\u043e\u0432, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u043e \u0432\u0441\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c.<\/p>\n<\/li>\n<\/ol>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/h2>\n<pre><code class=\"python\">import tkinter as tk   WND_SIZE = 700   # \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430  POINT_SIZE = 5   # \u0420\u0430\u0434\u0438\u0443\u0441 \u0442\u043e\u0447\u0435\u043a TRAIN_EVERY_TIME = False  # \u041e\u0431\u0443\u0447\u0430\u0442\u044c \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438                           # (\u0438\u043b\u0438 \u0436\u0434\u0430\u0442\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u044f Enter)  MAX_STUDY = 1000 # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 LAMBDA = 0.1     # \u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 WND_SIZE x WND_SIZE window = tk.Tk() window.geometry(f\"{WND_SIZE}x{WND_SIZE}\")  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0445\u043e\u043b\u0441\u0442 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u0435 \u043e\u043a\u043d\u043e cs = tk.Canvas(window, width=WND_SIZE, height=WND_SIZE) cs.pack()<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>MAX_STUDY<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>LAMBDA<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438, \u0435\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u044b\u043b \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438<\/h2>\n<pre><code class=\"python\">type_ = [] # \u0422\u043e\u0447\u043a\u0438  # \u0412\u0435\u0441\u0430: w1 = 1 w2 = 1 b = 0<\/code><\/pre>\n<p>\u0422\u043e\u0447\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c: \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u043a\u043b\u0430\u0441\u0441 (1 \u0438\u043b\u0438 -1), \u0432\u0442\u043e\u0440\u043e\u0439 \u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/p>\n<h2>\u0412\u0432\u043e\u0434 \u0442\u043e\u0447\u0435\u043a<\/h2>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u043e\u0447\u043a\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043e\u0442 \u0442\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 tkinter&#8217;\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f19\/40c\/ff4\/f1940cff43fc990aa3c7013f1957f7bd.png\" alt=\"\u0421\u043b\u0435\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u043d\u0430\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f tkinter'\u043e\u043c\" title=\"\u0421\u043b\u0435\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u043d\u0430\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f tkinter'\u043e\u043c\" width=\"1800\" height=\"900\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f19\/40c\/ff4\/f1940cff43fc990aa3c7013f1957f7bd.png\"\/><\/p>\n<div><figcaption>\u0421\u043b\u0435\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u043d\u0430\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f tkinter&#8217;\u043e\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\frac{\\operatorname{WND\\_SIZE}}{2}\" alt=\"\\frac{\\operatorname{WND\\_SIZE}}{2}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31c\/cc2\/690\/31ccc2690aa223bfccdb903323554509.svg\" width=\"108\" height=\"43\"\/> \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0442\u043e\u0447\u0435\u043a \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435 \u0442\u043e\u0447\u0435\u043a \u0438 \u043f\u0440\u044f\u043c\u043e\u0439.<\/p>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u041b\u041a\u041c (\u043b\u0435\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438), \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u041f\u041a\u041c (\u043f\u0440\u0430\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438) \u2014 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e. \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Escape, \u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0438\u0445 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Enter, \u2014 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c 4 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u041b\u041a\u041c, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u041f\u041a\u041c, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Escape \u0438 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Enter (\u0421\u043f\u0430\u0441\u0438\u0431\u043e <a class=\"mention\" href=\"\/users\/ivayan\">@IvaYan<\/a> \u0437\u0430 \u0438\u0434\u0435\u044e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b type1_add \u0438 type2_add \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u0435\u043a)<\/p>\n<pre><code class=\"python\">def add_point(event, class_):     # \u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f \u0438\u0445 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442)     x = event.x - WND_SIZE\/\/2      y = event.y - WND_SIZE\/\/2     # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 class_     # (\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 - \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430)     type_.append([class_, x, y])     # \u041e\u0431\u0443\u0447\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435)     if TRAIN_EVERY_TIME:         train()     # \u0420\u0438\u0441\u0443\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u043d\u043e\u0432\u043e (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435)      # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 redraw \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u043e, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430 \u043f\u0440\u044f\u043c\u0430\u044f. \u042d\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442     # \u043e\u0442 TRAIN_EVERY_TIME     redraw(TRAIN_EVERY_TIME)       def type1_add(event):     add_point(event, -1)   def type2_add(event):     add_point(event, 1)   def clear(_e):     global type_, w1, w2, b     type_ = [] # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438     # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     w1 = 1      w2 = 1     b = 0     redraw() # \u0420\u0438\u0441\u0443\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e   def train_and_draw(_e):     train()     redraw()<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u043a\u0430\u0436\u0435\u043c Tkinter&#8217;\u0443, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0434\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"python\">cs.bind_all(\"&lt;Button-1>\", type1_add) # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u041b\u041a\u041c - \u0432\u044b\u0437\u0432\u0430\u0442\u044c type1_add cs.bind_all(\"&lt;Button-3>\", type2_add) # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u041f\u041a\u041c - \u0432\u044b\u0437\u0432\u0430\u0442\u044c type2_add cs.bind_all(\"&lt;Escape>\", clear) # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Escape - \u0432\u044b\u0437\u0432\u0430\u0442\u044c clear cs.bind_all(\"&lt;Return>\", train_and_draw) # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Enter - \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c<\/code><\/pre>\n<h2>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f train()<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435:<\/p>\n<pre><code class=\"python\">def f(x):     return 1 if x > 0 else -1  def train():     global w1, w2, b     for _ in range(MAX_STUDY): # \u0414\u0435\u043b\u0430\u0435\u043c MAX_STUDY \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f         another_iter = False # \u0424\u043b\u0430\u0433, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u0431\u044b\u043b\u0438 \u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u0435\u0441\u0430         for i in type_: # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438:             predicted = f(w1 * i[1] + w2 * i[2] + b) # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435             if predicted != i[0]: # \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c:                 another_iter = True # \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f                 # \u041f\u0435\u0440\u0435\u0441\u0447\u0435\u0442 \u0432\u0435\u0441\u043e\u0432:                 w1 += LAMBDA * (i[0] - predicted) * i[1]                 w2 += LAMBDA * (i[0] - predicted) * i[2]                 b += LAMBDA * (i[0] - predicted)         if not another_iter: # \u0415\u0441\u043b\u0438 \u0432\u0435\u0441\u0430 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430.             return # \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<h2>\u041f\u043e\u043a\u0430\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u044f redraw()<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<pre><code class=\"python\">def redraw(with_line=True):     cs.delete(\"all\")  # \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0445\u043e\u043b\u0441\u0442     for i in type_:  # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0440\u0443\u0433 \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c POINT_SIZE         cs.create_oval(i[1] - POINT_SIZE + WND_SIZE \/\/ 2, i[2] - POINT_SIZE + WND_SIZE \/\/ 2,                        i[1] + POINT_SIZE + WND_SIZE \/\/ 2, i[2] + POINT_SIZE + WND_SIZE \/\/ 2,                        fill=('red' if i[0] == 1 else 'green'))     if with_line: # \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e, ...         if w1 == 0:             cs.create_line(0, -b \/\/ w2 + WND_SIZE \/\/ 2, WND_SIZE, -b \/\/ w2 + WND_SIZE \/\/ 2)         else:             cs.create_line((-b + w2 * (WND_SIZE \/\/ 2)) \/\/ w1 + WND_SIZE \/\/ 2, 0,                            (-b - w2 * (WND_SIZE \/\/ 2)) \/\/ w1 + WND_SIZE \/\/ 2, WND_SIZE)<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 \u0441 8 \u043f\u043e 12 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:<\/p>\n<p>\u0415\u0441\u043b\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w_1=0\" alt=\"w_1=0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3af\/7f4\/02d\/3af7f402dd4d65cb7fd8cbd7860efc87.svg\" width=\"58\" height=\"18\"\/>, \u0442\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u0433\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c, \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w_2y+b=0\" alt=\"w_2y+b=0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/82a\/e89\/ba2\/82ae89ba2c52d6c3e0a2503c61992b6a.svg\" width=\"99\" height=\"20\"\/>, \u0442.\u0435. <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"y = -\\frac{b}{w_2}\" alt=\"y = -\\frac{b}{w_2}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c6b\/0cf\/0cb\/c6b0cf0cb82f5f41470cbdd582157849.svg\" width=\"80\" height=\"46\"\/> \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"x\" alt=\"x\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0ad\/eee\/96c\/0adeee96cc59456e5ddfbaed4f6a3a24.svg\" width=\"11\" height=\"12\"\/>. <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043b\u0438\u043d\u0438\u044e \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\left(-\\frac{\\operatorname{WND\\_SIZE}}{2}, -\\frac{b}{w_2}\\right)\" alt=\"\\left(-\\frac{\\operatorname{WND\\_SIZE}}{2}, -\\frac{b}{w_2}\\right)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cbf\/b00\/2b3\/cbfb002b3d88e04ea35831a2a978d368.svg\" width=\"205\" height=\"49\"\/>\u0434\u043e \u0442\u043e\u0447\u043a\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\left(\\frac{\\operatorname{WND\\_SIZE}}{2}, -\\frac{b}{w_2}\\right)\" alt=\"\\left(\\frac{\\operatorname{WND\\_SIZE}}{2}, -\\frac{b}{w_2}\\right)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/def\/7cf\/a1b\/def7cfa1b95cf8da6623536040b9b593.svg\" width=\"190\" height=\"49\"\/>. (\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442!)<\/p>\n<p>\u0415\u0441\u043b\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w_1\\ne0\" alt=\"w_1\\ne0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/491\/7cb\/e6f\/4917cbe6f36e5e92c5bea916078aa555.svg\" width=\"58\" height=\"21\"\/>, \u0442\u043e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"x=\\frac{-b-w_2y}{w_1}\" alt=\"x=\\frac{-b-w_2y}{w_1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f65\/115\/480\/f6511548090f019de9eccdc2db4cd714.svg\" width=\"123\" height=\"46\"\/>. \u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0432 \u044d\u0442\u0443 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"y = \\pm\\frac{\\operatorname{WND\\_SIZE}}{2}\" alt=\"y = \\pm\\frac{\\operatorname{WND\\_SIZE}}{2}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/61f\/5a0\/64a\/61f5a064a9313e5532c4271a7c54b062.svg\" width=\"158\" height=\"43\"\/>, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0447\u0442\u043e:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"x_{y=-\\operatorname{WND\\_SIZE}\/2}=\\frac{-b+w_2*\\frac{\\operatorname{WND\\_SIZE}}{2}}{w_1}\" alt=\"x_{y=-\\operatorname{WND\\_SIZE}\/2}=\\frac{-b+w_2*\\frac{\\operatorname{WND\\_SIZE}}{2}}{w_1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d6e\/0db\/7ee\/d6e0db7ee5551c1fa52d45c1eff7674d.svg\" width=\"331\" height=\"54\"\/>, <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"x_{y=\\operatorname{WND\\_SIZE}\/2}=\\frac{-b-w_2*\\frac{\\operatorname{WND\\_SIZE}}{2}}{w_1}\" alt=\"x_{y=\\operatorname{WND\\_SIZE}\/2}=\\frac{-b-w_2*\\frac{\\operatorname{WND\\_SIZE}}{2}}{w_1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/664\/3c4\/865\/6643c48656fba690fccb1c940aaec85a.svg\" width=\"318\" height=\"54\"\/><\/p>\n<p>(\u0432\u044b\u0440\u0430\u0437\u0438\u043b\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"x\" alt=\"x\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/006\/5d6\/b36\/0065d6b366c638b4e690c3cae65dbe42.svg\" width=\"11\" height=\"12\"\/> \u043f\u0440\u0438 2 \u0440\u0430\u0437\u043d\u044b\u0445 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"y\" alt=\"y\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bf9\/e2f\/5f1\/bf9e2f5f1204efc8907c2b0c1ba8a843.svg\" width=\"10\" height=\"15\"\/>). \u0422\u0430\u043a\u0443\u044e \u043b\u0438\u043d\u0438\u044e \u0438 \u0440\u0438\u0441\u0443\u0435\u043c.<\/p>\n<h2>\u041a\u043e\u043d\u0435\u0446 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043e\u043a\u043d\u0430<\/h2>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043d\u0430 \u0445\u043e\u043b\u0441\u0442\u0435 \u043d\u0430\u0448\u0443 \u043f\u0440\u044f\u043c\u0443\u044e \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043e\u043a\u043d\u0430.<\/p>\n<pre><code class=\"python\">redraw(TRAIN_EVERY_TIME) tk.mainloop()<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import tkinter as tk  WND_SIZE = 700  # \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 POINT_SIZE = 5  # \u0420\u0430\u0434\u0438\u0443\u0441 \u0442\u043e\u0447\u0435\u043a TRAIN_EVERY_TIME = False  # \u041e\u0431\u0443\u0447\u0430\u0442\u044c \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u043e\u0447\u043a\u0438  MAX_STUDY = 1000  # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 LAMBDA = 0.1  # \u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 WND_SIZE x WND_SIZE window = tk.Tk() window.geometry(f\"{WND_SIZE}x{WND_SIZE}\")  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0445\u043e\u043b\u0441\u0442 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u0435 \u043e\u043a\u043d\u043e cs = tk.Canvas(window, width=WND_SIZE, height=WND_SIZE) cs.pack()  type_ = []  # \u0422\u043e\u0447\u043a\u0438  # \u0412\u0435\u0441\u0430: w1 = 1 w2 = 1 b = 0   def f(x):     return 1 if x > 0 else -1   def train():     global w1, w2, b     for _ in range(MAX_STUDY):  # \u0414\u0435\u043b\u0430\u0435\u043c MAX_STUDY \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f         another_iter = False  # \u0424\u043b\u0430\u0433, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u0431\u044b\u043b\u0438 \u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u0435\u0441\u0430         for i in type_:  # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438:             predicted = f(w1 * i[1] + w2 * i[2] + b)  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435             if predicted != i[0]:  # \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c:                 another_iter = True  # \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f                 # \u041f\u0435\u0440\u0435\u0441\u0447\u0435\u0442 \u0432\u0435\u0441\u043e\u0432:                 w1 += LAMBDA * (i[0] - predicted) * i[1]                 w2 += LAMBDA * (i[0] - predicted) * i[2]                 b += LAMBDA * (i[0] - predicted)         if not another_iter:  # \u0415\u0441\u043b\u0438 \u0432\u0435\u0441\u0430 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430.             return  # \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435   def redraw(with_line=True):     cs.delete(\"all\")  # \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0445\u043e\u043b\u0441\u0442     for i in type_:  # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0440\u0443\u0433 \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c POINT_SIZE         cs.create_oval(i[1] - POINT_SIZE + WND_SIZE \/\/ 2, i[2] - POINT_SIZE + WND_SIZE \/\/ 2,                        i[1] + POINT_SIZE + WND_SIZE \/\/ 2, i[2] + POINT_SIZE + WND_SIZE \/\/ 2,                        fill=('red' if i[0] == 1 else 'green'))     if with_line:         if w1 == 0:             cs.create_line(0, -b \/\/ w2 + WND_SIZE \/\/ 2, WND_SIZE, -b \/\/ w2 + WND_SIZE \/\/ 2)         else:             cs.create_line((-b + w2 * (WND_SIZE \/\/ 2)) \/\/ w1 + WND_SIZE \/\/ 2, 0,                            (-b - w2 * (WND_SIZE \/\/ 2)) \/\/ w1 + WND_SIZE \/\/ 2, WND_SIZE)   def add_point(event, class_):     # \u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f \u0438\u0445 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442)     x = event.x - WND_SIZE \/\/ 2     y = event.y - WND_SIZE \/\/ 2     # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 class_     # (\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 - \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430)     type_.append([class_, x, y])     # \u041e\u0431\u0443\u0447\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435)     if TRAIN_EVERY_TIME:         train()     # \u0420\u0438\u0441\u0443\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u043d\u043e\u0432\u043e (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435)     redraw(TRAIN_EVERY_TIME)   def type1_add(event):     add_point(event, -1)   def type2_add(event):     add_point(event, 1)   def clear(_e):     global type_, w1, w2, b     type_ = []  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438     # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     w1 = 1     w2 = 1     b = 0     redraw(False)  # \u0420\u0438\u0441\u0443\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e   def train_and_draw(_e):     train()     redraw()   cs.bind_all(\"&lt;Button-1>\", type1_add)  # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u041b\u041a\u041c - \u0432\u044b\u0437\u0432\u0430\u0442\u044c type1_add cs.bind_all(\"&lt;Button-3>\", type2_add)  # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u041f\u041a\u041c - \u0432\u044b\u0437\u0432\u0430\u0442\u044c type2_add cs.bind_all(\"&lt;Escape>\", clear)  # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Escape - \u0432\u044b\u0437\u0432\u0430\u0442\u044c clear cs.bind_all(\"&lt;Return>\", train_and_draw)  # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Enter - \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c  redraw(TRAIN_EVERY_TIME) tk.mainloop() <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u043e\u0447\u043a\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e \u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0435\u0435 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u0442, \u043d\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u0435\u043a \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0442\u043e\u0447\u0435\u043a \u0434\u0440\u0443\u0433\u043e\u0433\u043e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0448\u0438\u0431\u0430\u0442\u044c\u0441\u044f. <\/p>\n<p>P.S. \u042f \u0438\u0437\u0443\u0447\u0430\u044e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 <a href=\"https:\/\/edu.sirius.online\/\" rel=\"noopener noreferrer nofollow\">\u0421\u0438\u0440\u0438\u0443\u0441.\u041a\u0443\u0440\u0441\u0430\u0445<\/a>, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u043e, \u0447\u0442\u043e \u0443\u0437\u043d\u0430\u043b.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/748508\/\"> https:\/\/habr.com\/ru\/articles\/748508\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u0443\u044e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0431\u044b\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u0443\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0435 \u2014 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Python \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 tkinter.<\/p>\n<h2>\u041a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e?<\/h2>\n<p>\u041f\u0443\u0441\u0442\u044c \u0438\u0441\u043a\u043e\u043c\u0430\u044f \u043f\u0440\u044f\u043c\u0430\u044f \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c . \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 . \u0412 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u0443\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (\u0434\u043b\u044f \u043d\u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043e\u0437\u0434\u043d\u0435\u0435, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e , \u0430 \u0434\u043b\u044f \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0439 \u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u043b\u0443\u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u2014 )<\/p>\n<p>\u0412\u0432\u0435\u0434\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0435\u0441\u043b\u0438  0&#8243; alt=&#187;p(x, y) > 0&#8243; src=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4be\/650\/afb\/4be650afb3b1719642e63dbc1f57a6ad.svg&#187; width=&#187;90&#8243; height=&#187;22&#8243;\/>, \u0442\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 . \u0418\u043d\u0430\u0447\u0435 \u2014 .<\/p>\n<p>\u0412\u0432\u0435\u0434\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e  0; \\\\ -1, x \\le 0 \\end{cases}\\end{equation*}&#187; alt=&#187;f(x)=\\begin{equation*}\\begin{cases}1, x > 0; \\\\ -1, x \\le 0 \\end{cases}\\end{equation*}&#187; src=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c0b\/ff4\/7bf\/c0bff47bf95b997f14818aaaff414f43.svg&#187; width=&#187;163&#8243; height=&#187;49&#8243;\/>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0435 .<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u0439\u0442\u0438 .<\/p>\n<h2>\u041a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/h2>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, . <\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443. \u0423 \u043e\u0431\u044a\u0435\u043a\u0442\u0430  \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u043a\u043b\u0430\u0441\u0441, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f. <\/p>\n<\/li>\n<li>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. <\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 , \u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 , \u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0435\u0441\u0430 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f ) \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435:<\/p>\n<p>, \u0433\u0434\u0435:<\/p>\n<ol>\n<li>\n<p>\u2014 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b)<\/p>\n<\/li>\n<li>\n<p>\u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0430\u043a\u0442\u043e\u0440\u0430 (\u0438\u043b\u0438  \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430)<\/p>\n<\/li>\n<li>\n<p>\u2014 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438\u0441\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c, \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0445\u043e\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u0435\u0441\u043e\u0432, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u043e \u0432\u0441\u0435\u043c \u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c.<\/p>\n<\/li>\n<\/ol>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/h2>\n<pre><code class=\"python\">import tkinter as tk   WND_SIZE = 700   # \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430  POINT_SIZE = 5   # \u0420\u0430\u0434\u0438\u0443\u0441 \u0442\u043e\u0447\u0435\u043a TRAIN_EVERY_TIME = False  # \u041e\u0431\u0443\u0447\u0430\u0442\u044c \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438                           # (\u0438\u043b\u0438 \u0436\u0434\u0430\u0442\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u044f Enter)  MAX_STUDY = 1000 # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 LAMBDA = 0.1     # \u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 WND_SIZE x WND_SIZE window = tk.Tk() window.geometry(f\"{WND_SIZE}x{WND_SIZE}\")  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0445\u043e\u043b\u0441\u0442 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u0435 \u043e\u043a\u043d\u043e cs = tk.Canvas(window, width=WND_SIZE, height=WND_SIZE) cs.pack()<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>MAX_STUDY<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>LAMBDA<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438, \u0435\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u044b\u043b \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438<\/h2>\n<pre><code class=\"python\">type_ = [] # \u0422\u043e\u0447\u043a\u0438  # \u0412\u0435\u0441\u0430: w1 = 1 w2 = 1 b = 0<\/code><\/pre>\n<p>\u0422\u043e\u0447\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c: \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u043a\u043b\u0430\u0441\u0441 (1 \u0438\u043b\u0438 -1), \u0432\u0442\u043e\u0440\u043e\u0439 \u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/p>\n<h2>\u0412\u0432\u043e\u0434 \u0442\u043e\u0447\u0435\u043a<\/h2>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u043e\u0447\u043a\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043e\u0442 \u0442\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 tkinter&#8217;\u0435:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u043b\u0435\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u043d\u0430\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f tkinter&#8217;\u043e\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c  \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0442\u043e\u0447\u0435\u043a \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435 \u0442\u043e\u0447\u0435\u043a \u0438 \u043f\u0440\u044f\u043c\u043e\u0439.<\/p>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u041b\u041a\u041c (\u043b\u0435\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438), \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u041f\u041a\u041c (\u043f\u0440\u0430\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043c\u044b\u0448\u0438) \u2014 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e. \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Escape, \u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0438\u0445 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Enter, \u2014 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c 4 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u041b\u041a\u041c, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u041f\u041a\u041c, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Escape \u0438 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 Enter (\u0421\u043f\u0430\u0441\u0438\u0431\u043e <a class=\"mention\" href=\"\/users\/ivayan\">@IvaYan<\/a> \u0437\u0430 \u0438\u0434\u0435\u044e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b type1_add \u0438 type2_add \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u0435\u043a)<\/p>\n<pre><code class=\"python\">def add_point(event, class_):     # \u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f \u0438\u0445 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442)     x = event.x - WND_SIZE\/\/2      y = event.y - WND_SIZE\/\/2     # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 class_     # (\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 - \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430)     type_.append([class_, x, y])     # \u041e\u0431\u0443\u0447\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435)     if TRAIN_EVERY_TIME:         train()     # \u0420\u0438\u0441\u0443\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u043d\u043e\u0432\u043e (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435)      # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 redraw \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u043e, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430 \u043f\u0440\u044f\u043c\u0430\u044f. \u042d\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442     # \u043e\u0442 TRAIN_EVERY_TIME     redraw(TRAIN_EVERY_TIME)       def type1_add(event):     add_point(event, -1)   def type2_add(event):     add_point(event, 1)   def clear(_e):     global type_, w1, w2, b     type_ = [] # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438     # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f     w1 = 1      w2 = 1     b = 0     redraw() # \u0420\u0438\u0441\u0443\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e   def train_and_draw(_e):     train()     redraw()<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u043a\u0430\u0436\u0435\u043c Tkinter&#8217;\u0443, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0434\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"python\">cs.bind_all(\"&lt;Button-1>\", type1_add) # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u041b\u041a\u041c - \u0432\u044b\u0437\u0432\u0430\u0442\u044c type1_add cs.bind_all(\"&lt;Button-3>\", type2_add) # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u041f\u041a\u041c - \u0432\u044b\u0437\u0432\u0430\u0442\u044c type2_add cs.bind_all(\"&lt;Escape>\", clear) # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Escape - \u0432\u044b\u0437\u0432\u0430\u0442\u044c clear cs.bind_all(\"&lt;Return>\", train_and_draw) # \u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 Enter - \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0438 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c<\/code><\/pre>\n<h2>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f train()<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435:<\/p>\n<pre><code class=\"python\">def f(x):     return 1 if x > 0 else -1  def train():     global w1, w2, b     for _ in range(MAX_STUDY): # \u0414\u0435\u043b\u0430\u0435\u043c MAX_STUDY \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f         another_iter = False # \u0424\u043b\u0430\u0433, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u0431\u044b\u043b\u0438 \u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u0435\u0441\u0430         for i in type_: # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438:             predicted = f(w1 * i[1] + w2 * i[2] + b) # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435             if predicted != i[0]: # \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c:                 another_iter = True # \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f                 # \u041f\u0435\u0440\u0435\u0441\u0447\u0435\u0442 \u0432\u0435\u0441\u043e\u0432:                 w1 += LAMBDA * (i[0] - predicted) * i[1]                 w2 += LAMBDA * (i[0] - predicted) * i[2]                 b += LAMBDA * (i[0] - predicted)         if not another_iter: # \u0415\u0441\u043b\u0438 \u0432\u0435\u0441\u0430 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430.             return # \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 <\/code><\/pre>\n<h2>\u041f\u043e\u043a\u0430\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u044f redraw()<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<pre><code class=\"python\">def redraw(with_line=True):     cs.delete(\"all\")  # \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0445\u043e\u043b\u0441\u0442     for i in type_:  # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0440\u0443\u0433 \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c POINT_SIZE         cs.create_oval(i[1] - POINT_SIZE + WND_SIZE \/\/ 2, i[2] - POINT_SIZE + WND_SIZE \/\/ 2,                        i[1] + POINT_SIZE + WND_SIZE \/\/ 2, i[2] + POINT_SIZE + WND_SIZE \/\/ 2,                        fill=('red' if i[0] == 1 else 'green'))     if with_line: # \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e, ...         if w1 == 0:             cs.create_line(0, -b \/\/ w2 + WND_SIZE \/\/ 2, WND_SIZE, -b \/\/ w2 + WND_SIZE \/\/ 2)         else:             cs.create_line((-b + w2 * (WND_SIZE \/\/ 2)) \/\/ w1 + WND_SIZE \/\/ 2, 0,                            (-b - w2 * (WND_SIZE \/\/ 2)) \/\/ w1 + WND_SIZE \/\/ 2, WND_SIZE)<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 \u0441 8 \u043f\u043e 12 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:<\/p>\n<p>\u0415\u0441\u043b\u0438 , \u0442\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u0433\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c, \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 , \u0442.\u0435.  \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e . <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043b\u0438\u043d\u0438\u044e \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e \u0442\u043e\u0447\u043a\u0438 . (\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442!)<\/p>\n<p>\u0415\u0441\u043b\u0438 , \u0442\u043e . \u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0432 \u044d\u0442\u0443 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 , \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0447\u0442\u043e:<\/p>\n<p>, <\/p>\n<p>(\u0432\u044b\u0440\u0430\u0437\u0438\u043b\u0438  \u043f\u0440\u0438 2 \u0440\u0430\u0437\u043d\u044b\u0445 ). \u0422\u0430\u043a\u0443\u044e \u043b\u0438\u043d\u0438\u044e \u0438 \u0440\u0438\u0441\u0443\u0435\u043c.<\/p>\n<h2>\u041a\u043e\u043d\u0435\u0446 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043e\u043a\u043d\u0430<\/h2>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043d\u0430 \u0445\u043e\u043b\u0441\u0442\u0435 \u043d\u0430\u0448\u0443 \u043f\u0440\u044f\u043c\u0443\u044e \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043e\u043a\u043d\u0430.<\/p>\n<pre><code class=\"python\">redraw(TRAIN_EVERY_TIME) tk.mainloop()<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import tkinter as tk  WND_SIZE = 700  # \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 POINT_SIZE = 5  # \u0420\u0430\u0434\u0438\u0443\u0441 \u0442\u043e\u0447\u0435\u043a TRAIN_EVERY_TIME = False  # \u041e\u0431\u0443\u0447\u0430\u0442\u044c \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u043e\u0447\u043a\u0438  MAX_STUDY = 1000  # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 LAMBDA = 0.1  # \u0412\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u043a\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 WND_SIZE x WND_SIZE window = tk.Tk() window.geometry(f\"{WND_SIZE}x{WND_SIZE}\")  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0445\u043e\u043b\u0441\u0442 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0432\u0441\u0435 \u043e\u043a\u043d\u043e cs = tk.Canvas(window, width=WND_SIZE, height=WND_SIZE) cs.pack()  type_ = []  # \u0422\u043e\u0447\u043a\u0438  # \u0412\u0435\u0441\u0430: w1 = 1 w2 = 1 b = 0   def f(x):     return 1 if x > 0 else -1   def train():     global w1, w2, b     for _ in range(MAX_STUDY):  # \u0414\u0435\u043b\u0430\u0435\u043c MAX_STUDY \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f         another_iter = False  # \u0424\u043b\u0430\u0433, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439, \u0431\u044b\u043b\u0438 \u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u0435\u0441\u0430         for i in type_:  # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438:             predicted = f(w1 * i[1] + w2 * i[2] + b)  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435             if predicted != i[0]:  # \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c:                 another_iter = True  # \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f                 # \u041f\u0435\u0440\u0435\u0441\u0447\u0435\u0442 \u0432\u0435\u0441\u043e\u0432:                 w1 += LAMBDA * (i[0] - predicted) * i[1]                 w2 += LAMBDA * (i[0] - predicted) * i[2]                 b += LAMBDA * (i[0] - predicted)         if not another_iter:  # \u0415\u0441\u043b\u0438 \u0432\u0435\u0441\u0430 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430.             return  # \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435   def redraw(with_line=True):     cs.delete(\"all\")  # \u041e\u0447\u0438\u0449\u0430\u0435\u043c \u0445\u043e\u043b\u0441\u0442     for i in type_:  # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043a\u0440\u0443\u0433 \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c POINT_SIZE         cs.create_oval(i[1] - POINT_SIZE + WND_SIZE \/\/ 2, i[2] - POINT_SIZE + WND_SIZE \/\/ 2,                        i[1] + POINT_SIZE + WND_SIZE \/\/ 2, i[2] + POINT_SIZE + WND_SIZE \/\/ 2,                        fill=('red' if i[0] == 1 else 'green'))     if with_line:         if w1 == 0:             cs.create_line(0, -b \/\/ w2 + WND_SIZE \/\/ 2, WND_SIZE, -b \/\/ w2 + WND_SIZE \/\/ 2)         else:             cs.create_line((-b + w2 * (WND_SIZE \/\/ 2)) \/\/ w1 + WND_SIZE \/\/ 2, 0,                            (-b - w2 * (WND_SIZE \/\/ 2)) \/\/ w1 + WND_SIZE \/\/ 2, WND_SIZE)   def add_point(event, class_):     # \u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f \u0438\u0445 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442)     x = event.x - WND_SIZE \/\/ 2     y = event.y -<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-350350","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/350350","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=350350"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/350350\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=350350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=350350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=350350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}