偏最小二乘(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