python中的PLS-DA算法



偏最小二乘(PLS)算法在scikit学习库中实现,如本文所述:http://scikit-learn.org/0.12/auto_examples/plot_pls.html在y是二进制矢量的情况下,使用该算法的变体,偏最小二乘判别分析(PLS-DA)算法。sklearn.pls中的PLSRegression模块是否也实现了这种二进制情况?如果没有,我在哪里可以找到它的python实现?在我的二进制情况下,我试图使用PLSRegession:

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.shape1=1),则self.y_rotations_=np.ones(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)

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

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

LDA SKLearn

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

我知道这个问题已经得到了彻底的回答,但我想添加对我有用的内容,以防对其他发现这个问题的人有帮助:

我遵循了这个教程,它以以下方式处理这个问题:

(我有一个数据集,其中的变量是AD和CN)

#Create a pseudolinear Y value against which to correlate the samples 
#(in my case I used AD)
y = [g == 'AD' for g in df.columns.get_level_values(0)]
y
#Conversion of boolean values to numerical
y = np.array(y, dtype=int)
y
#continue as normal with your PLS-DA model
plsr = PLSRegression(n_components=2, scale=False)
plsr.fit(df.values.T, y)

这并不完全是您想要的,但您可能需要检查这两个线程,了解如何从python和c++PLS libs实现中调用本机(c/c++代码):

偏最小二乘库

从Python调用C/C++?

您可以使用boost.python将c++代码嵌入到python中。以下是一个取自官方网站的例子:

遵循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可见。下面是一个Python会话示例:

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

相关内容

  • 没有找到相关文章

最新更新