Актуальный рецепт решения представленной проблемы (одно из возможных решений)
Решить эту проблему довольно просто, используя мой любимый инструмент машинного обучения, vowpal wabbit, который поддерживает квадратичные (перекрестные) функции с помощью опции -q .
vowpal ваббит фон
Прежде чем перейти к деталям использования. vowpal wabbit - это быстрое и масштабируемое онлайн-программное обеспечение для машинного обучения, предназначенное для классификации и регрессии Я получаю скорость обучения (обучения) около 5 миллионов функций в секунду на своем рабочем столе без ограничения размера данных (количество примеров), поскольку в качестве онлайн-инструмента обучения он не требует загрузки полных данных в память. У него много других привлекательных функций: поддержка различных алгоритмов обучения, функций множественных потерь, разреженных функций, смешанных типов объектов и т. Д., Которые выходят за рамки этого вопроса.
Вот 3 шага к решению проблемы с комментарием:
Шаг 0: Загрузите и соберите vowpal wabbit с github (см. Примечание внизу о поддерживаемых средах)
Шаг 1: Подготовьте обучающий набор, где каждая строка выглядит следующим образом:
1.0 protein1/protein2|A p1_feature1 p1_feature2 ... |B p2_feature1 ...
...
объяснение формата обучающего набора:
Крайнее левое число, 1.0 , является меткой (сила взаимодействия, которая может быть любым числовым значением), вторая строка ' protein1 / protein2 ' является меткой, чтобы придать линии идентичность, IOW: «эта строка представляет взаимодействие между protein1 и protein2" ; Это необязательно, и вы можете думать об этом как о комментарии. Эта строка тега также отражена в прогнозах моделей, чтобы определить, какой прогноз относится к какому примеру, но здесь мы не прогнозируем, мы просто моделируем и изучаем нашу модель. Далее идет пространство имен входной функции для protein1 |A(нам нужно определить пространство имен, чтобы мы могли переходить между различными пространствами имен, это не обязательно должно бытьA, может быть любым словом на самом деле, но первая буква должна отличаться между пространствами имен, чтобы мы могли их пересечь в вызове команды), а затем список функций ввода для protein1 p1_.... Последним идет пространство имен для protein2: |Bза ним следуют именные признаки protein2 p2_....
Одна из прелестей vowpal wabbit заключается в том, что вы можете использовать произвольные строки для имен объектов (они будут хэшироваться внутри, но вам все равно). Единственные специальные символы в тренировочном наборе:
- пробелы (очевидно)
|, для префикса входных объектов и пространств имен, и
: отделить имена объектов от их значений
Здесь :не используется, потому что мы предполагаем, что каждое имя свойства белка представляет логическое значение (существование), поэтому их значения по умолчанию равны 1и им не нужны явные значения.
Теперь вы можете запустить vowpal_wabbit (имя исполняемого файла vw) с, -q ABчтобы автоматически создавать перекрестные элементы (иначе говоря, термины взаимодействия) между всеми возможными парами объектов, где один объект выбран из protein1 (пространство имен начинается с A), а другой - protein2 ( пространство имен, начинающееся с B). vowpal_wabbit прочитает данные, изучит и создаст модель с весами для каждой комбинации признаков, что приведет к некоторому взаимодействию между парой белков. Здесь, вместо того, чтобы работать vwнапрямую, мы запустим его через vw-varinfoутилиту-оболочку, которая поставляется с vowpal wabbit, как наш последний шаг. vw-varinfoзапускается vwдля создания модели и выводит ее в удобочитаемом виде.
Шаг 3: вызовите vw-varinfo следующим образом:
vw-varinfo -q AB -c --passes 20 your_data_set_file
vw-varinfo передаст все параметры ( -q ... -c --passes ...) как есть vw. -q ABНеобходим только для пересечения двух пространств имен объектов. Я добавил еще одну опцию выше (запустить несколько проходов), которая, я считаю, даст лучшие результаты.
Эта команда вызовет vowpal wabbit ( vw) для обучения набора данных и напечатает вывод, который, я полагаю, вы ищете: все взаимодействия элементов в порядке силы и их относительные веса.
Пример ввода и вывода
Предположим, что ваш вклад prot.datвключает трехстороннее взаимодействие между 3 белками:
1.0 protein1/protein2|A a b |B k m
0.6 protein2/protein3|A k m |B b c d
2.2 protein1/protein3|A a b |B b c d
Это намеренно очень минималистичный пример. vwу меня не должно быть проблем с гораздо большими наборами данных (например, миллионами строк, сотнями функций), также я варьировал метки силы взаимодействия в примерах. Если в вашем случае взаимодействие - это логическое «да» или «нет», просто используйте 0(нет взаимодействия) или 1(взаимодействие существует) в качестве 1-го поля в каждой строке.
Бег:
vw-varinfo -q AB -c --passes 20 prot.dat
Приведет все возможные взаимодействия (игнорировать пространства имен Aи Bв выходных данных) и их веса:
FeatureName HashVal MinVal MaxVal Weight RelScore
A^k 220268 0.00 1.00 +0.3804 100.00%
A^k^B^k 254241 0.00 0.00 +0.3804 100.00%
A^k^B^m 93047 0.00 0.00 +0.3804 100.00%
B^k 178789 0.00 1.00 +0.1011 26.58%
B^m 17595 0.00 1.00 +0.1011 26.58%
[... trimmed for brevity ...]
A^m^B^m 141879 0.00 0.00 +0.0000 0.00%
Constant 116060 0.00 0.00 +0.1515 0.00%
A^b 139167 0.00 1.00 -0.0641 -16.86%
A^b^B^k 204424 0.00 0.00 -0.1233 -32.43%
A^b^B^m 43230 0.00 0.00 -0.1233 -32.43%
Показывая, что в этих данных самыми сильными участниками любых взаимодействий в целом являются: 1) простое наличие kпризнака, 2) kпризнак, взаимодействующий с самим собой (при условии, что он есть у обоих белков), и 3) kвзаимодействующий с ним m. в то время как самые слабые (отрицательный вклад во взаимодействие с белками) являются bпризнаком в сочетании с mпризнаком
Вот страница HOWTO на vw-varinfo
vowpal wabbit собирается из исходного кода (см. ссылку выше) и работает в Linux (и, возможно, в других Unixes), Mac OS-X и Windows.
НТН