17

偏最小二乘 (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.]。在 fit 函数中,如果原始 y 是单变量向量 (y.shape 1 =1),则 self.y_rotations_ = np.ones(1)。

4

3 回答 3

27

PLS-DA 确实是一种将 PLS 用于分类结果而不是通常的连续向量/矩阵的“技巧”。诀窍包括创建一个由 0/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)

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

于 2014-02-09T21:48:15.067 回答
4

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

LDA-SKLearn

这是一个关于如何使用 LDA 的简短教程: sklearn LDA 教程

于 2019-08-27T02:15:26.550 回答
0

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

偏最小二乘库

从 python 调用 C/C++?

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

遵循 C/C++ 的传统,让我们从“hello, world”开始。一个 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
于 2013-08-23T20:23:14.377 回答