python中的PLS-DA算法

时间:2013-08-22 20:23:52

标签: python scikit-learn

偏最小二乘(PLS)算法在scikit-learn库中实现,如下所述: http://scikit-learn.org/0.12/auto_examples/plot_pls.html 在y是二进制矢量的情况下,使用该算法的变体,偏最小二乘判别分析(PLS-DA)算法。 sklearn.pls中的PLSRegression模块是否也实现了这种二进制情况?如果没有,我在哪里可以找到它的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.]。 在拟合函数中,如果原始y是单变量向量(y.shape 1 = 1),则self.y_rotations_ = np.ones(1)。

3 个答案:

答案 0 :(得分:16)

PLS-DA实际上是将PLS用于分类结果而非通常的连续向量/矩阵的“技巧”。技巧包括创建零/ 1的虚拟单位矩阵,表示每个类别的成员资格。因此,如果您有预测的二元结果(即男/女,是/否等),您的虚拟矩阵将有两列代表任一类别的成员资格。

例如,考虑四个人的结果性别: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)

对于每一行/案例,预测的性别是具有最高预测成员资格的性别。

答案 1 :(得分:1)

您可以在SKLearn中使用线性判别分析软件包,它将y值作为整数:

LDA-SKLearn

以下是有关如何使用LDA的简短教程: sklearn LDA tutorial

答案 2 :(得分:0)

不完全是您正在寻找的,但是您可以查看这两个线程,了解如何从python和c ++ PLS库实现中调用本机(c / c ++代码):

Partial Least Squares Library

Calling C/C++ from python?

您可以使用boost.python将c ++代码嵌入到python中。以下是official site

的示例

遵循C / C ++传统,让我们从“你好,世界”开始吧。一个C ++函数:

char const* greet()
{
   return "hello, world";
}

可以通过编写Boost.Python包装器来暴露给Python:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

就是这样。我们完成了。我们现在可以将其构建为共享库。现在可以看到生成的DLL。这是一个示例Python会话:

>>> import hello_ext
>>> print hello_ext.greet()
hello, world