Data science
Добрый день. Заканчиваю учиться на дата сатаниста. По данной специальности работать не собираюсь.Есть ли какие нибудь сайты где за деньги смогут сделать выпускной проект?
Добрый день. Заканчиваю учиться на дата сатаниста. По данной специальности работать не собираюсь.Есть ли какие нибудь сайты где за деньги смогут сделать выпускной проект?
Эта статья про мой путь до первой работы в DS (data science). Путь был не маленьким и был пройден за 2,5 года. Кого-то эта цифра отпугнет, если бы я знал это в начале, то меня бы тоже отпугнула, кто-то назовет меня неспособным дурачком (и отчасти будет прав), а для кого-то (я надеюсь) эта статья поможет сократить время обучения и пройти этот путь быстрее.
Знакомство и первые шаги
Эта история начинается осенью 2019 года. Юный первокурсник Миша (это я) в очередной раз услышал про какой-то data science. Немного погуглив, я узнал про курс от всем известного поисковика, на котором можно узнать об этой области подробнее.
Пройдя пробный кусок, мне понравилось эта так называемое data science и было решено продолжать изучать эту тему, но самостоятельно, платить за это я был не готов.
Для начала я изучил, что вообще должен знать DS и сравнил это с тем, что имелось у меня в голове на тот момент. Поняв, что в голове ничего не имеется (кроме pascal в школе и 4 по математике в универе), я решил, что начать стоит с python.
Нашел несколько курсов по нему и принялся за дело. Проходил я эти курсы в течении полугода, и хоть прогресс, конечно, был, но не сказать, чтобы очень большой, сейчас я понимаю, что этого времени хватило бы, чтобы изучить базу по python достаточно хорошо, но мой подход при изучении этого курса, как и при изучении последующих, был мягко сказать неправильным: Поучась неделю, я забрасывал курс на 2, и так на протяжении всего обучения питону.
Худо бедно я познавал данный язык в течении полугода, а потом весна 2020 года, и всеми любимый локдаун. В универ ходить больше не надо, времени стало чуть больше и решил, что пора кончать с этим питоном и переходить уже к самому DS.
Приступаю к DS15 апреля 2020 я открыл курс “Введение в Data Science и машинное обучение” и начал получать свои первые знания в этой области. Курс мне понравился, не могу сказать, что он давался мне очень легко, но особых проблем не возникало, если не считать kaggle, на тот момент это казалось очень непонятной штукой.
Следующим моим курс, стал курс от крупнейшего DS сообщества в России. Очень крутой курс, но проходил я его, конечно, не особо углубляясь. Также проходил курсы по статистике, sql и другим важным вещам для DS.
Первые неудачные попытки
Так прошло еще полгода. Я, думая, что уже знаю достаточно, начинаю искать первую работу. Откликался на различные вакансии и меня пригласили на собеседование в Мегафон, им требовался стажер. Я готовился и уже начал немного радоваться, что скоро попаду стажировка, но собеседование было успешно завалено. Я мало на что сумел ответить, но зато смог понять свой истинный уровень.
В течении следующего полугода я опять проходил различные курсы, а также повторял старые, но изучая их более тщательно. Настала весна, близилось лето, в которое я твердо решил начать работать.
В апреле я начал активно откликаться на вакансии, но безуспешно. Никто не захочет брать человека без опыта, у которого даже толком показать нечего, у меня не было гита, на соревнованиях на kaggle я тоже не участвовал, не хватало усилий сделать что-то более-менее объемное и очень зря. Наличие гита, с хорошим кодом, конечно, или наличие каких-то результатов на kaggle является весьма важными вещами при устройстве на работу, особенно на первую.
Первый шанс
Уже наступило лето, а работу я так и не мог найти. Я уже начал откликаться на вакансии не связанные с it, хотелось найти хоть какую-то работу, но даже тут у меня ничего не получалось.
Конечно, в этот момент мысли “может это не мое?”, но в конце июня меня пригласили пройти собеседование на стажировку в Мегафон (да-да опять он).
К собеседованию на этот раз я подготовился лучше, да и знаний было побольше. В итоге меня приняли на стажировку.
“У меня наконец-то получилось, теперь я уже полноценный работник и сто процентов останусь в компании после стажировки” думал я на тот момент.
Первую половину стажировки мы (нас было 5 человек) изучали различные вещи связанный с работой DS. Подробно разбирались с ML, git, oracle db и подобными штуками. Во второй половине нас стали распределять по проектам. Я попал на проект связанный с рекомендацией одного из тарифа. Решал Пытался решить я эту задачу в течении полутора месяцев. Какой-то результат я получить смог, но не очень хороший. Далее было итоговое собеседование по итогам стажировки, которое я успешно завалил, единственный из всех стажеров. Потом я уже понимал, что нужно было лучше готовиться к нему, но было уже поздно. Но в тот момент мне было грустно лишь потому, что прощаюсь с коллегами. Я думал так как теперь у меня есть опыт, то в меня теперь начнут звать на собеседования, которые я успешно буду проходить и устроюсь на работу уже очень скоро. Как же ошибался...
Победа
Хоть теперь меня и стали звать на собесы, пройти их успешно не удавалось, а чаще всего общение с компанией заканчивалось на разговоре с hr, во многом из-за того, что я хотел работать 20-30 часов в неделю (так еще учился), а компании это не устраивало.
Я понял, что, если я хочу устроиться на работу мне необходимо быть готовым к полноценным 40 часам в неделю.
После многочисленных отказов, мне удалось опять попасть на стажировку, на этот раз в компанию Норбит.
Стажировка в этой компании оказалась организована достаточно круто. Каждый день у нас были тренинги, которые проводили сотрудники компании, были дз по этим тренингам, задания по программированию на python, помимо этого нам также было необходимо выполнить индивидуальные проекты, которые мы могли придумать сами, в моём случае это был телеграмм бот по введению и прогнозированию списка покупок. Далее некоторых из нас, в том числе меня, начали привлекать к настоящим задачам. Я попал на проект по системе прогнозирования оттока сотрудников.
К моменту окончанию стажировки, я не сказать, чтобы сильно верил в успех, т.к. был неудачный опыт в Мегафоне и нас было достаточно много, а скольких из нас оставят было не понятно.
Ну и как вы понимаете меня все-таки взял. Я был очень рад этому. Путь длинною 2,5 года наконец-то был пройден, но далее предстоит еще более длительный и увлекательный путь.
Если вы и дальше хотите узнавать о моей карьере то подписывайтесь на мой телеграм - https://t.me/datamisha
В сегодняшнем интервью мы пообщаемся с Ильей , человеком, что к 24 годам успел много кем поработать, от работы музыкантом до грузчика в магазине.
Самообразование - то, что помогло ему изменить свою жизнь в лучшую сторону. Сейчас Илья работает Python-разработчиком в Новосибирске. Подробнее о его истории читайте в интервью, материал получился интересным😎
1.Расскажите о себе, из какого вы города сколько вам лет и на кого учились.
Меня зовут Илья, мне 24 года, большую часть жизни прожил в Новокузнецке, сейчас живу в Новосибирске
По первому образованию я музыкант. Преподаватель ударных инструментов, если точнее. На данный момент получаю высшее техническое, перешел на 2 курс.
2. Кем вы работали ранее, до того как стали программистом?
Где я только не работал. В музыкалке преподавал какое-то время, во время учёбы работал в МТС продавцом. После армии даже в оптовой фирме продажником и логистом успел потрудиться. Ну и всякие подработки аля грузчик.
3. Кем вы работаете сейчас?
Сейчас я backend Python developer
4. Почему вы решили стать разработчиком?
Тут можно было бы сказать что-то вроде: “Не человек выбирает профессию, а профессия человека”, но это только часть правды. Как таковым разработчиком я изначально быть и не хотел, думал, что пойду в сторону машинного обучения. И возможно так и будет, хотя меня на данный момент всё устраивает.
Это обширная тема для дискуссий, но я убеждён, что на данный момент сфера IT, не имеет равных по уровню зарплат и комфорта работы. Тут я ориентируюсь на ситуацию в СНГ, в первую очередь. Да, сейчас это на хайпе, и сфера обучения программированию живёт ничуть не хуже, чем само программирование. Очень много мифов и преувеличений. Но всё равно, если подумать, вряд ли мне назовут еще одну такую профессию, где будет хотя бы столько же плюсов.
5. Какие технологии и навыки вам необходимо было изучить для того, чтобы почувствовать наконец-таки уверенность в собственных силах?
Основной язык, собственно, Python. Базы данных и Django это то, что приходится использовать в работе. Изначально я хотел в data science, так что владею Pandas, статистикой и немного понимаю в ML.
6. Расскажите подробнее о том, каким образом и как долго вы изучали Python и интересующие вас библиотеки? Лучше с ссылками на ресурсы.
Вообще, самый первый язык в моей жизни был C++. Я выбрал его просто методом тыка, так как не имел ни малейшего представления про языки. Именно на нём я ощутил первые страдания и радости по решению алгоритмических задач :)
Если кому-то такое интересно, то вот замечательный курс на Stepik по плюсам, который ведёт яндекс.
https://stepik.org/course/363/info
Так же, я проходил интенсив School 21. Это прозвучит как реклама, но я искренне рекомендую это мероприятие. Это было очень трудно, месяц почти круглосуточной работы на чистом С. По итогу я всё равно не прошел отбор, но эмоции и навыки, которые я получил там просто бесценны.
И я даже не считаю такое начало ошибкой. Всё-таки начиная с более низкоуровневых языков лучше понимаешь, что и почему вообще происходит.
С питоном я познакомился, когда готовился к ЕГЭ для поступления в университет. А на тот момент мне было уже 22 года. Вообще, это самая частая ситуация, насколько я успел заметить. Не слышал ни одного случая, когда задания для ЕГЭ делались не на питоне, соответственно, дальше люди продолжают углубляться в него по инерции.
Почему я вообще начал с предыстории о изучении языков? Потому что к питону я подходил уже совершенно иначе. Я уже относительно сносно писал на си и процесс написания кода был для меня понятен. Нужно было только привыкнуть к динамической типизации, и к тому, что многие вещи делаются сами и их не обязательно расписывать.
Значит ли это, что обязательно начинать изучать низкоуровневые языки перед тем, как браться за питон? Конечно же нет. Просто мне уже было не нужно проходить курсы, достаточно было просто обращаться к документации, и из-за этого я даже не могу посоветовать никаких полезных источников для изучения.
7. Легко ли было изучать программирование и были ли проблемы с самодисциплиной?
Знакома ли вам история, когда в 14 лет вы пишите свой первый парсер, а к совершеннолетию уже живёте на пассивный доход от собственного телеграм-бота?
Мне тоже нет.
Я не родился программистом, и вообще несколько лет назад не поверил и посмеялся бы, если бы мне сказали, что таким будет моё будущее. Так что да, это было тяжело, и тяжело до сих пор, хотя бы от ситуаций, когда разговариваю с ребятами которым 18-19 лет, и которые на голову превосходят меня во всём что касается разработки.
Проблемы с самодисциплиной были, но только до тех пор, пока я не решил, что собираюсь заниматься этим профессионально, что не хочу всю жизнь проработать на нелюбимой работе.
Мне кажется в любом деле невозможно достичь результата, если заниматься им просто так. Нужно понимать для чего это делается. Если цель просто писать скрипты для себя в качестве хобби, то это вряд ли когда-то приведёт к ощутимым результатам.
8. Насколько сложно было найти первую работу разработчиком?
Думаю, любой кто хоть раз пытался устроиться на свою первую работу в IT прекрасно знаком с парадоксальной системой, где ты стучишься в виртуальные двери компаний со своим кое-как заполненным резюме, в надежде что придёт хотя бы отклик. Хотя из каждого утюга тебе вещают, что специалистов не хватает, почему-то, на работу тебя по-прежнему не берут.
И тут я хочу выразить мнение, которое сложилось у меня на основе моего опыта, а также огромного количества разговоров с людьми из сферы.
Специалистов действительно не хватает. Толковый мидл - желанный сотрудник в любой компании, и когда говорят о 999 оферах в день, которые только и успеваешь кидать в спам, это в основном про них.
Ситуация с джунами и интернами совершенно другая. Невероятное количество курсов и хайп вокруг IT породили целую армию претендентов на вакансии низкого уровня. Портрет такого соискателя примерно такой: Я хороший парень, я понимаю на каком языке я пишу, я очень хочу работать.
Если взглянуть на это со стороны эйчара, то можно увидеть, что кого бы из них он не взял на работу, итог будет одинаковым – первое время такой сотрудник будет только отнимать время других разработчиков и не давать совершенно никакого результата. К этому прибавляется риск, что после того, как в джуна будут вложены силы, он получит реальные навыки и станет полезным в компании, то он решит перейти работать в другое место.
Так что процесс отбора довольно непрост.
Потому-то, строчка с опытом коммерческой разработки так много значит для эйчара. Как минимум это говорит о том, что человек уже попрыгал по всем граблям новичков и теперь представляет из себя готового специалиста, который после освоения в проекте уже начнёт приносить пользу.
Сам я тоже проходил через всё это. Сейчас смешно вспоминать, как в самом начале пути, преисполненный веры в себя, я приходил в офисы компаний и просился на работу. Естественно, в ответ получал лишь недоумевающие взгляды и просьбы отправить резюме на почту. Были и рассылки резюме, были тестовые задания.
Что в итоге выстрелило? Нетворкинг. Меня порекомендовали моему нынешнему работодателю, и у нас всё срослось.
Устройство на работу через знакомых это далеко не пережиток советского мышления, как может показаться. Напротив, если тебя рекомендуют, это как минимум говорит о том, что ты не просто человек с улицы, за кого попало поручаться не будут. Так что софт скилы я назвал бы основополагающими для поиска первой работы.
9. Ощутимо ли улучшаются условия труда в IT-сфере от других сфер трудовой деятельности?
Мне иногда приходится натыкаться на высказывания в духе: “Как я устал на своей галере, может поменять сферу деятельности?”.
Что ж, действительно, в разных компаниях условия труда различаются. Но обычно так говорят те, кто никогда не работал в других сферах.
Каждый раз, когда я думаю, что мне тяжело, я вспоминаю как вставал в 5 утра, для того чтобы успеть на любимую работу, где целый день я проводил на ногах, пытаясь продать вещи, которые никому не нужны, людям, которые видят в тебе лишь обслуживающий персонал. После чего уставший до смерти возвращался домой, с единственным желанием – упасть в кровать. И за всё это в конце месяца я получал весёлую смс из банка о зачислении 30 тысяч рублей.
Сейчас у меня отличный начальник, который готов выслушать меня и пойти навстречу. Мои коллеги – прекрасные люди, профессионалы своего дела. Часто приходится очень много работать, но я делаю это потому что хочу побыстрее дать результат и чему-то научиться, а не потому, что меня бьют палкой. У меня столько свободного времени, что хватает на любые дела, которые я могу себе придумать. Зарплата выше, чем везде, где я работал до этого. Мне не нужно вставать и тащиться куда-то каждое утро.
Лучше ли тут условия труда? Для меня ответ очевиден – они лучшие.
10. Расскажите подробнее о том, чем вы занимаетесь на работе.
Моя основная задача – бэкэнд. Я пишу логику приложений. Однако часто попадаются задачи на любой вкус и цвет – и фронтом приходилось заниматься и ci cd, и даже навыки ML пригождались. В целом, мне дают расти и пробоваться во все стороны. Кому-то это может показаться минусом, но для меня это огромный плюс, ведь это формирует понимание проекта в целом, а не только отдельной его части, что повышает мою ценность как специалиста.
11. Какие положительные и отрицательные стороны работы разработчиком?
Положительная сторона в том, что именно разработчики являются костяком проекта. Именно от них зависит насколько быстро и качественно будут выполнены задачи и насколько скоро проект выйдет в прод. По этому их важность на проекте не вызывает сомнений. В этом же состоит и минус. В конце концов может быть тысяча причин, почему ты не успеваешь сделать фичу, но в конечном итоге разбираться с этими причинами должен только ты.
12. Вернувшись в прошлое, какие советы вы бы дали себе в начале изучения Python?
Можно бесконечно читать о том, как работают те или иные вещи в языке, но это останется лишь голой теорией, пока ты не применишь это в проекте. Мне всегда казалось, что вот я сейчас наберу базу, а потом применю её где-нибудь. И это была ошибка.
Мой рост был бы в тысячу раз быстрее, если бы я взял сколь угодно сложный проект, и решал бы проблемы, которые получал по ходу. Да, теория важна, она помогает составить правильный взгляд, но без практики она просто не усваивается. Да, я бы сотворил монстра, на который было бы стыдно смотреть через полгода, но это были бы мои ошибки, из которых я сделал бы вывод и не повторял бы в дальнейшем.
13. Какие навыки и профессиональные компетенции положительно выделяют человека на фоне остальных кандидатов при собеседовании?
Обучаемость, коммуникабельность и прочие лозунги я советую навсегда забыть и больше никогда не упоминать. Это вещи, которые должны быть присущи любому адекватному человеку.
Любой проект на гите скажет о вас лучше, чем тысячи хвалебных слов в свой адрес. А если этот проект еще и будет приносить практическую пользу, то это уже даже какой-то продукт. Если показать свой сайтик, рассказать о функционале, о фичах которые ты выдумал, это уже повод для обсуждения на собеседовании. А софт скилы будут понятны по ходу разговора, так что на этом вообще не нужно акцентировать внимание.
14. Что можете посоветовать тем людям, что только начинают изучать Python?
Во-первых, перестать участвовать в холиварах на тему, что питон — это язык школьников и вообще он медленный. Пусть даже это была бы правда, какая разница, если за это платят?
Во-вторых, не зацикливаться на конкретном языке. Вполне возможно, что он будет не последним на вашем пути разработчика. Куда важнее постичь саму суть, как проект проходит путь от идеи до готового продукта.
Ну и в целом, какие бы трудности не встречались на пути, всегда нужно держать в голове, что любые проблемы можно преодолеть. И в конечном итоге, через какое-то время всё это окупится.
P.S. Дорогие читатели, буду признателен вам, если напишите в комментариях те вопросы, что вы хотели бы видеть в дальнейшем интервью подобного формата. Буду стараться благодаря вашей критике и советам максимально улучшать качество следующих интервью.
Мой канал в телеграмм
Если статья показалась вам интересной, то буду благодарен за подписку на мой канал IT-старт t.me/it_begin ,где я также публикую обзоры технической литературы, интервью с разработчиками и иную полезную информацию, как для действующих, так и для начинающих программистов
@Yandex.Support, Официальное обращение к вам.
Так как портал Coursera закрыл доступ к российским курсам и дал только 90 дней на завершение текущего курса, мы, нижеподписавшиеся (поставившие плюс посту) просим перенести вашу специализацию "Машинное обучение и анализ данных" (Яндекс-МФТИ) на доступную платформу для поддержки и развития российского сообщества Data Science.
https://www.coursera.org/specializations/machine-learning-da...
В качестве дополнительной меры поддержки было бы неплохо сделать этот курс бесплатным
Эта статья дает возможность познакомиться с такой методикой получения и восстановления сигнала, как Compressive Sensing.
Множество всех возможных изображений 2 на 2 с цветами, закодированными одним битом
Пространство изображений огромно, невероятно огромно, но при этом очень мало. Задумайтесь об этом на минуту. Из сетки размером всего 8 на 8 пикселей можно создать 18 446 744 073 709 551 616 различных чёрно-белых изображений. Однако из этих 18 квинтиллионов изображений очень немногие покажутся осмысленными человеческому взгляду. Большинство изображений, по сути, выглядит как QR-коды. Те, которые покажутся человеку осмысленными, принадлежат к тому множеству, которое я называю естественными изображениями. Они представляют крошечную долю пространства изображений 8 на 8. Если мы рассмотрим мегапиксельные изображения, то доля естественных изображений становится ещё меньше, почти ничтожной, однако содержит любое изображение, которое можно придумать. Так чем же эти естественные изображения так уникальны? И можем ли мы использовать эту фундаментальную разницу в собственных интересах?
Спектральное пространство
Рассмотрим два представленных ниже изображения. Оба изображения имеют размер 512 на 512 пикселя. Если вычислить гистограмму значений пикселей, то можно понять, что эти распределения идентичны. И это на самом деле так. Левое изображение такое же, как правое, только пиксели перемешаны случайным образом. Тем не менее между ними есть фундаментальное отличие. Одно выглядит как «снег» на экране старого телевизора, а другое — это лицо человека.
Слева: случайное изображение. Справа: классическое тестовое изображение женщины с тёмными волосами. Оба изображения принадлежат к пространству изображений 512 на 512
Чтобы понять фундаментальную разницу между этими изображениями, нам нужно покинуть пространство пикселей и войти в мир частотного диапазона. С точки зрения математики, преобразование Фурье — это линейное сопоставление пиксельного описания изображения с описанием в виде суммы синусов и косинусов, колеблющихся в двух измерениях. Вместо задания изображения значениями, принимаемыми каждым пикселем, мы задаём его по амплитудам каждого из составляющих его двухмерных синусов и косинусов.
Описание этих двух изображений в пространстве Фурье представлено ниже. Для отображения величины коэффициента Фурье использована логарифмическая шкала. Разница между двумя изображениями теперь очевидна. Одно имеет гораздо больше ненулевых коэффициентов Фурье, чем другое. На языке математики говорится, что естественное изображение является разреженным по базису Фурье. Именно разреженность отличает естественные изображения от случайных. Давайте же используем эту разницу с пользой для себя!
Амплитуда преобразований Фурье обоих изображений. Использована логарифмическая шкала
Воссоздание изображений по нескольким пикселям, задача с высокой степенью неопределённости
Записано всего 10% пикселей
Рассмотрим следующую ситуацию: по какой-то неизвестной причине большинство фотодатчиков камеры оказалось неисправным. Скопировав на компьютер только что сделанную фотографию своей жены (или матери, или друга), вы обнаружили, что изображение получилось таким, как показано выше. Можно ли как-то восстановить изображение?
Допустим, что мы точно знаем, какие фотодатчики исправны. Обозначив как x ∊ ℝⁿ неизвестное изображение (где n — общее количество пикселей, и мы считаем, что оно представлено в виде вектора), а как y ∊ ℝᵐ ненулевые яркости пикселей, зафиксированные датчиками, мы можем записать
Здесь C — это разреженная матрица измерений m × n. Все элементы, соответствующие неисправным фотодатчикам, равны нулю, и она содержит только m ненулевых элементов, соответствующих исправным датчикам. Следовательно, наша задача — выяснить, каким был x исходного изображения, учитывая, что мы наблюдаем только несколько его пикселей.
С точки зрения математики, это задача с высокой степенью неопределённости. У нас гораздо больше неизвестных, чем уравнений. Эта задача имеет бесконечное количество решений. Значит, вопрос сводится к тому, какое решение из бесконечного множества является тем, которое мы ищем. Естественным способом решения такой задачи было бы принятие того, что решение имеет наименьшую норму ℓ₂. Это можно формализовать как следующую задачу оптимизации:
решение которой задаётся так:
Матрица C соответствует измерениям единичных пикселей, её строки получены из единичной матрицы n × n. В такой ситуации решение задачи оптимизации не особо нам поможет, поскольку оно вернёт только повреждённое изображение (произведение матриц справа сводится к Cᵀ). Очевидно, что это нам не подходит. Но можно ли найти решение получше?
Используем разреженность в спектральном пространстве
При обсуждении уникальных особенностей естественных изображений мы увидели, что они являются разреженными в пространстве Фурье, поэтому давайте этим воспользуемся. Обозначив как Ψ отображение матрицы n × n из пространства Фурье в пространство пикселей, мы получим следующий вид уравнения измерений:
где s — преобразование Фурье x (т. е. x = Ψs). Это по-прежнему задача с высокой степенью неопределённости, но теперь у нас есть дополнительная информация о решении, которое мы ищем. Мы знаем, что оно должно быть разреженным. Введя псевдонорму ℓ₀ для s (т. е. его число ненулевых элементов), мы сможем сформулировать следующую задачу оптимизации:
К сожалению, это задача комбинаторики, очень быстро становящаяся нерешаемой. Чтобы найти её решение, потребуется проверить все возможные сочетания. К счастью в своей революционной работе 2006 года Канде et al. [1, 2] показал, что при условии разумных допущений решение изложенной выше задачи можно получить (с высокой вероятностью) при помощи решения более простой задачи:
Здесь норма ℓ₁ — это сумма абсолютных значений вектора s. Сегодня хорошо известно, что использование нормы ℓ₁ кроме превращения задачи оптимизации в выпуклую, склонно отдавать предпочтение разреженным решениям. Несмотря на свою выпуклость, эту задачу всё равно может быть достаточно сложно решить на стандартном компьютере. В дальнейшем мы используем более ослабленную версию, задаваемую следующим образом:
где λ — это задаваемый пользователем параметр, управляющий равновесием между соответствием ограничениям и необходимой разреженностью решения. Эту задачу оптимизации называют Basis Pursuit Denoising. При помощи проксимальных операторов она решается чрезвычайно быстро. Ниже представлена реализация на Julia с использованием StructuredOptimization.jl.
using StructuredOptimization
" " "
Simple implementation of basis pursuit denoising using StructuredOptimization.jl
INPUT
- - - - -
C : The measurement matrix.
Ψ : Basis in which x is assumed to be sparse.
y : Pixel measurements.
λ : (Optional) Sparsity knob.
OUTPUT
- - - - - -
x : Estimated image.
" " "
function bpdn(C, Ψ, y ; λ=0.1)
# - - > Initialize variable.
x = Variable(eltype(y), size(Ψ, 2))
# - - > Solve the compressed sensing problem.
@minimize ls(C * Ψ * x - y) + λ*norm(x, 1)
return ~x
end
Кроме того, мы можем воспользоваться тем фактом, что для спектральных преобразований произведение матрицы и вектора Ψs при помощи алгоритма быстрого преобразования Фурье можно вычислить за O(n log n) операций вместо O(n²).
using StructuredOptimization
" " "
Simple implementation of basis pursuit denoising using StructuredOptimization.jl
INPUT
- - - - -
m, n : Size of the image in both direction.
idx : Linear indices of the measured pixels.
y : Pixel measurements.
λ : (Optional) Sparsity knob.
OUTPUT
- - - - - -
x : Estimated image.
" " "
function bpdn(m, n, idx, y ; λ=0.1)
# - - > Initialize variable.
x = Variable(eltype(y), m, n)
# - - > Solve the compressed sensing problem.
@minimize ls(idct(x)[idx] - y) + λ*norm(x, 1)
return ~x
end
Хотя до сих пор мы предполагали, что Ψ является преобразованием Фурье, в этом фрагменте кода мы использовали косинусное преобразование, являющееся более эффективным преобразованием для изображений. Теперь у нас есть всё необходимое, поэтому давайте вернёмся к исходной задаче. На изображении ниже сравнивается истинное изображение с его реконструкцией при помощи ℓ₁.
Слева: оригинал изображения. Справа: изображение, воссозданное при помощи compressive sensing на основании данных всего 10% пикселей
Даже несмотря на то, что исправно работало всего 10% фотодатчиков камеры, формулировка этой задачи восстановления изображения в рамках Compressed Sensing позволяет нам воссоздать достаточно точное приближение к тому, каким было исходное изображение! Очевидно, что оно всё равно неидеально, однако учитывая обширность пространства изображений и бесконечное количество решений нашей задачи, нужно признать, что результат довольно хорош!
Заключение
Методика Compressed Sensing совершила революцию в сфере обработки сигналов. Если мы заранее знаем, что сигнал, с которым работаем, разрежен по указанному базису, то compressed sensing позволяет восстановить его по гораздо меньшему количеству сэмплов, чем предполагается по теореме выборки Найквиста-Шеннона. Кроме того, она позволяет значительно сжимать данные непосредственно на этапе получения, уменьшая таким образом необходимый объём хранилища данных. Также Compressed Sensing привела к возникновению неожиданных новых технологий, например, однопиксельной камеры, разработанной Университетом Райса, или новых техник обработки для создания визуализаций МРТ в медицине. Я не сомневаюсь, что в ближайшие несколько лет мы станем свидетелями множества новых способов применения этой методики.
Compressed sensing — это гораздо более глубокая область математики, чем можно судить по этому ознакомительному посту. Существует ещё множество не рассмотренных нами вопросов, например:
- Каково наименьшее количество необходимых измерений?
- Могут ли некоторые измерения быть информативнее других?
- Как выбирать эти измерения, имея базис Ψ?
- Существуют ли другие нормы, лучше подходящие для изображений?
Для ответа на эти вопросы потребуется гораздо больше математики, чем можно представить в посте. Если вы хотите знать больше, то крайне рекомендую изучить оригиналы статей, ссылки на которые я указал в конце. Также стоит изучить потрясающий веб-сайт Numerical Tours Габриеля Пейре или последнюю книгу Брантона и Кутца [3], а также соответствующий канал на YouTube (здесь и здесь).
Ссылки на научные работы
[1] Candès E., Romberg J., Tao T. Stable signal recovery from incomplete and inaccurate measurements. Communications on Pure and Applied mathematics. 58(8): 1207–1223. 2006.
[2] Candès E. Compressed sensing. IEEE Transactions on Information Theory. 52(4): 1289–1306. 2006.
[3] Brunton S. L. and Kutz J. N. Data-driven science and engineering: machine learning, dynamical systems, and control. Cambridge University Press, 2019.
Такую задачу поставил Little.Bit пикабушникам. И на его призыв откликнулись PILOTMISHA, MorGott и Lei Radna. Поэтому теперь вы знаете, как сделать игру, скрафтить косплей, написать историю и посадить самолет. А если еще не знаете, то смотрите и учитесь.
Попытаюсь разложить вопрос "Хочу в IT, но не знаю кем и как "
В принципе, много толковых комментов, но чаще они довольно узкие, каждый кричит из своего болота.
Самый толковый коммент: "Ты хочешь не в IT, а денег"
Читать, что люди пишут про популярные языки программирования, необходимость изучать теорию графов и дискретную математику и тому подобное, мало чем поможет в выборе, это бесконечные холивары.
Вместо это нужно понять маленькую вещь, что каждому - свое и ты не поймешь, пока не попробуешь.
ВАЖНЫЙ МОМЕНТ:
Надо возвыситься на холиварами типа "c# vs java" и "python - зло" и взглянуть шире, что оказывается, IT - это не только программисты, но еще и менеджеры, дизайнеры, аналитики, маркетологи.
И все они тоже зарабатывают довольно прилично и в их профессиях есть творческая составляющая.
Я работаю интернет-маркетологом и вижу, что мало кто представляет что может делать маркетолог.
Причем, внутри самой профессии тоже есть развитие.
Лично мне интересна автоматизация, я пишу скрипты и программы для повышения продуктивности на JS и Python, аналитика - изучаю Google Analytics, базу Data Science для анализа данных, более продвинутые инструменты для самой рекламы, типа Ad Manager и CM360.
Зарплата при этом не уступает программистам.
Так что если ты хочешь "войти в IT", то сначала окинь его широким взглядом и подумай, может тебе будет ближе что-то другое, нежели software engineering, который зачем-то отождествили с понятием IT.