<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Математик среди биологов: заметки с тегом ошибки</title>
<link>https://antonlyakh.ru/blog/tags/oshibki/</link>
<description>Я немного умею складывать, но от вычитания у меня всегда кружится голова</description>
<author>Антон Лях</author>
<language>ru</language>
<generator>E2 (v3559; Aegea)</generator>

<itunes:owner>
<itunes:name>Антон Лях</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Я немного умею складывать, но от вычитания у меня всегда кружится голова</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Недостаток вычисления определителя целоисчисленных матриц на Питоне</title>
<guid isPermaLink="false">496</guid>
<link>https://antonlyakh.ru/blog/all/nedostatok-vychisleniya-opredelitelya-celoischislennyh-matric-na/</link>
<pubDate>Fri, 28 Jun 2024 22:13:50 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/nedostatok-vychisleniya-opredelitelya-celoischislennyh-matric-na/</comments>
<description>
&lt;p&gt;&lt;i&gt;Целоисчисленная матрица&lt;/i&gt; — это матрица, все элементы которой являются целыми числами.&lt;/p&gt;
&lt;p&gt;Определитель целоисчисленной матрицы — тоже целое число. (Очевидно же.)&lt;/p&gt;
&lt;p&gt;Используем класс целоисчисленных матриц, элементы которых могут принимать только значения из заданного множества целых чисел. (Такие матрицы называют &lt;i&gt;богемными.&lt;/i&gt;)&lt;/p&gt;
&lt;p&gt;Очевидно, что если множество возможных элементов матриц конечно, то и число возможных богемных матриц заданного размера тоже конечно.&lt;/p&gt;
&lt;p&gt;Пусть мы ищем среди всех богемных матриц только те, определитель которых равен нулю. Ищем при помощи кода на Питоне. Определитель матрицы вычисляем так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;dt = np.linalg.det( a )&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;И вот тут возможна ошибка.&lt;/p&gt;
&lt;p&gt;Если мы будем выбирать матрицы по условию &lt;kbd&gt;dt==0&lt;/kbd&gt;, то получим неверный результат.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Using that test (dt==0) Python got the right number of [...] matrices when mdim=2 or mdim=3, but the test dt==0 failed a few times when mdim=4, and (after a long time computing) reported 15,015,617 singular matrices; the true number is 15,099,201. This is because &lt;kbd&gt;np.linalg.det&lt;/kbd&gt; is &lt;i&gt;computing the determinant from a numerical factoring&lt;/i&gt; (which introduces rational numbers and rounding error) and the roundoff error means that sometimes a zero determinant was not being reported as precisely zero.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Правильный результат получится если мы используем условие &lt;kbd&gt;dt&amp;lt;0.5&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://computational-discovery-on-jupyter.github.io/Computational-Discovery-on-Jupyter/Contents/bohemian-matrices.html#table-of-results"&gt;https://computational-discovery-on-jupyter.github.io/Computational-Discovery-on-Jupyter/Contents/bohemian-matrices.html#table-of-results&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Провал первой попытки прослеживания путей перемещения протист</title>
<guid isPermaLink="false">466</guid>
<link>https://antonlyakh.ru/blog/all/proval-pervoy-popytki-proslezhivaniya-putey-peremescheniya-proti/</link>
<pubDate>Fri, 10 Mar 2023 20:50:45 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/proval-pervoy-popytki-proslezhivaniya-putey-peremescheniya-proti/</comments>
<description>
&lt;p&gt;&lt;i&gt;Профессор Плейшнер шел по улице. Проходя мимо явочной квартиры, он мельком взглянул на окно. Занавеска была отодвинута. На подоконнике стояло семнадцать утюгов и один цветок. «Явка провалена», — понял Плейшнер.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Это третья, аналитическая заметка из &lt;a href="https://antonlyakh.ru/blog/all/seriya-zametok-ob-analize-traektoriy-dvizheniya-protist/"&gt;серии об анализе траектории движения протист&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://antonlyakh.ru/blog/all/uluchshaem-kachestvo-video-dvizheniya-protist-i-narezaem-ego-na/"&gt;В первой заметке&lt;/a&gt; объяснил, как с помощью ffmpeg осветлить видео снятое на фотоаппарат,  соединенный с микроскопом.&lt;/p&gt;
&lt;p&gt;Здесь рассказываю, что полученное видео не подошло для прослеживания траекторий, нужно дальше работать над его качеством и, хоть немного, разобраться в методах анализа изображений и прослеживания траекторий.&lt;/p&gt;
&lt;p&gt;Напомню, что видео необходимо для построения траекторий движения микроорганизмов.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br /&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Для решения задачи использую Трекмейт (&lt;a href="https://imagej.net/plugins/trackmate/"&gt;TrackMate&lt;/a&gt;).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/trackmate-logo.png" width="402" height="236" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Трекмейт — это плагин к Фи-джи (Fiji), который предназначен для прослеживания, визуализации, редактирования и анализа траекторий движения объектов, снятых на видео. Интерфейс Трекмейта состоит из последовательности диалоговых окон, в которых необходимо выбрать алгоритмы обработки видеоизображений и указать параметры этих алгоритмов.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/trackmate-ui-s.png" width="1026" height="553" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;big&gt;Мои попытки научить Трекмейт проследить траектории микроорганизмов провалились.&lt;/big&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br /&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Так вышло потому, что Трекмейт неверно выделил объекты предустановленными методами, то есть неверно выполнил &lt;i&gt;сегментацию изображений.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Пробовал &lt;i&gt;пороговую сегментацию&lt;/i&gt; (tresholding detector) и &lt;i&gt;методы сегментации по инвариантным точкам&lt;/i&gt; (invariant feature detectors): LoG (Laplassian of Gaussian, Лапласиан Гаусиана :), DoG (differences of Gaussians, разница Гаусианов), Hessian (детектор Гессе).&lt;/p&gt;
&lt;p&gt;Пороговая сегментация нашла всего один объект, а алгоритмы сегментации по инвариантным точкам приняли за объект каждое пятнышко.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/hessian-detect-every-spot.png" width="819" height="566" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Детектор Гессе приметил каждое пятнышко&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Другие доступные методы сегментации не попробовал.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br /&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Далее взял результаты сегментации изображения детектором Гессе и, путем интуитивно-случайного подбора параметров (не записал их значения), оставил выделенными только нужные организмы и несколько мусорных пятен.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/hessian-detector-optimized.png" width="1000" height="476" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Однако их траектории проследить не удалось.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/found-tracks.png" width="1000" height="476" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Трекинг построил слишком короткие пути и не все относятся к протистам.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/too-many-tracks.png" width="1000" height="476" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Много коротких, частично некорректных треков — это провал&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br/&gt;&lt;br /&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Cделал следующие выводы:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Необходимо хотя бы в общих чертах понимать, как работают алгоритмы сегментации и трекинга, как на них влияют параметры и когда их стоит применять, а когда нет.&lt;/li&gt;
&lt;li&gt;Качество видеоизображений следует еще более улучшить: повысить контраст между подвижными организмами и статичным фоном, фон сгладить или вообще удалить.&lt;/li&gt;
&lt;li&gt;Желательно автоматически создать маску, на которой организмы будут отмечены цветом, а фон будет белым.&lt;/li&gt;
&lt;li&gt;Следует попробовать иные способы сегментации или другие программы выделения треков.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Об этом расскажу в другой раз.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br /&gt;
&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Всем прочитавшим — Лаплассиана Гауссинана :)&lt;/p&gt;
</description>
</item>

<item>
<title>Ошибки программирования. Забыл про юникод</title>
<guid isPermaLink="false">332</guid>
<link>https://antonlyakh.ru/blog/all/oshibki-programmirovaniya-1/</link>
<pubDate>Fri, 21 Feb 2020 12:39:20 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/oshibki-programmirovaniya-1/</comments>
<description>
&lt;p&gt;В коде повторяю одни и те же ошибки. Из-за них ничего не работает. Вот одна.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;При сравнении строк без учета регистра забыл, что у меня юникод.&lt;/i&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;if (strtolower($input_name) == $name) { ... }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В результате функция strtolower вместо строчных русских букв выдала мусор. Сравнение не сработало. Процесс пошел по другой ветке. Пользователь в панике.&lt;/p&gt;
&lt;p&gt;А правильно использовать mb_strtolower.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;if (mb_strtolower($input_name) == $name) { ... }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;То же самое относиться и к другим функциям работы со строками. При юникоде и других кодировках использовать функции с префиксом &lt;i&gt;mb_&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Успехов.&lt;/p&gt;
</description>
</item>


</channel>
</rss>