Алгоритм 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