python中的PLS-DA算法

Noa*_*led 10 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)
Run Code Online (Sandbox Code Playgroud)

在transform函数中,代码在此行中获得异常:

y_scores = np.dot(Yc, self.y_rotations_)
Run Code Online (Sandbox Code Playgroud)

错误消息是"ValueError:矩阵未对齐".Yc是规范化的y向量,self.y_rotations_ = [1.].在拟合函数中,如果原始y是单变量向量(y.shape 1 = 1),则self.y_rotations_ = np.ones(1).

小智 17

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

例如,考虑四个人的结果性别:2名男性和2名女性.虚拟矩阵应编码为:

import numpy as np
dummy=np.array([[1,1,0,0],[0,0,1,1]]).T
Run Code Online (Sandbox Code Playgroud)

,其中每列代表两个类别(男性,女性)的成员资格

然后,变量Xdata(形状4行,任意列)中的数据模型将是:

myplsda=PLSRegression().fit(X=Xdata,Y=dummy)
Run Code Online (Sandbox Code Playgroud)

可以从mypred中两个指标变量的比较中提取预测类别:

mypred= myplsda.predict(Xdata)
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您的数据只包含两个类,最好将y表示为单个列然后进行回归,并使用两个类值的半值阈值来标识类,例如,如果1表示第1类,则为-1表示另一类,阈值为0.如果使用y矩阵,则存在问题.这也是PLSDA不推荐用于多类问题的原因.参见论文_Partial最小二乘判别分析:将魔法带走 - 进行详细讨论. (2认同)