<?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/php-2/</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">522</guid>
<link>https://antonlyakh.ru/blog/all/singulyarnoe-razlozhenie-matricy-na-php/</link>
<pubDate>Tue, 10 Jun 2025 16:04:46 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/singulyarnoe-razlozhenie-matricy-na-php/</comments>
<description>
&lt;p&gt;Это заметка-напоминалка о пхп-библиотеках, позволяющих найти &lt;i&gt;сингулярное разложение матрицы (SVD — singular value decomposition)&lt;/i&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/svd-!.png" width="800" height="230" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Из &lt;i&gt;Bellegarda (2005) &lt;a href="https://doi.org/10.1109/MSP.2005.1511825"&gt;Latent semantic mapping&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;p class="foot"&gt;Наилучший вариант ↓&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="https://github.com/vladkolodka/SVD/tree/master"&gt;PHP — Singular value decomposition SVD&lt;/a&gt; Влада Колодки&lt;/b&gt;.&lt;br /&gt;
Без зависимостей. Один файл &lt;kbd&gt;svd.php&lt;/kbd&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;include &amp;quot;svd.php&amp;quot;;

// Конструирую матрицу
$matrix = [['0.00', '0.00', '0.56', '0.56'. '0.00', '0.00', '1.00'], 
           ['0.49', '0.71', '0.00', '0.00'. '0.00', '0.71', '0.00'],
           ['0.49', '0.71', '0.00', '0.00'. '0.00', '0.71', '0.00'],
           ['0.72', '0.00', '0.00', '0.00'. '1.00', '0.00', '0.00'],
           ['0.00', '0.00', '0.83', '0.83'. '0.00', '0.00', '0.00']];

// Создаю класс для работы с матрицами
$matrixClass = new Matrix;

// Вычисляю SVD
$USV = $matrixClass-&amp;gt;svd($matrix);

/*
 Получаю ассоциативный массив, в котором M = USV.
 ВНИМАНИЕ: матрица V уже транспонирована.

 $matrices['U'] = $U;
 $matrices['S'] = $S;
 $matrices['W'] = $W;
 $matrices['V'] = $this-&amp;gt;matrixTranspose($V);
 $matrices['Rank'] = $rank;
 $matrices['K'] = $k;
*/

// Восстанавливаю исходную матрицу
$input = $matrixClass-&amp;gt;matrixMultiplication($USV['U'] ,$matrixClass-&amp;gt;matrixMultiplication($USV['S'], $USV['V']));
$input = $matrixClass-&amp;gt;matrixRound($input);&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;
&lt;p class="foot"&gt;Тяжеловесная библиотека ↓&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="https://github.com/markrogoyski/math-php"&gt;MathPHP&lt;/a&gt; — Powerful modern math library for PHP&lt;/b&gt;&lt;br /&gt;
Огромное число разнообразных функций. Установка через композер.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/markrogoyski/math-php?tab=readme-ov-file#linear-algebra---matrix"&gt;Полный перечень функций для работы с матрицами&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="php"&gt;use MathPHP\LinearAlgebra\Matrix;
use MathPHP\LinearAlgebra\MatrixFactory;

// Create an m × n matrix from an array of arrays
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
$A = MatrixFactory::create($matrix);

// Basic matrix data
$array = $A-&amp;gt;getMatrix();  // Original array of arrays
$rows  = $A-&amp;gt;getM();       // number of rows
$cols  = $A-&amp;gt;getN();       // number of columns

// Matrix decompositions
// LU decomposition
$LU = $A-&amp;gt;luDecomposition();
$L  = $LU-&amp;gt;L;  // lower triangular matrix
$U  = $LU-&amp;gt;U;  // upper triangular matrix
$P  = $LU-P;   // permutation matrix

// QR decomposition
$QR = $A-&amp;gt;qrDecomposition();
$Q  = $QR-&amp;gt;Q;  // orthogonal matrix
$R  = $QR-&amp;gt;R;  // upper triangular matrix

// SVD (Singular Value Decomposition)
$SVD = $A-&amp;gt;svd();
$U   = $A-&amp;gt;U;  // m x m orthogonal matrix
$V   = $A-&amp;gt;V;  // n x n orthogonal matrix
$S   = $A-&amp;gt;S;  // m x n diagonal matrix of singular values
$D   = $A-&amp;gt;D;  // Vector of diagonal elements from S

// Crout decomposition
$LU = $A-&amp;gt;croutDecomposition();
$L  = $LU-&amp;gt;L;  // lower triangular matrix
$U  = $LU-&amp;gt;U;  // normalized upper triangular matrix

// Cholesky decomposition
$LLᵀ = $A-&amp;gt;choleskyDecomposition();
$L   = $LLᵀ-&amp;gt;L;   // lower triangular matrix
$LT  = $LLᵀ-&amp;gt;LT;  // transpose of lower triangular matrix

// Eigenvalues and eigenvectors
$eigenvalues   = $A-&amp;gt;eigenvalues();   // array of eigenvalues
$eigenvecetors = $A-&amp;gt;eigenvectors();  // Matrix of eigenvectors

// Solve a linear system of equations: Ax = b
$b = new Vector(1, 2, 3);
$x = $A-&amp;gt;solve($b);&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;
&lt;p class="foot"&gt;Библиотека для машинного обучения ↓&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="https://php-ml.readthedocs.io/"&gt;PHP-ML&lt;/a&gt; — Machine learning library for PHP&lt;/b&gt;&lt;br /&gt;
Не по теме. Не понял, есть ли SVD.&lt;/p&gt;
</description>
</item>

<item>
<title>Прием программирования: Вовремя остановиться</title>
<guid isPermaLink="false">438</guid>
<link>https://antonlyakh.ru/blog/all/priem-programmirovaniya-vovremya-ostanovitsya/</link>
<pubDate>Tue, 31 Aug 2021 22:13:58 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/priem-programmirovaniya-vovremya-ostanovitsya/</comments>
<description>
&lt;p&gt;Иногда я пишу одноразовый код, который, например, что-то переносит из файла в базу данных. Этот код мне понадобиться один раз, но удалять его после использования жалко.&lt;/p&gt;
&lt;p&gt;Для того, чтобы код нельзя было больше выполнить, я внедряю в него оператор die().&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/program-die.png" width="800" height="361" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Главное — вовремя остановиться.&lt;/p&gt;
</description>
</item>

<item>
<title>Приемы веб-программирования. Разрешить Апачу сначала искать файлы в текущем каталоге</title>
<guid isPermaLink="false">385</guid>
<link>https://antonlyakh.ru/blog/all/priemy-veb-programmirovaniya-razreshit-apachu-snachala-iskat-fay/</link>
<pubDate>Wed, 10 Jun 2020 16:13:07 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/priemy-veb-programmirovaniya-razreshit-apachu-snachala-iskat-fay/</comments>
<description>
&lt;p&gt;Памятка тем, кто (до сих пор) руками пишет веб-движки на ПХП.&lt;/p&gt;
&lt;p&gt;У вас есть два файла с одинаковым названием ’konstituciya.php’ в текущем и каком-то системном каталоге. Файл в системном каталоге делает основную работу, например, выводит перечень статей конституции. Файл в текущем каталоге устанавливает локальные настройки, например, вносит в конституцию поправки, а потом вызывает файл из системного каталога. Чтобы поправки вступили в силу, необходимо, чтобы первым был вызван файл из текущего каталога. Вот так:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;konstituciya.php → ./system/konstituciya.php&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Чтобы установить такую последовательность вызовов, в .htaccess в списке путей первой поставьте точку, а потом перечислите прочие каталоги:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;php_value include_path &amp;quot;.:/home/system&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Тогда код выполнится правильно:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Сначала вызовет файл из текущего каталога с поправками, а потом системный файл с основными законами
   include_once &amp;quot;konstituciya.php&amp;quot;;&lt;/code&gt;&lt;/pre&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>

<item>
<title>Быстро типографируем текст перед показом на странице</title>
<guid isPermaLink="true">https://antonlyakh.ru/blog/all/bystro-tipografiruem-tekst-pered-pokazom-na-stranice/</guid>
<link>https://antonlyakh.ru/blog/all/bystro-tipografiruem-tekst-pered-pokazom-na-stranice/</link>
<pubDate>Tue, 24 Oct 2017 00:31:06 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/bystro-tipografiruem-tekst-pered-pokazom-na-stranice/</comments>
<description>
&lt;p&gt;Перед показом текста на странице его надо обработать по правилам типографики. Это может сделать «&lt;a href="https://www.artlebedev.ru/typograf/"&gt;Типограф&lt;/a&gt;» Студии Лебедева, «&lt;a href="https://github.com/typograf"&gt;Типограф&lt;/a&gt;» Дениса Селезнева или свой движок.&lt;/p&gt;
&lt;p&gt;Если текст написан и не меняется, то  его не надо все время типографить. Достаточно оттипографить один раз, сохранить результат и выводить его до тех пор, пока текст снова не изменится.&lt;/p&gt;
&lt;p&gt;Для этого использую такой механизм.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Создаю исходный текст и сохраняют его в файле с расширением «in».&lt;/li&gt;
&lt;li&gt;В коде страницы вызываю функцию &lt;nobr style="font-family: SegoeUI"&gt;typo_file( ’имя_файла_с_текстом’ )&lt;/nobr&gt;, которая выводит на страницу оттипографированый текст. Имя файла указывается &lt;i&gt;без расширения.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Функция &lt;nobr style="font-family: SegoeUI"&gt;typo_file( $filename )&lt;/nobr&gt; делает следующее:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Ищет файл &lt;nobr style="font-family: SegoeUI"&gt;$filename&lt;/nobr&gt; с расширением «in».&lt;/li&gt;
&lt;li&gt;Ищет файл с таким же именем и расширением «out».&lt;/li&gt;
&lt;li&gt;Сравнивает даты модификации файлов.&lt;/li&gt;
&lt;li&gt;Если «out» изменен позже, чем «in», возвращает содержимое «out».&lt;/li&gt;
&lt;li&gt;В противном случае типографит содержимое «in», записывает его в «out» и возвращает результат в основной поток.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Код функции &lt;nobr style="font-family: SegoeUI"&gt;&lt;b&gt;typo_file&lt;/b&gt;&lt;/nobr&gt; на ПХП:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;?php

function typo_file( $file_name, $input_extension = '.in', $output_extension = '.out' ) {
   if ( !file_exists($file_name.$input_extension) )
      return '';

   $in_time  = filemtime($file_name.$input_extension);
   $out_time = file_exists($file_name.$output_extension) ? filemtime($file_name.$output_extension) : $in_time-1;

   if ($out_time &amp;lt; $in_time) {
      // типографим содержимое файла
      $in_file  = file_get_contents( $file_name.$input_extension );
      $out_file = typo( $in_file );
      // записываем данные в новый файл
      file_put_contents( $file_name.$output_extension, $out_file );
   } else
      $out_file = file_get_contents( $file_name.$output_extension );

   return $out_file;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Функция &lt;nobr style="font-family: SegoeUI"&gt;&lt;b&gt;typo&lt;/b&gt;&lt;/nobr&gt; типографит текст удобным вам способом.&lt;/p&gt;
&lt;p&gt;Содержимое основной страницы выглядит так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;?php
// …

echo typo_file( ‘page_content’ );

// …
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вместо файла с результатом, можно использовать базу данных. В нее заносить оттипографированный текст и время последнего изменения. Ключ для доступа к записи — имя файла.&lt;/p&gt;
</description>
</item>

<item>
<title>Вырезаем растровую графику из СВГ</title>
<guid isPermaLink="true">https://antonlyakh.ru/blog/all/vyrezaem-pixelnuyu-grafiku-iz-vectornogo-fayla/</guid>
<link>https://antonlyakh.ru/blog/all/vyrezaem-pixelnuyu-grafiku-iz-vectornogo-fayla/</link>
<pubDate>Sun, 26 Feb 2017 11:03:37 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/vyrezaem-pixelnuyu-grafiku-iz-vectornogo-fayla/</comments>
<description>
&lt;p&gt;Столкнулся с задачей.&lt;/p&gt;
&lt;p&gt;Есть фотография большого размера (более 4 тыс. пикселей по ширине), на которой запечатлены части живых организмов.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/big-photo-of-ligophorus-haptor.jpg" width="800" height="600" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Большая фотография с прикрепительными структурами плоского паразитического червя&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Организмы — это паразиты. Мизерные примитивные червячки из &lt;a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%BE%D0%B3%D0%B5%D0%BD%D0%B5%D0%B8"&gt;класса Моногеней&lt;/a&gt;, живущие на жабрах рыб. К жабрам они крепятся при помощи крючков.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/ligophorus-on-liza-gills.gif" width="800" height="185" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Рисунок головы кефали из работы &lt;a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B8%D0%B4%D0%BE%D0%B2,_%D0%90%D0%BD%D0%B0%D1%82%D0%BE%D0%BB%D0%B8%D0%B9_%D0%9D%D0%B8%D0%BA%D0%BE%D0%BB%D0%B0%D0%B5%D0%B2%D0%B8%D1%87"&gt;Световидова&lt;/a&gt; (1964); рисунок жабр и сидящего на них паразита из работы &lt;a href="http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0142365"&gt;Лопеса-Беленгуэра с сотоварищами (2015)&lt;/a&gt;&lt;/div&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/diversity-of-haptoral-hooks.png" width="800" height="507" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Метод главных компонент описывает разнообразие форм прикрепительных крючков разных родов моногеней. График из &lt;a href="http://link.springer.com/article/10.1007/s11230-011-9303-1"&gt;статьи Вигнона (2011)&lt;/a&gt;&lt;/div&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/digitized-hooks.gif" width="800" height="600" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Проблема в том, что готовый файл слишком много «весит». Исходный джипег размером 800 Кб, после обводки и сохранения в СВГ, толстеет до 12 Мб. В результате мне присылают мегатонные свгешки с внедренной графикой, которые надо разместить на сервере, а он не резиновый.&lt;/p&gt;
&lt;p&gt;Я не могу выбросить фото и загрузить на сервер только векторные кривые. Потому что контуры обрисовывают несколько человек, у каждого свои особенности рисования, они ошибаются, и результаты надо перепроверять. А фотография помогает проверить правильность построения контуров.&lt;/p&gt;
&lt;p&gt;Я несколько часов пытался уменьшить размер свг-файла с графикой без потери качества. Попробовал уменьшить в Инскейпе, не получилось — размеры фотографии и свг-файла остались огромными. Потом разобрался с форматом и нашел решение.&lt;/p&gt;
&lt;p&gt;Формат СВГ поддерживает два способа хранения изображений.&lt;/p&gt;
&lt;p&gt;Первый, когда графический файл внедрен в СВГ. Это не оптимальный способ, потому что  файл не сжат. Изображение состоит из последовательности символов в &lt;a href="https://ru.wikipedia.org/wiki/Base64"&gt;позиционной системе счисления с основанием 64&lt;/a&gt; (base64). Отсюда 800 Кб превращаются в 12 Мб.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/image-embeded-in-svg.png" width="800" height="287" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Фотография, внедренная внутрь свг-файла, занимает очень много места&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Второй, когда СВГ хранит ссылку на внешний графический файл. Тогда СВГ содержит только &lt;a href="http://antonlyakh.ru/blog/all/koordinaty-krivyh-iz-svg-fayla/"&gt;описание кривых&lt;/a&gt;, а фотография хранится отдельно. Размер свг-файла становится маленьким.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/svg-jpg.png" width="800" height="300" 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;/p&gt;
&lt;p&gt;В результате написал скрипт на ПХП. Он извлекает из СВГ фотографию, сохраняет ее в виде отдельного джипега и вставляет в СВГ ссылку на этот джипег. Джипег хранится локально и называется так же, как и свг-файл.&lt;/p&gt;
&lt;p&gt;Скрипт умный. Если в разных файлах используется одна и та же фотография, скрипт сохранит ее всего один раз и во всех файлах будет правильно на нее ссылаться. Это экономит место.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://antonlyakh.ru/done/extract-images-from-svg/"&gt;&lt;b&gt;Скрипт для всех&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div style="border: 5px solid #00ab66; padding: 6px 8px; margin-left: -14px; border-radius: 2px; margin-top: 2em"&gt;&lt;p&gt;Эта заметка описывает этап создания &lt;a href="http://marineparasites.org/"&gt;виртуальной  коллекции паразитов рыб Мирового океана&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description>
</item>

<item>
<title>Выполнение R скриптов на ПХП</title>
<guid isPermaLink="true">https://antonlyakh.ru/blog/all/vypolnenie-er-skriptov-na-php/</guid>
<link>https://antonlyakh.ru/blog/all/vypolnenie-er-skriptov-na-php/</link>
<pubDate>Thu, 01 Sep 2016 17:22:55 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/vypolnenie-er-skriptov-na-php/</comments>
<description>
&lt;p&gt;Надо выполнить сложные статистические вычисления с помощью ПХП. Писать свои модули сложно, долго и бессмысленно. Придумал интегрироваться с &lt;a href="https://www.r-project.org/"&gt;Эр&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/kachkaev/php-r"&gt;Библиотека &lt;b&gt;php-r&lt;/b&gt;&lt;/a&gt; Александра Качкаева позволяет выполнять скрипты Эр на ПХП. Примеры убедительны, но сам еще не пробовал.&lt;/p&gt;
&lt;p&gt;У кого есть опыт работы с php-r?&lt;/p&gt;
&lt;p&gt;С какими другими модулями для выполнения многомерных статистических расчетов на ПХП вы знакомы (дискриминантный анализ, кластерный анализ, ординационный анализ)?&lt;/p&gt;
</description>
</item>


</channel>
</rss>