[{"data":1,"prerenderedAt":1350},["ShallowReactive",2],{"navigation":3,"/blog/python/st35":386,"/blog/python/st35-surround":1346},[4],{"title":5,"path":6,"stem":7,"children":8,"page":114},"Blog","/blog","blog",[9,115,184,329],{"title":10,"path":11,"stem":12,"children":13,"page":114},"Ege","/blog/ege","blog/ege",[14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110],{"title":15,"path":16,"stem":17},"ЕГЭ Задание 1","/blog/ege/task1","blog/ege/task1",{"title":19,"path":20,"stem":21},"ЕГЭ Задание 10","/blog/ege/task10","blog/ege/task10",{"title":23,"path":24,"stem":25},"ЕГЭ Задание 11","/blog/ege/task11","blog/ege/task11",{"title":27,"path":28,"stem":29},"ЕГЭ Задание 12","/blog/ege/task12","blog/ege/task12",{"title":31,"path":32,"stem":33},"ЕГЭ Задание 13","/blog/ege/task13","blog/ege/task13",{"title":35,"path":36,"stem":37},"ЕГЭ Задание 14","/blog/ege/task14","blog/ege/task14",{"title":39,"path":40,"stem":41},"ЕГЭ Задание 15","/blog/ege/task15","blog/ege/task15",{"title":43,"path":44,"stem":45},"ЕГЭ Задание 16","/blog/ege/task16","blog/ege/task16",{"title":47,"path":48,"stem":49},"ЕГЭ Задание 17","/blog/ege/task17","blog/ege/task17",{"title":51,"path":52,"stem":53},"ЕГЭ Задание 18","/blog/ege/task18","blog/ege/task18",{"title":55,"path":56,"stem":57},"ЕГЭ Задание 19, 20, 21","/blog/ege/task19_20_21","blog/ege/task19_20_21",{"title":59,"path":60,"stem":61},"ЕГЭ Задание 2","/blog/ege/task2","blog/ege/task2",{"title":63,"path":64,"stem":65},"ЕГЭ Задание 22","/blog/ege/task22","blog/ege/task22",{"title":67,"path":68,"stem":69},"ЕГЭ Задание 23","/blog/ege/task23","blog/ege/task23",{"title":71,"path":72,"stem":73},"ЕГЭ Задание 24","/blog/ege/task24","blog/ege/task24",{"title":75,"path":76,"stem":77},"ЕГЭ Задание 25","/blog/ege/task25","blog/ege/task25",{"title":79,"path":80,"stem":81},"ЕГЭ Задание 26","/blog/ege/task26","blog/ege/task26",{"title":83,"path":84,"stem":85},"ЕГЭ Задание 27","/blog/ege/task27","blog/ege/task27",{"title":87,"path":88,"stem":89},"ЕГЭ Задание 3","/blog/ege/task3","blog/ege/task3",{"title":91,"path":92,"stem":93},"ЕГЭ Задание 4","/blog/ege/task4","blog/ege/task4",{"title":95,"path":96,"stem":97},"ЕГЭ Задание 5","/blog/ege/task5","blog/ege/task5",{"title":99,"path":100,"stem":101},"ЕГЭ Задание 6","/blog/ege/task6","blog/ege/task6",{"title":103,"path":104,"stem":105},"ЕГЭ Задание 7","/blog/ege/task7","blog/ege/task7",{"title":107,"path":108,"stem":109},"ЕГЭ Задание 8","/blog/ege/task8","blog/ege/task8",{"title":111,"path":112,"stem":113},"ЕГЭ Задание 9","/blog/ege/task9","blog/ege/task9",false,{"title":116,"path":117,"stem":118,"children":119,"page":114},"Oge","/blog/oge","blog/oge",[120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180],{"title":121,"path":122,"stem":123},"ОГЭ Задание 1","/blog/oge/task1","blog/oge/task1",{"title":125,"path":126,"stem":127},"ОГЭ Задание 10","/blog/oge/task10","blog/oge/task10",{"title":129,"path":130,"stem":131},"ОГЭ Задание 11","/blog/oge/task11","blog/oge/task11",{"title":133,"path":134,"stem":135},"ОГЭ Задание 12","/blog/oge/task12","blog/oge/task12",{"title":137,"path":138,"stem":139},"ОГЭ Задание 13","/blog/oge/task13","blog/oge/task13",{"title":141,"path":142,"stem":143},"ОГЭ Задание 14","/blog/oge/task14","blog/oge/task14",{"title":145,"path":146,"stem":147},"ОГЭ Задание 15","/blog/oge/task15","blog/oge/task15",{"title":149,"path":150,"stem":151},"ОГЭ Задание 16","/blog/oge/task16","blog/oge/task16",{"title":153,"path":154,"stem":155},"ОГЭ Задание 2","/blog/oge/task2","blog/oge/task2",{"title":157,"path":158,"stem":159},"ОГЭ Задание 3","/blog/oge/task3","blog/oge/task3",{"title":161,"path":162,"stem":163},"ОГЭ Задание 4","/blog/oge/task4","blog/oge/task4",{"title":165,"path":166,"stem":167},"ОГЭ Задание 5","/blog/oge/task5","blog/oge/task5",{"title":169,"path":170,"stem":171},"ОГЭ Задание 6","/blog/oge/task6","blog/oge/task6",{"title":173,"path":174,"stem":175},"ОГЭ Задание 7","/blog/oge/task7","blog/oge/task7",{"title":177,"path":178,"stem":179},"ОГЭ Задание 8","/blog/oge/task8","blog/oge/task8",{"title":181,"path":182,"stem":183},"ОГЭ Задание 9","/blog/oge/task9","blog/oge/task9",{"title":185,"path":186,"stem":187,"children":188,"page":114},"Python","/blog/python","blog/python",[189,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,257,261,265,269,273,277,281,285,289,293,297,301,305,309,313,317,321,325],{"title":190,"path":191,"stem":192},"Знакомство с синтаксисом","/blog/python/st1","blog/python/st1",{"title":194,"path":195,"stem":196},"Отладка","/blog/python/st10","blog/python/st10",{"title":198,"path":199,"stem":200},"Модули и пакеты","/blog/python/st11","blog/python/st11",{"title":202,"path":203,"stem":204},"Кортежи","/blog/python/st12","blog/python/st12",{"title":206,"path":207,"stem":208},"Знакомство со списками","/blog/python/st13","blog/python/st13",{"title":210,"path":211,"stem":212},"Списки и циклы","/blog/python/st14","blog/python/st14",{"title":214,"path":215,"stem":216},"Использование списков ч.1","/blog/python/st15","blog/python/st15",{"title":218,"path":219,"stem":220},"Использование списков ч.2","/blog/python/st16","blog/python/st16",{"title":222,"path":223,"stem":224},"Использование списков ч.3","/blog/python/st17","blog/python/st17",{"title":226,"path":227,"stem":228},"Словари","/blog/python/st18","blog/python/st18",{"title":230,"path":231,"stem":232},"Множества","/blog/python/st19","blog/python/st19",{"title":234,"path":235,"stem":236},"Переменные","/blog/python/st2","blog/python/st2",{"title":238,"path":239,"stem":240},"Хеш-таблицы","/blog/python/st20","blog/python/st20",{"title":242,"path":243,"stem":244},"Решето Эратосфена","/blog/python/st21","blog/python/st21",{"title":246,"path":247,"stem":248},"Длинная арифметика","/blog/python/st22","blog/python/st22",{"title":250,"path":251,"stem":252},"Декораторы функций","/blog/python/st23","blog/python/st23",{"title":254,"path":255,"stem":256},"Знакомство с алгоритмами","/blog/python/st24","blog/python/st24",{"title":258,"path":259,"stem":260},"Бинарный поиск – примеры задач","/blog/python/st25","blog/python/st25",{"title":262,"path":263,"stem":264},"Сортировка выбором","/blog/python/st26","blog/python/st26",{"title":266,"path":267,"stem":268},"Рекурсия и стек","/blog/python/st27","blog/python/st27",{"title":270,"path":271,"stem":272},"Быстрая сортировка","/blog/python/st28","blog/python/st28",{"title":274,"path":275,"stem":276},"Поиск в ширину","/blog/python/st29","blog/python/st29",{"title":278,"path":279,"stem":280},"Работа со строками","/blog/python/st3","blog/python/st3",{"title":282,"path":283,"stem":284},"Поиск в глубину","/blog/python/st30","blog/python/st30",{"title":286,"path":287,"stem":288},"Сбалансированные деревья","/blog/python/st31","blog/python/st31",{"title":290,"path":291,"stem":292},"Алгоритм Дейкстры","/blog/python/st32","blog/python/st32",{"title":294,"path":295,"stem":296},"Жадные алгоритмы","/blog/python/st33","blog/python/st33",{"title":298,"path":299,"stem":300},"Динамическое программирование","/blog/python/st34","blog/python/st34",{"title":302,"path":303,"stem":304},"Алгоритм k ближайших соседей","/blog/python/st35","blog/python/st35",{"title":306,"path":307,"stem":308},"Типы данных","/blog/python/st4","blog/python/st4",{"title":310,"path":311,"stem":312},"О функциях","/blog/python/st5","blog/python/st5",{"title":314,"path":315,"stem":316},"Свойства и методы","/blog/python/st6","blog/python/st6",{"title":318,"path":319,"stem":320},"Определение функций","/blog/python/st7","blog/python/st7",{"title":322,"path":323,"stem":324},"Логика","/blog/python/st8","blog/python/st8",{"title":326,"path":327,"stem":328},"Циклы","/blog/python/st9","blog/python/st9",{"title":330,"path":331,"stem":332,"children":333,"page":114},"Toi","/blog/toi","blog/toi",[334,338,342,346,350,354,358,362,366,370,374,378,382],{"title":335,"path":336,"stem":337},"Информация и информационные процессы","/blog/toi/st1","blog/toi/st1",{"title":339,"path":340,"stem":341},"Электронные таблицы","/blog/toi/st10","blog/toi/st10",{"title":343,"path":344,"stem":345},"Система, её свойства и компоненты. Моделирование","/blog/toi/st11","blog/toi/st11",{"title":347,"path":348,"stem":349},"Представление информации в компьютере","/blog/toi/st12","blog/toi/st12",{"title":351,"path":352,"stem":353},"Средства информационно-коммуникационных технологий. Файловая система","/blog/toi/st13","blog/toi/st13",{"title":355,"path":356,"stem":357},"Комбинаторика","/blog/toi/st2","blog/toi/st2",{"title":359,"path":360,"stem":361},"Адресация в интернете","/blog/toi/st3","blog/toi/st3",{"title":363,"path":364,"stem":365},"Измерение количества информации","/blog/toi/st4","blog/toi/st4",{"title":367,"path":368,"stem":369},"Системы счисления","/blog/toi/st5","blog/toi/st5",{"title":371,"path":372,"stem":373},"Диаграммы Эйлера — Венна","/blog/toi/st6","blog/toi/st6",{"title":375,"path":376,"stem":377},"Условие Фано","/blog/toi/st7","blog/toi/st7",{"title":379,"path":380,"stem":381},"Теория графов","/blog/toi/st8","blog/toi/st8",{"title":383,"path":384,"stem":385},"Алгебра логики","/blog/toi/st9","blog/toi/st9",{"id":387,"title":302,"author":388,"body":393,"date":1337,"description":1338,"extension":1339,"image":1340,"meta":1341,"minRead":640,"navigation":1342,"num":1343,"path":303,"seo":1344,"stem":304,"__hash__":1345},"python/blog/python/st35.md",{"name":389,"avatar":390},"Штана Альберт Игоревич",{"src":391,"alt":392},"me.jpg","@ashtana",{"type":394,"value":395,"toc":1297},"minimark",[396,400,405,417,420,425,428,433,824,829,832,835,838,846,850,853,911,914,924,927,938,941,944,953,957,960,968,971,974,979,984,987,991,994,997,1006,1009,1013,1016,1020,1023,1027,1030,1049,1052,1057,1060,1064,1068,1071,1075,1078,1089,1092,1098,1101,1105,1108,1112,1121,1125,1143,1163,1166,1170,1173,1177,1184,1188,1191,1199,1202,1206,1209,1213,1216,1219,1222,1233,1236,1240,1253,1267,1271,1281,1285,1288,1293],[397,398,302],"h2",{"id":399},"алгоритм-k-ближайших-соседей",[401,402],"card-collapsible",{":isList":403,"title":404},"[\"Научитесь строить системы классификации на базе алгоритма k ближайших соседей.\",\"Узнаете об извлечении признаков.\",\"Узнаете о регрессии: прогнозировании чисел (например, завтрашних биржевых котировок или успеха фильма у зрителей).\",\"Познакомитесь с типичными сценариями использования и ограничениями алгоритма k ближайших соседей.\"]","Из этой статьи вы",[406,407,408],"blockquote",{},[409,410,411,412,416],"p",{},"В предыдущей статье было про: ",[413,414,415],"a",{"href":299},"динамическое программирование",".\nЗдесь далее текст пойдёт об алгоритме k ближайших соседей.",[409,418,419],{},"Алгоритм k ближайших соседей прост и полезен! Если вы пытаетесь выполнить классификацию чего-либо, сначала попробуйте применить алгоритм k ближайших соседей.\nРассмотрим реалистичный пример.",[421,422,424],"h4",{"id":423},"построение-рекомендательной-системы","Построение рекомендательной системы",[409,426,427],{},"Представьте, что вы работаете с сайтом о кино и хотите построить систему, которая будет рекомендовать фильмы для ваших пользователей.\nПоложение пользователя определяется его вкусами, поэтому пользователи с похожими вкусами располагаются недалеко друг от друга.\nПредположим, вы хотите порекомендовать фильмы Алексею. Найдите 5 пользователей, ближайших к нему.\nДопустим, окажется, что у Ивана, Сергея, Анны, Ларисы и Анатолия похожие вкусы.\nЗначит, те фильмы, которые нравятся им, с большой вероятностью понравятся и Алексею!\nПосле того как у вас появится такая диаграмма, построить рекомендательную систему будет несложно.\nЕсли Анатолию нравится какой-нибудь фильм, порекомендуйте этот фильм Алексею.\nОднако в картине не хватает одного важного фрагмента.\nВы сравнивали вкусы двух пользователей. Но как определить, насколько они близки?",[429,430,432],"h5",{"id":431},"извлечение-признаков","Извлечение признаков",[409,434,435,436,643,644,823],{},"В примере с фруктами можно сравнивать фрукты на основании их размера и цвета кожуры.\nРазмер и цвет — признаки, по которым ведется сравнение.\nТеперь предположим, что у вас есть три фрукта.\nВы можете извлечь из них информацию, то есть провести извлечение признаков.\nДанные этих фруктов наносятся на график.\nПредположим, что из диаграммы хорошо видно, что фрукты A и B похожи.\nДавайте измерим степень их сходства.\nДля вычисления расстояния между двумя точками применяется формула Пифагора: ",[437,438,442],"mjx-container",{"className":439,"jax":441},[440],"MathJax","SVG",[443,444,453,493],"svg",{"style":445,"xmlns":446,"width":447,"height":448,"role":449,"focusable":450,"viewBox":451,"xmlnsXLink":452},"vertical-align: -1.094ex;","http://www.w3.org/2000/svg","24.857ex","4.208ex","img","false","0 -1376.5 10986.7 1860","http://www.w3.org/1999/xlink",[454,455,456,461,465,469,473,477,481,485,489],"defs",{},[457,458],"path",{"id":459,"d":460},"MJX-1-TEX-LO-221A","M1001 1150Q1017 1150 1020 1132Q1020 1127 741 244L460 -643Q453 -650 436 -650H424Q423 -647 423 -645T421 -640T419 -631T415 -617T408 -594T399 -560T385 -512T367 -448T343 -364T312 -259L203 119L138 41L111 67L212 188L264 248L472 -474L983 1140Q988 1150 1001 1150Z",[457,462],{"id":463,"d":464},"MJX-1-TEX-N-28","M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z",[457,466],{"id":467,"d":468},"MJX-1-TEX-I-1D465","M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z",[457,470],{"id":471,"d":472},"MJX-1-TEX-N-31","M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",[457,474],{"id":475,"d":476},"MJX-1-TEX-N-2212","M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z",[457,478],{"id":479,"d":480},"MJX-1-TEX-N-32","M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z",[457,482],{"id":483,"d":484},"MJX-1-TEX-N-29","M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z",[457,486],{"id":487,"d":488},"MJX-1-TEX-N-2B","M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z",[457,490],{"id":491,"d":492},"MJX-1-TEX-I-1D466","M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",[494,495,499],"g",{"stroke":496,"fill":496,"stroke-width":497,"transform":498},"currentColor","0","scale(1,-1)",[494,500,502],{"dataMmlNode":501},"math",[494,503,505,629,636],{"dataMmlNode":504},"msqrt",[494,506,508,574,581],{"transform":507},"translate(1020,0)",[494,509,511,569],{"dataMmlNode":510},"msup",[494,512,515,523,542,549,562],{"dataMmlNode":513,"dataMjxTexclass":514},"TeXAtom","ORD",[494,516,518],{"dataMmlNode":517},"mo",[519,520],"use",{"dataC":521,"xLinkHref":522},"28","#MJX-1-TEX-N-28",[494,524,527,534],{"dataMmlNode":525,"transform":526},"msub","translate(389,0)",[494,528,530],{"dataMmlNode":529},"mi",[519,531],{"dataC":532,"xLinkHref":533},"1D465","#MJX-1-TEX-I-1D465",[494,535,538],{"dataMmlNode":536,"transform":537},"mn","translate(605,-150) scale(0.707)",[519,539],{"dataC":540,"xLinkHref":541},"31","#MJX-1-TEX-N-31",[494,543,545],{"dataMmlNode":517,"transform":544},"translate(1619.8,0)",[519,546],{"dataC":547,"xLinkHref":548},"2212","#MJX-1-TEX-N-2212",[494,550,552,556],{"dataMmlNode":525,"transform":551},"translate(2620,0)",[494,553,554],{"dataMmlNode":529},[519,555],{"dataC":532,"xLinkHref":533},[494,557,558],{"dataMmlNode":536,"transform":537},[519,559],{"dataC":560,"xLinkHref":561},"32","#MJX-1-TEX-N-32",[494,563,565],{"dataMmlNode":517,"transform":564},"translate(3628.6,0)",[519,566],{"dataC":567,"xLinkHref":568},"29","#MJX-1-TEX-N-29",[494,570,572],{"dataMmlNode":536,"transform":571},"translate(4050.6,477.1) scale(0.707)",[519,573],{"dataC":560,"xLinkHref":561},[494,575,577],{"dataMmlNode":517,"transform":576},"translate(4676.3,0)",[519,578],{"dataC":579,"xLinkHref":580},"2B","#MJX-1-TEX-N-2B",[494,582,584,624],{"dataMmlNode":510,"transform":583},"translate(5676.5,0)",[494,585,586,590,603,608,619],{"dataMmlNode":513,"dataMjxTexclass":514},[494,587,588],{"dataMmlNode":517},[519,589],{"dataC":521,"xLinkHref":522},[494,591,592,598],{"dataMmlNode":525,"transform":526},[494,593,594],{"dataMmlNode":529},[519,595],{"dataC":596,"xLinkHref":597},"1D466","#MJX-1-TEX-I-1D466",[494,599,601],{"dataMmlNode":536,"transform":600},"translate(523,-150) scale(0.707)",[519,602],{"dataC":540,"xLinkHref":541},[494,604,606],{"dataMmlNode":517,"transform":605},"translate(1537.8,0)",[519,607],{"dataC":547,"xLinkHref":548},[494,609,611,615],{"dataMmlNode":525,"transform":610},"translate(2538,0)",[494,612,613],{"dataMmlNode":529},[519,614],{"dataC":596,"xLinkHref":597},[494,616,617],{"dataMmlNode":536,"transform":600},[519,618],{"dataC":560,"xLinkHref":561},[494,620,622],{"dataMmlNode":517,"transform":621},"translate(3464.6,0)",[519,623],{"dataC":567,"xLinkHref":568},[494,625,627],{"dataMmlNode":536,"transform":626},"translate(3886.6,477.1) scale(0.707)",[519,628],{"dataC":560,"xLinkHref":561},[494,630,632],{"dataMmlNode":517,"transform":631},"translate(0,166.5)",[519,633],{"dataC":634,"xLinkHref":635},"221A","#MJX-1-TEX-LO-221A",[637,638],"rect",{"width":639,"height":640,"x":641,"y":642},9966.7,60,"1020","1256.5","\nФормула расстояния подтверждает то, что мы видим: между фруктами есть или отсутствует сходство.\nДопустим, вместо фруктов вы сравниваете пользователей. Пользователей нужно будет как-то нанести на график.\nСледовательно, каждого пользователя нужно будет преобразовать в координаты.\nКогда вы сможете нанести пользователей на график, вы также сможете измерить расстояние между ними.\nНачнем с преобразования пользователей в набор чисел.\nКогда пользователь регистрируется на сайте, предложите ему оценить несколько категорий фильмов: нравятся они лично ему или нет.\nТаким образом у вас появляется набор оценок для каждого пользователя!\nИ в итоге каждый пользователь представляется набором из чисел.\nВместо вычисления расстояния в двух измерениях вы теперь вычисляете расстояние в n измерениях(зависит от категорий жанров у фильмов).\nТем не менее формула расстояния остается неизменной:\n",[437,645,647],{"className":646,"jax":441},[440],[443,648,651,685],{"style":445,"xmlns":446,"width":649,"height":448,"role":449,"focusable":450,"viewBox":650,"xmlnsXLink":452},"29.127ex","0 -1376.5 12874.2 1860",[454,652,653,656,659,662,665,668,671,674,677,681],{},[457,654],{"id":655,"d":460},"MJX-2-TEX-LO-221A",[457,657],{"id":658,"d":464},"MJX-2-TEX-N-28",[457,660],{"id":661,"d":468},"MJX-2-TEX-I-1D465",[457,663],{"id":664,"d":472},"MJX-2-TEX-N-31",[457,666],{"id":667,"d":476},"MJX-2-TEX-N-2212",[457,669],{"id":670,"d":480},"MJX-2-TEX-N-32",[457,672],{"id":673,"d":484},"MJX-2-TEX-N-29",[457,675],{"id":676,"d":488},"MJX-2-TEX-N-2B",[457,678],{"id":679,"d":680},"MJX-2-TEX-N-2E","M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z",[457,682],{"id":683,"d":684},"MJX-2-TEX-I-1D45B","M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",[494,686,687],{"stroke":496,"fill":496,"stroke-width":497,"transform":498},[494,688,689],{"dataMmlNode":501},[494,690,691,815,820],{"dataMmlNode":504},[494,692,693,739,745,752,757,762,767],{"transform":507},[494,694,695,735],{"dataMmlNode":510},[494,696,697,702,714,719,730],{"dataMmlNode":513,"dataMjxTexclass":514},[494,698,699],{"dataMmlNode":517},[519,700],{"dataC":521,"xLinkHref":701},"#MJX-2-TEX-N-28",[494,703,704,709],{"dataMmlNode":525,"transform":526},[494,705,706],{"dataMmlNode":529},[519,707],{"dataC":532,"xLinkHref":708},"#MJX-2-TEX-I-1D465",[494,710,711],{"dataMmlNode":536,"transform":537},[519,712],{"dataC":540,"xLinkHref":713},"#MJX-2-TEX-N-31",[494,715,716],{"dataMmlNode":517,"transform":544},[519,717],{"dataC":547,"xLinkHref":718},"#MJX-2-TEX-N-2212",[494,720,721,725],{"dataMmlNode":525,"transform":551},[494,722,723],{"dataMmlNode":529},[519,724],{"dataC":532,"xLinkHref":708},[494,726,727],{"dataMmlNode":536,"transform":537},[519,728],{"dataC":560,"xLinkHref":729},"#MJX-2-TEX-N-32",[494,731,732],{"dataMmlNode":517,"transform":564},[519,733],{"dataC":567,"xLinkHref":734},"#MJX-2-TEX-N-29",[494,736,737],{"dataMmlNode":536,"transform":571},[519,738],{"dataC":560,"xLinkHref":729},[494,740,742],{"dataMmlNode":517,"transform":741},"translate(4454.1,0)",[519,743],{"dataC":579,"xLinkHref":744},"#MJX-2-TEX-N-2B",[494,746,748],{"dataMmlNode":517,"transform":747},"translate(5232.1,0)",[519,749],{"dataC":750,"xLinkHref":751},"2E","#MJX-2-TEX-N-2E",[494,753,755],{"dataMmlNode":517,"transform":754},"translate(5676.8,0)",[519,756],{"dataC":750,"xLinkHref":751},[494,758,760],{"dataMmlNode":517,"transform":759},"translate(6121.4,0)",[519,761],{"dataC":750,"xLinkHref":751},[494,763,765],{"dataMmlNode":517,"transform":764},"translate(6566.1,0)",[519,766],{"dataC":579,"xLinkHref":744},[494,768,770,810],{"dataMmlNode":510,"transform":769},"translate(7344.1,0)",[494,771,772,776,789,794,805],{"dataMmlNode":513,"dataMjxTexclass":514},[494,773,774],{"dataMmlNode":517},[519,775],{"dataC":521,"xLinkHref":701},[494,777,778,784],{"dataMmlNode":525,"transform":526},[494,779,780],{"dataMmlNode":529},[519,781],{"dataC":782,"xLinkHref":783},"1D45B","#MJX-2-TEX-I-1D45B",[494,785,787],{"dataMmlNode":536,"transform":786},"translate(633,-150) scale(0.707)",[519,788],{"dataC":540,"xLinkHref":713},[494,790,792],{"dataMmlNode":517,"transform":791},"translate(1647.8,0)",[519,793],{"dataC":547,"xLinkHref":718},[494,795,797,801],{"dataMmlNode":525,"transform":796},"translate(2648,0)",[494,798,799],{"dataMmlNode":529},[519,800],{"dataC":782,"xLinkHref":783},[494,802,803],{"dataMmlNode":536,"transform":786},[519,804],{"dataC":560,"xLinkHref":729},[494,806,808],{"dataMmlNode":517,"transform":807},"translate(3684.6,0)",[519,809],{"dataC":567,"xLinkHref":734},[494,811,813],{"dataMmlNode":536,"transform":812},"translate(4106.6,477.1) scale(0.707)",[519,814],{"dataC":560,"xLinkHref":729},[494,816,817],{"dataMmlNode":517,"transform":631},[519,818],{"dataC":634,"xLinkHref":819},"#MJX-2-TEX-LO-221A",[637,821],{"width":822,"height":640,"x":641,"y":642},11854.2,"\nФормула расстояния универсальна: даже если вы используете набор из миллиона чисел, расстояние вычисляется по той же формуле.\nЕстественно спросить: какой смысл передает метрика расстояния с пятью числами?\nОна сообщает, насколько близки между собой эти наборы из пяти чисел.",[406,825,826],{},[409,827,828],{},"Массивы чисел, такие как(2, 2) или (3, 4, 4, 1, 4) называются векторами.\nЕсли вам встретится статья о машинном обучении и вы увидите, что авторы говорят о векторах, знайте, что они имеют в виду подобный массив чисел.",[409,830,831],{},"Теперь порекомендовать фильм Алексею будет несложно: если Сергею понравился какой-то фильм, мы рекомендуем его Алексею, и наоборот.\nВы только что построили систему, рекомендующую фильмы.",[409,833,834],{},"Если вы являетесь пользователем приложения с фильмами, то оно постоянно напоминает вам:\n«Пожалуйста, оценивайте больше фильмов. Чем больше фильмов вы оцените, тем точнее будут наши рекомендации».\nТеперь вы знаете почему: чем больше фильмов вы оцениваете, тем точнее рекомендательная система определяет, с какими пользователями у вас общие вкусы.",[421,836],{"id":837},"",[839,840],"card-collapsible-num-answers",{":isAnswers":841,":isList":842,":startOl":843,"isText":844,"title":845},"[\"Можно воспользоваться нормализацией: вы вычисляете среднюю оценку для каждого человека и используете ее для масштабирования оценок. Например, вы определили, что средняя оценка первого равна 3, а средняя оценка второго — 3,5. Соответственно оценки первого немного увеличиваются так, чтобы ее средняя оценка тоже была равна 3,5. После этого оценки можно сравнивать по единой шкале.\",\"При применении алгоритма k ближайших соседей можно увеличить вес оценок авторитетов. Предположим, у вас трое соседей: Антон, Олег и Сергей(авторитет). Они поставили фильму оценки 3, 4 и 5 соответственно. Вместо того чтобы вычислять среднее арифметическое их оценок (3 + 4 + 5 / 3 = 4 звезды), вы просто повышаете вес оценки авторитета Сергея: 3 + 4 + 5 + 5 + 5 / 5 = 4,4 звезды.\"]","[\"В примере с приложением просмотра фильмов сходство между двумя пользователями оценивалось по формуле расстояния. Но не все пользователи оценивают фильмы одинаково. Допустим, есть два пользователя, вкусы которых совпадают. Но первый ставит 5 баллов любому фильму, который ему понравился, а второй более разборчив и ставит пятерки только самым лучшим фильмам. Вроде бы вкусы одинаковые, но по метрике расстояния они не являются соседями. Как учесть различия в стратегиях выставления оценок?\",\"Предположим, рекомендательная система определяет группу «авторитетов». Скажем, Иван и Сергей относятся к числу авторитетов приложения просмотра фильмов, поэтому их оценки оказывают более сильное влияние, чем оценки рядовых пользователей. Как изменить систему рекомендаций, чтобы она учитывала повышенную ценность оценок авторитетов?\"]","1","Попробуйте ответить на следующие вопросы","УПРАЖНЕНИЯ",[421,847,849],{"id":848},"регрессия","Регрессия",[409,851,852],{},"А теперь предположим, что просто порекомендовать фильм недостаточно: вы хотите спрогнозировать, какую оценку Алексей поставит фильму.\nВозьмите 5 пользователей, находящихся вблизи от нее.\nВ числе «5» нет ничего особенного: с таким же успехом можно взять 2 ближайших пользователей, 10 или 10 000.\nПоэтому-то алгоритм и называется «алгоритмом k ближайших пользователей», а не «алгоритмом 5 ближайших пользователей»!\nДопустим, вы пытаетесь угадать оценку Алексея для фильма «». Как этот фильм оценили Иван, Сергей, Лариса, Ольга и Антон?",[854,855,856,869],"table",{},[857,858,859],"thead",{},[860,861,862,866],"tr",{},[863,864,865],"th",{},"Имя",[863,867,868],{},"Оценка",[870,871,872,881,889,896,903],"tbody",{},[860,873,874,878],{},[875,876,877],"td",{},"Сергей",[875,879,880],{},"4",[860,882,883,886],{},[875,884,885],{},"Иван",[875,887,888],{},"5",[860,890,891,894],{},[875,892,893],{},"Лариса",[875,895,880],{},[860,897,898,901],{},[875,899,900],{},"Ольга",[875,902,888],{},[860,904,905,908],{},[875,906,907],{},"Антон",[875,909,910],{},"3",[409,912,913],{},"Если вычислить среднее арифметическое их оценок, вы получите 4,2. Такой метод прогнозирования называется регрессией.\nУ алгоритма k ближайших соседей есть два основных применения — классификация и регрессия:",[915,916,917,921],"ul",{},[918,919,920],"li",{},"классификация = распределение по категориям;",[918,922,923],{},"регрессия = прогнозирование ответа (в числовом выражении).",[409,925,926],{},"Регрессия чрезвычайно полезна. Представьте, что вы открыли маленькую булочную и каждый день выпекаете свежий хлеб.\nВы пытаетесь предсказать, сколько буханок следует испечь на сегодня. Есть несколько признаков:",[915,928,929,932,935],{},[918,930,931],{},"погода по шкале от 1 до 5 (1 = плохая, 5 = отличная);",[918,933,934],{},"праздник или выходной (1, если сегодня праздник или выходной, 0 в противном случае);",[918,936,937],{},"проходят ли сегодня спортивные игры (1 = да, 0 = нет).",[409,939,940],{},"И вы знаете, сколько буханок хлеба было продано в прошлом при разных сочетаниях признаков.\nA(5,1,0) = 300 буханок; B(3,1,1) = 225; C(1,1,0) = 75; D(4,0,1) = 200; E(4,0,0) = 150; F(2,0,0) = 50.",[409,942,943],{},"Сегодня выходной и хорошая погода. Сколько буханок вы продадите на основании только что приведенных данных?\nИспользуем алгоритм k ближайших соседей для k = 4. Сначала определим четырех ближайших соседей для этой точки: (4,1,0) = ?.\nНиже перечислены расстояния. Точки A, B, D и E являются ближайшими: A - 1, B - 2, C - 9, D - 2, E - 1, F - 5.\nВычисляя среднее арифметическое продаж в эти дни, вы получаете ≈ 218.\nЗначит, именно столько буханок нужно выпекать на сегодня!",[406,945,946],{},[409,947,948,949],{},"Выше мы использовали формулу расстояния для вычисления степени сходства.\nНо является ли эта формула лучшей?\nНа практике также часто применяется метрика близости косинусов.\nМетрика близости косинусов не измеряет расстояния между двумя векторами.\nВместо этого она сравнивает углы двух векторов и в целом лучше подходит для подобных случаев.\n",[950,951,952],"em",{},"Тема метрики близости косинусов выходит за рамки этой статьи, вам стоит самостоятельно поискать информацию, если вы будете применять алгоритм k ближайших соседей!",[429,954,956],{"id":955},"выбор-признаков","Выбор признаков",[409,958,959],{},"Чтобы подобрать рекомендации, вы предлагаете пользователям ставить оценки категориям фильмов.\nА если бы вы вместо этого предлагали им ставить оценки картинкам?\nНаверное, вам удалось бы найти пользователей, которые ставили похожие оценки этим картинкам.\nОднако у вас получилась бы самая плохая рекомендательная система в мире, потому что эти «признаки» не имеют никакого отношения к их вкусам в области кино!\nИли представьте, что вы предлагаете пользователям оценить фильмы для формирования рекомендаций — но только «Игру престолов», «Игру\nпрестолов-2» и «Игру престолов-3». Эти оценки ничего не скажут вам о вкусах пользователей.\nКогда вы работаете с алгоритмом k ближайших соседей, очень важно правильно выбрать признаки для сравнения.\nПод правильным выбором признаков следует понимать:",[915,961,962,965],{},[918,963,964],{},"признаки, напрямую связанные с фильмами, которые вы пытаетесь рекомендовать;",[918,966,967],{},"признаки, не содержащие смещения (например, если предлагать пользователям оценивать только комедии, вы не получите никакой информации об их отношении к боевикам).",[409,969,970],{},"Как вы думаете, оценки хорошо подходят для рекомендации фильмов? Возможно, я поставил «Золушке» более высокую оценку, чем «Охотникам за\nприведениями», но на самом деле я провел больше времени за просмотром «Охотников».\nКак улучшить рекомендательную систему?\nВозвращаясь к примеру с пекарней: сможете ли вы придумать два хороших и два плохих признака, которые можно было бы выбрать для прогнозирования объема выпечки?\nВозможно, нужно выпечь побольше хлеба после рекламы в газете. Или увеличить объем производства по понедельникам.\nВ том, что касается выбора хороших признаков, не существует единственно правильного ответа.\nТщательно продумайте все факторы, которые необходимо учесть при прогнозировании.",[421,972],{"id":973},"_1",[839,975],{":isAnswers":976,":isList":977,":startOl":910,"isText":844,"title":978},"[\"Слишком мало. Если ограничиться малым числом соседей, существует высокая вероятность того, что результаты будут искажены. Существует хорошее эмпирическое правило: для N пользователей следует рассматривать корень из N соседей.\"]","[\"У сервиса просмотра фильмов миллионы пользователей. В приведенном ранее примере рекомендательная система строилась для пяти ближайших соседей. Пять — это слишком мало? Слишком много?\"]","УПРАЖНЕНИЕ",[980,981,983],"h3",{"id":982},"знакомство-с-машинным-обучением","Знакомство с машинным обучением",[409,985,986],{},"Мало того, что алгоритм k ближайших соседей полезен — он открывает путь в волшебный мир машинного обучения!\nСуть машинного обучения — сделать ваш компьютер более разумным.\nВы уже видели один пример машинного обучения: построение рекомендательной системы.\nРассмотрим другие примеры.",[421,988,990],{"id":989},"ocr","OCR",[409,992,993],{},"Сокращение OCR означает «Optical Character Recognition», то есть «оптическое распознавание текста».\nИначе говоря, вы берете фотографию страницы текста, а компьютер автоматически преобразует изображение в текст.\nGoogle использует OCR для оцифровки книг. Как работает OCR?\nДля примера возьмем следующую цифру: 7.",[409,995,996],{},"Как автоматически определить, что это за цифра? Можно воспользоваться алгоритмом k ближайших соседей:",[998,999,1000,1003],"ol",{},[918,1001,1002],{},"Переберите изображения цифр и извлеките признаки.",[918,1004,1005],{},"Получив новое изображение, извлеките признаки и проверьте ближайших соседей.",[409,1007,1008],{},"По сути, это та же задача, что и задача классификации.\nВ общем случае алгоритмы OCR основаны на выделении линий, точек и кривых.\nЗатем при получении нового символа из него можно извлечь те же признаки.\nИзвлечение признаков в OCR происходит сложнее чем в задачах классификации.\nОднако важно понимать, что даже сложные технологии строятся на основе простых идей(таких, как алгоритм k ближайших соседей).\nТе же принципы могут использоваться для распознавания речи или лиц.\nКогда вы отправляете фотографию на Яндекс Диск, иногда сервису Яндекса хватает сообразительности для автоматической пометки людей на фото.\nДа это машинное обучение в действии!\nПервый шаг OCR, в ходе которого перебираются изображения цифр и происходит извлечение признаков, называется тренировкой.\nВ большинстве алгоритмов машинного обучения присутствует фаза тренировки: прежде чем компьютер сможет решить свою задачу, его необходимо натренировать.\nВ следующем примере рассмотрим создание спам-фильтров, и в нем тоже есть шаг тренировки.",[421,1010,1012],{"id":1011},"построение-спам-фильтра","Построение спам-фильтра",[409,1014,1015],{},"Спам-фильтры используют другой простой алгоритм, называемый наивным классификатором Байеса.\nСначала наивный классификатор Байеса тренируется на данных.\nПредположим, вы получили сообщение с темой «Получите свой миллион прямо сейчас!» Это спам?\nПредложение можно разбить на слова, а затем для каждого слова проверить вероятность присутствия этого слова в спам сообщении.\nНапример, в нашей очень простой модели слово «миллион» встречается только в спаме.\nНаивный классификатор Байеса вычисляет вероятность того, что сообщение с большой вероятностью является спамом.\nНа практике он применяется примерно для тех же целей, что и алгоритм k ближайших соседей.\nНапример, наивный классификатор Байеса может использоваться для классификации фруктов: есть большой и красный фрукт.\nКакова вероятность того, что он окажется грейпфрутом?\nЭто простой, но весьма эффективный алгоритм — из тех, что нравятся больше всего!",[421,1017,1019],{"id":1018},"прогнозы-на-биржевых-торгах","Прогнозы на биржевых торгах",[409,1021,1022],{},"Есть одна задача, в которой трудно добиться успеха машинным обучением: точно спрогнозировать курсы акций на бирже.\nКак выбрать хорошие признаки? Предположим, вы говорите, что если курс акций рос вчера, то он будет расти и сегодня.\nХороший это признак или нет? Или, предположим, вы утверждаете, что курс всегда снижается в апреле. Сработает или нет?\nНе существует гарантированного способа прогнозировать будущее на основании прошлых данных.\nПрогнозирование будущего — сложное дело, а при таком количестве переменных оно становится почти невозможным.",[980,1024,1026],{"id":1025},"тренировка-модели-машинного-обучения","Тренировка модели машинного обучения",[409,1028,1029],{},"Тренировка нейросети МО состоит из нескольких основных этапов:",[998,1031,1032,1035,1038,1040,1043,1046],{},[918,1033,1034],{},"Сбор данных",[918,1036,1037],{},"Анализ и очистка данных",[918,1039,432],{},[918,1041,1042],{},"Процесс обучения на тестовых данных",[918,1044,1045],{},"Проверка на новых данных",[918,1047,1048],{},"Проверка(валидация) и корректировка модели",[409,1050,1051],{},"Рассмотрим последовательность действий по тренировке модели МО. Все начинается со сбора данных.\nВ примере с рекомендательной системой по фильмам данными были оценки пользователей.\nЗатем необходимо провести очистку данных, то есть удаление неподходящих данных.\nНапример, какой-нибудь пользователь не пожелал оценивать фильмы, поэтому расставил случайные оценки и перешел к следующему экрану.\nТакие данные необходимо удалить из набора. После этого требуется извлечь из данных признаки.\nПолучив признаки, можно переходить к тренировке модели.\nВыберите модель — например, k ближайших соседей, создайте структуру нейронов и саму нейросеть — и проведите ее тренировку на 90% данных.\nОставьте около 10% данных для проверки модели.\nПосле того как модель пройдет обучение, протестируйте ее, предложив ей составить прогноз.\nЧтобы оценить качество прогноза, используйте зарезервированные или новые данные.\nНапример, вы хотите проверить рекомендательную модель фильмов.\nМожно спросить, понравились ли некоторому пользователю некоторые фильмы и сериалы. Модель выдаёт прогнозы.\nА мы при этом заранее знаем, какие фильмы нравятся пользователю, — эта информация содержится в 10 % данных, которые мы зарезервировали.\nЭти зарезервированные данные сравниваются с прогнозами модели.\nПосле сравнения результатов модели и реальных данных, можно сделать вывод о том, что модель выдала хороший результат или не очень.\nХороший результат у модели получается тогда, когда числа достаточно близки к реальным оценкам пользователя.\nЭтот шаг тестирования модели называется проверкой (или валидацией) модели.\nПосле проверки можно вернуться к модели и скорректировать ее.\nПредставьте, что вы построили модель k ближайших соседей, в которой k = 5.\nМожно опробовать ее с k = 7, чтобы посмотреть, не даст ли она лучший результат. Это называется корректировкой(или подкруткой) параметров.\nПосле того как вы завершите тренировку и оценку модели, ваша модель будет готова к работе.\nТак выглядит процедура построения модели МО в общем случае.",[409,1053,1054],{},[950,1055,1056],{},"Надеюсь, вы хотя бы в общих чертах поняли, что можно сделать с помощью алгоритма k ближайших соседей и машинного обучения!\nМашинное обучение — интересная область, и при желании в нее можно зайти достаточно глубоко.",[421,1058],{"id":1059},"_2",[401,1061],{":isList":1062,"title":1063},"[\"Алгоритм k ближайших соседей применяется для классификации и регрессии. В нем используется проверка k ближайших соседей.;\",\"Классификация = распределение по категориям;\",\"Регрессия = прогнозирование результата (например, в виде числа);\",\"«Извлечением признаков» называется преобразование элемента (например, пользователя) в список чисел, которые могут использоваться для сравнения;\",\"Качественный выбор признаков — важная часть успешного алгоритма k ближайших соседей;\"]","ШПАРГАЛКА",[980,1065,1067],{"id":1066},"ещё-об-алгоритмах","Ещё об алгоритмах",[409,1069,1070],{},"Ниже краткий обзор 10 алгоритмов, которые не рассматривались. Вы узнаете, для чего нужны эти алгоритмы.\nА также рекомендация книг, которые стоит читать дальше в зависимости от того, какие темы вам интересны.",[421,1072,1074],{"id":1073},"линейная-регрессия","Линейная регрессия",[409,1076,1077],{},"Представьте, что вы хотите продать свой дом.\nЕго площадь составляет 300 квадратных метров.\nВы изучаете описания домов, недавно проданных по соседству:",[998,1079,1080,1083,1086],{},[918,1081,1082],{},"100 кв. метров 10 миллионов рублей;",[918,1084,1085],{},"200 кв. метров 13 миллионов рублей;",[918,1087,1088],{},"400 кв. метров 25 миллионов рублей.",[409,1090,1091],{},"Какую цену вы бы назначили за свой дом, исходя из этой информации?\nНиже представлено одно из возможных решений. Сначала вы наносите все точки на график.\nЗатем соединяете их прямой линией(отсюда и название линейная).",[409,1093,1094],{},[449,1095],{"alt":1096,"src":1097},"Пример линейной регрессии","/images/blog/python/st35/img_1.png",[409,1099,1100],{},"Теперь вы видите, где на этой линии находится точка 300 квадратных метров.\nСоответствующую ей цену можно сделать начальной ценой.\nТак работает линейная регрессия. Она выстраивает линию из заданной группы точек, а затем использует эту линию для вычисления прогнозов.\nЛинейная регрессия уже давно применяется в статистике, а теперь и в машинном обучении, поскольку это метод, с которого легко начинать.\nЛинейная регрессия полезна, если значения непрерывны. Если вам нужно сделать прогноз, проще всего использовать именно линейную регрессию.",[421,1102,1104],{"id":1103},"инвертированные-индексы","Инвертированные индексы",[409,1106,1107],{},"Перед вами сильно упрощенное объяснение того, как работает поисковая система.\nДопустим, имеются три веб-страницы с простым содержимым.\nСтроиться хеш-таблица для этого содержимого или проще python словарь.\nКлючами словаря являются слова, а значения указывают, на каких страницах встречается каждое слово.\nТеперь предположим, что пользователь ищет слово \"python\".\nДалее проверяется, на каких страницах это слово встречается.\nПусть, слово встречается на страницах А и B. Выведем эти страницы в результатах поиска.\nИли предположим, что пользователь ищет слово \"питон\".\nИ система проверяет, что это слово встречается на страницах A и C.\nНесложно, верно?\nХеш-таблица — это очень полезная структура данных: хеш-таблица, связывающая слова с местами, в которых эти слова встречаются.\nТакая структура данных, называемая инвертированным индексом, часто используется для построения поисковых систем.\nЕсли вас интересует область поиска, эта тема станет хорошей отправной точкой для дальнейшего изучения.",[421,1109,1111],{"id":1110},"преобразование-фурье","Преобразование Фурье",[409,1113,1114,1115],{},"Преобразование Фурье — действительно выдающийся алгоритм: великолепный, элегантный и имеющий миллион практических применений.\nПример для преобразования Фурье: если у вас есть коктейль, преобразование Фурье сообщает, из каких ингредиентов он состоит.\nИли для заданной песни преобразование разделяет ее на отдельные частоты.\nОказывается, эта простая идея находит множество практических применений.\nНапример, если песню можно разложить на частоты, вы можете усилить тот диапазон, который вас интересует, — скажем, усилить низкие частоты и приглушить высокие.\nПреобразование Фурье прекрасно подходит для обработки сигналов.\nТакже оно может применяться для сжатия музыки: сначала звуковой файл разбивается на составляющие.\nПреобразование Фурье сообщает, какой вклад вносит каждая составляющая в музыку, что позволяет исключить несущественные составляющие.\nСобственно, именно так работает музыкальный формат MP3!\nМузыка — не единственный вид цифровых сигналов.\nГрафический формат JPG также использует сжатие и работает по тому же принципу.\nКроме того, преобразование Фурье применяется для прогнозирования землетрясений и анализа ДНК.\nС его помощью можно построить приложение, которое находит песни по отрывкам.\nПреобразование Фурье очень часто применяется на практике!\n",[413,1116,1120],{"href":1117,"rel":1118},"https://proglib.io/p/preobrazovaniya-fure-dlya-obrabotki-signalov-s-pomoshchyu-python-2020-11-03",[1119],"nofollow","Подробнее о преобразовании Фурье в работе со звуком есть отличная статья.",[421,1122,1124],{"id":1123},"параллельные-алгоритмы","Параллельные алгоритмы",[409,1126,1127,1128,1131,1132,1135,1136,1138,1139,1142],{},"Следующие три темы связаны с масштабируемостью и обработкой больших объемов данных.\nКогда-то компьютеры становились все быстрее и быстрее.\nЕсли вы хотели, чтобы ваш алгоритм работал быстрее, можно было подождать несколько месяцев и запустить программу на более мощном компьютере.\nНо сейчас этот период подошел к концу.\nСовременные компьютеры и ноутбуки оснащаются многоядерными процессорами. Чтобы алгоритм заработал быстрее,\nнеобходимо преобразовать его в форму, подходящую для параллельного выполнения сразу на всех ядрах!\nРассмотрим простой пример. Лучшее время выполнения для алгоритма сортировки равно приблизительно ",[950,1129,1130],{},"O(n log n)",".\nИзвестно, что массив невозможно отсортировать за время ",[950,1133,1134],{},"O(n)",", если только не воспользоваться параллельным алгоритмом!\nСуществует параллельная версия быстрой сортировки, которая сортирует массив за время ",[950,1137,1134],{},".\nПараллельный алгоритм трудно разработать.\nИ так же трудно убедиться в том, что он работает правильно, и понять, какой прирост скорости он обеспечивает.\nОдно можно заявить твердо: ",[950,1140,1141],{},"выигрыш по времени нелинеен",".\nСледовательно, если процессор вашего компьютера имеет два ядра вместо одного, из этого не следует, что ваш алгоритм по волшебству заработает вдвое быстрее.\nЭто объясняется несколькими причинами:",[915,1144,1145,1151,1157],{},[918,1146,1147,1150],{},[950,1148,1149],{},"Затраты ресурсов на управление параллелизмом"," — допустим, нужно отсортировать массив из 1000 элементов. Как разбить эту задачу для выполнения на двух ядрах? Выделить каждому ядру 500 элементов, а затем объединить два отсортированных массива в один большой отсортированный массив? Слияние двух массивов требует времени.",[918,1152,1153,1156],{},[950,1154,1155],{},"Закон Амдала"," — представьте, что вы пишете картину. Это занимает очень много времени, допустим около 30 часов. В идеале вам хотелось бы уложиться в 10 часов. Вы решаете оптимизировать процесс. Для этого разбиваете его на два шага: (1) эскиз и (2) рисование красками. Исходный эскиз не обязательно рисовать вручную — конечно, с помощью трейсинга(обводки) это делается быстрее. Но при следующей попытке на картину уходит 29 часов и 5 минут! Что произошло? Раньше эскиз занимал 1 час. Вы сократили его до 5 минут, что стало значительным улучшением. Тем не менее бóльшая часть времени приходится на рисование красками, так что оптимизация оказалась незначительной. Это проявление так называемого закона Амдала. Он гласит, что при оптимизации одной части системы выигрыш в производительности ограничивается тем, какую долю времени занимает эта часть. В данном случае время создания эскиза сокращается до 1/12 исходного значения. При этом экономятся 55 минут. Если бы нам удалось сократить время рисования красками в той же степени, это сэкономило бы 2090 минут!Ускоряя алгоритм за счет параллелизации, подумайте, какую его часть следует распараллелить — создание эскиза или рисование?",[918,1158,1159,1162],{},[950,1160,1161],{},"Распределение нагрузки"," — допустим, необходимо выполнить 10 задач, и вы назначаете каждому ядру 5 задач. Однако ядру A достаются все простые задачи, поэтому оно выполняет свою работу за 10 секунд, тогда как ядро B справится со сложными задачами только за минуту. Это означает, что ядро A целых 50 секунд простаивает, пока ядро B выполняет всю работу! Как организовать равномерное распределение работы, чтобы оба ядра трудились с одинаковой интенсивностью?",[409,1164,1165],{},"Если вас интересует теоретическая сторона производительности и масштабируемости, возможно, параллельные алгоритмы — именно то, что вам нужно!",[429,1167,1169],{"id":1168},"mapreduce","MapReduce",[409,1171,1172],{},"Существует разновидность параллельных алгоритмов, которая в последнее время активно набирает популярность: распределенные алгоритмы.\nКонечно, параллельный алгоритм удобно запускать на компьютере, если для его выполнения требуется от двух до четырех ядер. Но если нужны сотни?\nТогда алгоритм записывают так, чтобы он мог выполняться на множестве машин.\nКомпания Google популяризировала распределенный алгоритм, который называется MapReduce, но его функции известны уже давно.\nДля чего нужны распределенные алгоритмы?\nПредположим, имеется таблица с миллиардами или триллионами записей и к ней нужно сделать сложный запрос SQL.\nВ MySQL это сделать не удастся, потому что MySQL начнет «тормозить» уже после нескольких миллиардов записей.\nИспользуйте MapReduce!\nИли, предположим, вам нужно обработать длинный список задач.\nОбработка каждой задачи занимает 10 секунд, а всего в списке 1 миллион задач.\nЕсли выполнять эту работу на одном компьютере, она займет несколько месяцев!\nЕсли бы ее можно было выполнить на 100 машинах, работа завершилась бы за несколько дней.\nРаспределенные алгоритмы хорошо работают в ситуациях, когда нужно выполнить большой объем работы за максимально короткое время.",[421,1174,1176],{"id":1175},"фильтры-блума-и-hyperloglog","Фильтры Блума и HyperLogLog",[409,1178,1179,1180,1183],{},"Представьте себя на месте сайта Reddit. Когда пользователь публикует ссылку, нужно проверить, публиковалась ли эта ссылка ранее.\nИстории, которые еще не публиковались, считаются более ценными.\nИли представьте себя на месте поискового бота Google.\nОбрабатывать веб-страницу нужно только в том случае, если она еще не обрабатывалась ранее.\nИтак, нужно проверить, обрабатывалась ли страница ранее.\nИли представьте себя на месте bit.ly — сервиса сокращения URL.\nПользователи не должны перенаправляться на вредоносные сайты.\nУ вас имеется набор URL-адресов, которые считаются вредоносными.\nТеперь нужно выяснить, не направляется ли пользователь на URL-адрес из этого набора.\nВо всех этих примерах возникает одна проблема.\nИмеется очень большой набор данных.\nПоявляется новый объект, и вы хотите узнать, содержится ли он в существующем наборе.\nЭта задача быстро решается при помощи хеша.\nНапример, представьте, что Google создает большой хеш, ключами которого являются все обработанные страницы.\nКак узнать, обрабатывался ли сайт ashtana.ru? Нужно заглянуть в хеш.\nУ ashtana.ru имеется свой ключ в хеше, а значит, адрес уже обрабатывался.\nСреднее время обращения к элементам в хеш-таблице составляет ",[950,1181,1182],{},"O(1)",".\nТаким образом, вы узнали о том, что страница ashtana.ru уже проиндексирована за постоянное время. Неплохо!\nВот только этот хеш получится просто огромным.\nGoogle индексирует триллион веб-страниц. Если хеш содержит все URL-адреса, индексируемые Google, он займет слишком много места.\nУ Reddit и bit.ly возникает аналогичная проблема. Сталкиваясь с такими объемами данных, приходится действовать более изобретательно!",[429,1185,1187],{"id":1186},"фильтры-блума","Фильтры Блума",[409,1189,1190],{},"Для решения проблемы можно воспользоваться вероятностными структурами данных, которые называются фильтрами Блума.\nОни дают ответ, который может оказаться ложным, но с большой вероятностью является правильным.\nВместо того чтобы обращаться к хешу, вы спрашиваете у фильтра Блума, обрабатывался ли этот URL-адрес ранее.\nХеш-таблица даст точный ответ. Фильтр Блума дает ответ, правильный с высокой вероятностью:",[915,1192,1193,1196],{},[918,1194,1195],{},"возможны ложноположительные срабатывания. Фильтр скажет: «Этот сайт уже обрабатывался», хотя этого не было;",[918,1197,1198],{},"ложноотрицательные срабатывания исключены. Если фильтр утверждает, что сайт не обрабатывался, вы можете быть в этом уверены.",[409,1200,1201],{},"Фильтры Блума хороши тем, что занимают очень мало места.\nХеш-таблице пришлось бы хранить все URL-адреса, обрабатываемые Google, а фильтру Блума это не нужно.\nФильтр Блума очень удобен тогда, когда нет необходимости в точном ответе(как во всех приведенных примерах).",[429,1203,1205],{"id":1204},"hyperloglog","HyperLogLog",[409,1207,1208],{},"Примерно так же действует другой алгоритм, который называется HyperLogLog.\nПредположим, Google хочет подсчитать количество уникальных поисков, выполненных пользователями.\nИли Amazon хочет подсчитать количество уникальных предметов, просмотренных пользователями за сегодняшний день.\nДля получения ответов на эти вопросы потребуется очень много места!\nТак, в примере с Google придется вести журнал всех уникальных вариантов поиска.\nКогда пользователь что-то ищет, вы сначала проверяете, присутствует ли условие в журнале, и если нет, добавляете его.\nДаже для одного дня этот журнал получится гигантским.\nHyperLogLog аппроксимирует количество уникальных элементов в множестве.\nКак и фильтры Блума, он не дает точного ответа, но выдает достаточно близкий результат с использованием малой части памяти, которую обычно занимает такая задача.\nЕсли вы используете большие объемы данных и вас устраивают приближенные ответы — воспользуйтесь вероятностными алгоритмами!",[421,1210,1212],{"id":1211},"https-и-обмен-ключами-диффи-хеллмана","HTTPS и обмен ключами Диффи — Хеллмана",[409,1214,1215],{},"HTTPS — опора современного интернета.\nЭтот протокол обеспечивает безопасные онлайн-транзакции, от ввода пароля до оплаты покупок.\nРабота HTTPS основана на шифровании сообщений между клиентом и сервером.\nКак же работает шифрование? Функции передаются сообщение и секретный ключ.\nЗатем функция генерирует зашифрованное сообщение.\nЧтобы расшифровать его, передайте зашифрованное сообщение и тот же ключ функции, и вы получите исходное сообщение.\nКогда вы отправляете данные серверу, ваш браузер зашифровывает сообщение, после чего сервер расшифровывает его.\nДа, кроме одного: как проверить, что браузер и сервер используют один и тот же ключ?\nПомните, что для работы HTTPS обе стороны должны иметь одинаковые ключи.\nНо как задать ключ, чтобы никто его не видел? Если отправить ключ серверу, злоумышленник сможет перехватить этот ключ.\nКак задать ключ, чтобы только браузер и сервер знали его? Задача кажется неразрешимой, но это не так!\nДля ее решения существует очень умный алгоритм, называемый обменом ключей Диффи — Хеллмана.",[409,1217,1218],{},"Ниже описано, как работает алгоритм Диффи — Хеллмана.\nНа шаге 1 мы генерируем собственные ключи. Я — клиент, и я генерирую ключ для себя. Сервис также генерирует ключ.\nЭти ключи разные. Мы не знаем ключи друг друга, они закрытые. В реальности ключи представляют собой байты.\nНа шаге 2 генерируется общий шаблон. Это открытый шаблон. Он виден обеим сторонам и всем остальным. Нам неважно, кто его видит.\nНа шаге 3 этот шаблон совмещается с закрытыми ключами.\nВ результате мы получаем открытые ключи. Раз они открытые, нас не интересует, кто их видит.\nСервер видит мой открытый ключ, а я вижу его открытый ключ.\nНаконец, на шаге 4 я получаю открытый ключ сервера и совмещаю его со своим закрытым ключом.\nСервис делает то же самое с моим открытым ключом.\nТеперь у нас одинаковые ключи! У каждого из нас есть ключ, объединяющий три шаблона.\nНам удалось задать ключ, не отправляя ключи друг другу.\nЗаданный ключ называется общим секретом; так работает обмен ключами Диффи — Хеллмана.",[409,1220,1221],{},"HTTPS — интересная и важная часть нашей повседневной жизни. Вот немного терминологии, связанной с HTTPS:",[915,1223,1224,1227,1230],{},[918,1225,1226],{},"TLS — протокол безопасности транспортного уровня (Transport Layer Security). TLS используется для установления безопасного соединения.",[918,1228,1229],{},"SSL — прежнее название TLS, но люди часто не различают их. Если вы слышите, как кто-то упоминает SSL, то, скорее всего, речь идет о TLS. В этом протоколе часто находят дефекты безопасности, поэтому его постоянно приходится обновлять. Протокол TLS впервые появился в 1999 году. Все версии протокола SSL, выпущенные до TLS, небезопасны.",[918,1231,1232],{},"Шифрование с симметричным ключом — в нашем примере выше обе стороны используют одинаковые ключи. Но существует и асимметричное шифрование с открытым ключом, когда обе стороны используют разные ключи. Я говорю о шифровании с симметричным ключом, потому что оно используется HTTPS.",[409,1234,1235],{},"HTTPS использует измененную версию обмена ключей Диффи — Хеллмана, называемую эфемерным обменом ключей Диффи — Хеллмана.\nОна работает так же, как было показано, кроме того, что закрытые ключи генерируются заново для каждого соединения.\nЭто означает, что даже если злоумышленнику станет известен один из закрытых ключей, он сможет расшифровать сообщения только одного соединения.\nКриптография — интересная и глубокая тема, в которую можно сильно погрузиться.",[421,1237,1239],{"id":1238},"локально-чувствительное-хеширование","Локально-чувствительное хеширование",[409,1241,1242,1243,1246,1247,1249,1250,1252],{},"Многие хеш-функции имеют одну важную особенность: они являются локально-нечувствительными.\nПредположим, имеется строка, для которой генерируется хеш-код с помощью алгоритма SHA-256: dog → cd6357.\nЕсли изменить в строке всего один символ, а потом сгенерировать хеш заново, строка полностью изменяется!\nИ это хорошо, потому что сравнение хешей не позволит атакующему определить, насколько он близок к взлому пароля.\nИногда требуется обратный результат: локально-чувствительная функция хеширования.\nЗдесь на помощь приходит алгоритм ",[950,1244,1245],{},"Simhash",".\nПри незначительном изменении строки ",[950,1248,1245],{}," генерирует хеш-код, который почти не отличается от исходного.\nЭто позволяет сравнивать хеш-коды и определять, насколько похожи две строки, — весьма полезная возможность!\nПримеры использования ",[950,1251,1245],{},":",[915,1254,1255,1258,1261,1264],{},[918,1256,1257],{},"Google использует Simhash для выявления дубликатов в процессе индексирования.",[918,1259,1260],{},"Система проверки на антиплагиат может использовать Simhash для обнаружения плагиата(копирования рефератов из интернета).",[918,1262,1263],{},"Книжное издательство позволяет пользователям загружать документы или книги, чтобы они стали доступны для других пользователей. Но издатель не хочет, чтобы пользователи размещали информацию, защищенную авторским правом! С помощью Simhash сайт может обнаружить, что отправленная информация похожа на изданную книгу, и при обнаружении сходства автоматически запретить ее размещение.",[918,1265,1266],{},"Simhash используется для выявления сходства между фрагментами текста.",[421,1268,1270],{"id":1269},"минимальные-кучи-и-приоритетные-очереди","Минимальные кучи и приоритетные очереди",[409,1272,1273,1274,1276,1277,1280],{},"Минимальная куча — структура данных, построенная на базе деревьев. В таких кучах хранятся числа.\nМинимальные кучи позволяют быстро найти наименьший элемент кучи, потому что наименьшее значение всегда находится в корне.\nЭто самое важное свойство минимальной кучи, и наименьший элемент находится за время ",[950,1275,1182],{},".\nИли же за время ",[950,1278,1279],{},"O(log n)"," его можно удалить из кучи, заменив новым минимумом.\nБлагодаря кучам проводить сортировку очень легко — просто продолжая запрашивать минимальное значение.\nИ сохранять значения по порядку. В конце куча будет пустой, а у вас появится отсортированный список чисел!\nТакой алгоритм называется пирамидальной сортировкой, или сортировкой кучей.\nМаксимальные кучи (невозрастающие пирамиды) очень похожи на минимальные, но у них в корне хранится наибольшее значение.\nКучи отлично подходят для реализации приоритетных очередей.\nВспомните, что очереди относятся к категории FIFO (First In, First Out — «первым пришел, первым вышел»).\nС другой стороны, стек относится к структуре данных LIFO(Last In, First Out — «последним пришел, первым вышел»).\nПриоритетная очередь похожа на обычную очередь, не считая того, что при запросе элемента приоритетная очередь выдает элемент с наибольшим приоритетом.\nПриоритетная очередь отлично подходит для реализации списка задач.\nСначала вы сохраняете в списке задачи, а затем запрашиваете задачу для работы; приоритетная очередь выдает задачу с наибольшим приоритетом.\nПриоритетные очереди также используются для реализации эффективной версии алгоритма Дейкстры.",[421,1282,1284],{"id":1283},"линейное-программирование","Линейное программирование",[409,1286,1287],{},"Линейное программирование — одна из самых интересных областей, которые мне известны.\nЛинейное программирование используется для максимизации некоторой характеристики при заданных ограничениях.\nПредположим, ваша компания выпускает два продукта: рубашки и сумки.\nНа рубашку требуется 1 метр ткани и 5 пуговиц. На изготовление сумки необходимо 2 метра ткани и 2 пуговицы.\nУ вас есть 11 метров ткани и 20 пуговиц.\nРубашка приносит прибыль 200 рублей, а сумка — 300.\nСколько рубашек и сумок следует изготовить для получения максимальной прибыли?\nЗдесь мы пытаемся максимизировать прибыль, а ограничения определяют количество имеющихся материалов.\nДругой пример: вы политик, пытающийся получить максимальное количество голосов.\nПредположим, что исследования показали, что на каждый голос жителя Белгорода требуется примерно 1 час работы (маркетинг, исследования и т.д.), а на каждый голос жителя Курска — 1,5 часа.\nВам нужны голоса как минимум 500 жителей Белгорода и как минимум 300 жителей Курска.\nВ вашем распоряжении 50 дней. Кроме того, затраты на жителя Белгорода составляют 200 рублей, а на жителя Курска — 100.\nВаш бюджет составляет 1500000 рублей. Какое максимальное количество голосов вы сможете получить от жителей двух городов?\nНа этот раз вы стремитесь к максимуму голосов при ограничениях по времени и деньгам.\nВозможно, вы подумаете: «Есть много задач решающие вопросы оптимизации. Как они связаны с линейным программированием?»\nВсе алгоритмы, работающие с графами, могут быть реализованы средствами линейного программирования.\nЛинейное программирование — намного более общая область, а задачи с графами составляют ее подмножество.\nВ линейном программировании используется симплекс-метод. Этот алгоритм достаточно сложен, поэтому я не привожу его.\nЕсли вы заинтересуетесь различными задачами оптимизации, поищите информацию о линейном программировании!",[406,1289,1290],{},[409,1291,1292],{},"Надеюсь, этот краткий обзор показал, как много всего ещё можно узнать.\nЯ считаю, что лучший способ узнать что-то — найти тему, которая вас интересует, и постоянно изучать её!",[1294,1295,1296],"style",{},"\nmjx-container[jax=\"SVG\"] {\n  direction: ltr;\n}\n\nmjx-container[jax=\"SVG\"] > svg {\n  overflow: visible;\n  min-height: 1px;\n  min-width: 1px;\n}\n\nmjx-container[jax=\"SVG\"] > svg a {\n  fill: blue;\n  stroke: blue;\n}\n\nmjx-container[jax=\"SVG\"][display=\"true\"] {\n  display: block;\n  text-align: center;\n  margin: 1em 0;\n}\n\nmjx-container[jax=\"SVG\"][display=\"true\"][width=\"full\"] {\n  display: flex;\n}\n\nmjx-container[jax=\"SVG\"][justify=\"left\"] {\n  text-align: left;\n}\n\nmjx-container[jax=\"SVG\"][justify=\"right\"] {\n  text-align: right;\n}\n\ng[data-mml-node=\"merror\"] > g {\n  fill: red;\n  stroke: red;\n}\n\ng[data-mml-node=\"merror\"] > rect[data-background] {\n  fill: yellow;\n  stroke: none;\n}\n\ng[data-mml-node=\"mtable\"] > line[data-line], svg[data-table] > g > line[data-line] {\n  stroke-width: 70px;\n  fill: none;\n}\n\ng[data-mml-node=\"mtable\"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {\n  stroke-width: 70px;\n  fill: none;\n}\n\ng[data-mml-node=\"mtable\"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {\n  stroke-dasharray: 140;\n}\n\ng[data-mml-node=\"mtable\"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {\n  stroke-linecap: round;\n  stroke-dasharray: 0,140;\n}\n\ng[data-mml-node=\"mtable\"] > g > svg {\n  overflow: visible;\n}\n\n[jax=\"SVG\"] mjx-tool {\n  display: inline-block;\n  position: relative;\n  width: 0;\n  height: 0;\n}\n\n[jax=\"SVG\"] mjx-tool > mjx-tip {\n  position: absolute;\n  top: 0;\n  left: 0;\n}\n\nmjx-tool > mjx-tip {\n  display: inline-block;\n  padding: .2em;\n  border: 1px solid #888;\n  font-size: 70%;\n  background-color: #F8F8F8;\n  color: black;\n  box-shadow: 2px 2px 5px #AAAAAA;\n}\n\ng[data-mml-node=\"maction\"][data-toggle] {\n  cursor: pointer;\n}\n\nmjx-status {\n  display: block;\n  position: fixed;\n  left: 1em;\n  bottom: 1em;\n  min-width: 25%;\n  padding: .2em .4em;\n  border: 1px solid #888;\n  font-size: 90%;\n  background-color: #F8F8F8;\n  color: black;\n}\n\nforeignObject[data-mjx-xml] {\n  font-family: initial;\n  line-height: normal;\n  overflow: visible;\n}\n\nmjx-container[jax=\"SVG\"] path[data-c], mjx-container[jax=\"SVG\"] use[data-c] {\n  stroke-width: 3;\n}\n",{"title":837,"searchDepth":1298,"depth":1299,"links":1300},2,5,[1301],{"id":399,"depth":1298,"text":302,"children":1302},[1303,1307,1308,1311,1312,1318,1321],{"id":423,"depth":1304,"text":424,"children":1305},4,[1306],{"id":431,"depth":1299,"text":432},{"id":837,"depth":1304,"text":837},{"id":848,"depth":1304,"text":849,"children":1309},[1310],{"id":955,"depth":1299,"text":956},{"id":973,"depth":1304,"text":837},{"id":982,"depth":1313,"text":983,"children":1314},3,[1315,1316,1317],{"id":989,"depth":1304,"text":990},{"id":1011,"depth":1304,"text":1012},{"id":1018,"depth":1304,"text":1019},{"id":1025,"depth":1313,"text":1026,"children":1319},[1320],{"id":1059,"depth":1304,"text":837},{"id":1066,"depth":1313,"text":1067,"children":1322},[1323,1324,1325,1326,1329,1333,1334,1335,1336],{"id":1073,"depth":1304,"text":1074},{"id":1103,"depth":1304,"text":1104},{"id":1110,"depth":1304,"text":1111},{"id":1123,"depth":1304,"text":1124,"children":1327},[1328],{"id":1168,"depth":1299,"text":1169},{"id":1175,"depth":1304,"text":1176,"children":1330},[1331,1332],{"id":1186,"depth":1299,"text":1187},{"id":1204,"depth":1299,"text":1205},{"id":1211,"depth":1304,"text":1212},{"id":1238,"depth":1304,"text":1239},{"id":1269,"depth":1304,"text":1270},{"id":1283,"depth":1304,"text":1284},"2026-05-21T00:00:00.000Z","Сценарии использования и ограничениями алгоритма k ближайших соседей. Рекомендации по темам, которые стоит изучать дальше.","md","images/blog/python/st35/img.png",{},true,35,{"title":302,"description":1338},"5nvgtk0DWPwUbhWYUjRoDcMeOrzjr4ZMgScEWt723Nc",[1347,1349],{"title":298,"path":299,"stem":300,"description":1348,"children":-1},"Метод решения сложных задач, разбиваемых на подзадачи. Примеры задач.",null,1779376858027]