Актуальний рецепт вирішення поданої проблеми (одне можливе рішення)
Вирішити цю проблему прямо зараз можна за допомогою мого улюбленого інструменту машинного навчання, vowpal wabbit, який підтримує квадратичні (кросові) функції через опцію -q .
vowpal фон wabbit
Перш ніж ми перейдемо до деталей використання. vowpal wabbit - це швидке та масштабоване онлайн-програмне забезпечення машинного навчання як для класифікації, так і для регресії. На моєму робочому столі я отримую швидкість навчання (навчання) близько 5 мільйонів функцій в секунду, без обмеження розміру даних (кількість прикладів), оскільки як онлайн-інструмент навчання не потрібно завантажувати всі дані в пам'ять. Він має багато інших привабливих особливостей: підтримка різних алгоритмів навчання, кілька функцій втрат, розрізнені функції, змішані типи функцій тощо, які виходять за рамки цього питання.
Ось 3 кроки до вирішення проблеми з коментарем:
Крок 0: Завантажте і створіть wabbit vowpal з github (див. Примітку внизу про підтримувані середовища)
Крок 1. Підготуйте навчальний набір, коли кожен рядок виглядає так:
1.0 protein1/protein2|A p1_feature1 p1_feature2 ... |B p2_feature1 ...
...
пояснення формату навчального набору:
Найменше ліве число, 1,0 , - мітка (сила взаємодії, яка може бути будь-яким числовим значенням), другий рядок ' protein1 / protein2 ' є тегом, щоб надати рядку ідентичність, IOW: "ця лінія являє взаємодію між protein1 та білок2 "; Це необов’язково, і ви можете вважати це коментарем. Цей рядок тегів також перегукується з прогнозами від моделей, щоб визначити, який прогноз належить до якого прикладу, але ми тут не прогнозуємо, ми просто моделюємо та вивчаємо нашу модель. Далі йде простір імен вхідної функції для protein1 |A
(нам потрібно визначити простір імен, щоб ми могли переходити між різними просторами імен, це не повинно бутиA
, насправді може бути будь-яке слово, але перша літера має відрізнятися між пробілами імен, щоб ми могли перетнути їх у виклику команди) з подальшим переліком вхідних функцій для protein1 p1_...
. Останнє - простір імен для protein2: |B
слідом за іменами ознак protein2 p2_...
.
Однією з красунь wabbit vowpal є те, що ви можете використовувати довільні рядки для імен функцій (це буде хешувати їх всередині, але вам все одно). Єдиними спеціальними завданнями у навчальному наборі є:
- пробіли (очевидно)
|
, для префіксації функцій введення та пробілів імен та
:
відокремити імена ознак від їх значень
Тут :
не використовується, оскільки ми припускаємо, що кожне ім'я функції білка являє собою булеве значення (існування), тому їх значення за замовчуванням 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.
HTH