Алгоритм PLS-DA в python
Алгоритм частичных алгоритмов наименьших квадратов (PLS) реализован в библиотеке scikit-learn, как описано здесь:
http://scikit-learn.org/0.12/auto_examples/plot_pls.html
В случае, когда y является двоичным вектором, используется вариант этого алгоритма, алгоритм Partial Lesscrimlections Discriminant Analysis (PLS-DA).
Модуль PLSRegression в sklearn.pls реализует также этот двоичный случай? Если нет, где я могу найти для него реализацию python?
В моем двоичном случае я пытаюсь использовать PLSRegression:
pls = PLSRegression(n_components=10)
pls.fit(x, y)
x_r, y_r = pls.transform(x, y, copy=True)
В функции преобразования код получает исключение в этой строке:
y_scores = np.dot(Yc, self.y_rotations_)
Сообщение об ошибке "ValueError: матрицы не выровнены". Yc - нормализованный вектор y, а self.y_rotations_ = [1.].
В функции fit, self.y_rotations_ = np.ones(1), если исходный y является одномерным вектором (y.shape 1= 1).
Ответы
Ответ 1
PLS-DA - действительно "трюк" для использования PLS для категориальных результатов вместо обычного непрерывного вектора/матрицы. Трюк состоит в создании фиктивной идентичной матрицы нулей/единиц, которая представляет членство в каждой из категорий. Поэтому, если у вас есть предсказанный бинарный результат (т.е. Мужчина/женщина, да/нет и т.д.), Ваша фиктивная матрица будет иметь два столбца, представляющие членство в любой категории.
Например, рассмотрим гендерный итог для четырех человек: 2 мужчин и 2 женщины. Фиктивную матрицу следует кодировать следующим образом:
import numpy as np
dummy=np.array([[1,1,0,0],[0,0,1,1]]).T
где каждый столбец представляет членство в двух категориях (мужчина, женщина)
Тогда ваша модель для данных в переменной Xdata (форма 4 строки, произвольные столбцы) будет:
myplsda=PLSRegression().fit(X=Xdata,Y=dummy)
Прогнозируемые категории могут быть извлечены из сравнения двух переменных индикатора в mypred:
mypred= myplsda.predict(Xdata)
Для каждой строки/случая предсказанный пол таков, что с самым высоким прогнозируемым членством.
Ответ 2
Вы можете использовать пакет линейного анализа дискриминации в SKLearn, он будет принимать целые числа для значения y:
LDA-SKLearn
Вот краткое руководство по использованию LDA:
Учебник по Sklearn LDA
Ответ 3
Не совсем то, что вы ищете, но вы проверяете эти два потока о том, как вызвать собственный (код c/С++) из реализации python и С++ PLS libs:
Частичная библиотека наименьших квадратов
Вызов C/С++ из python?
вы можете использовать boost.python, чтобы вставить код С++ в python. Вот пример, взятый с официального сайта :
Следуя традиции C/С++, давайте начнем с "привет, мир". Функция С++:
char const* greet()
{
return "hello, world";
}
может отображаться на Python, написав оболочку Boost.Python:
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
Что это. Были сделаны. Теперь мы можем создать это как общую библиотеку. Результирующая DLL теперь видна Python. Вот пример сеанса Python:
>>> import hello_ext
>>> print hello_ext.greet()
hello, world