切片逆回归原理(SIR)与Python实现

切片逆回归

简介

切片逆回归(Slice Inverse Regression, SIR)是Li(1991)1提出的一种经典的充分降维方法。SIR探究了多维变量 x x x对单变量 y y y的回归而不是一维变量 y y y对多维变量 x x x的回归。在对多维解释变量 x x x的降维过程中充分利用了 y y y的信息。

一般模型

  1. 一般模型: y = f ( β 1 T x , … , β K T x , ε ) y=f(\beta^{T}_{1}x,\dots,\beta_{K}^{T}x,\varepsilon) y=f(β1Tx,,βKTx,ε)

    • ε \varepsilon ε是一个独立于 x x x的随机变量, f f f为一个未知的连接函数;
    • y y y关于 x x x的条件分布可以由 x x x K K K个线性组合 β 1 T x , … , β K T x \beta^{T}_{1}x,\dots,\beta_{K}^{T}x β1Tx,,βKTx得到,并不会损失 x x x中包含的原始信息;
    • 等价于在给定 x x x K K K个线性组合时,响应变量 y y y与解释变量 x x x是独立的。当 K K K远小于 x x x的维度 p p p时,便达到降维目的;
  2. 基本定理:

    • 逆回归曲线 E ( X ∣ Y ) − E ( X ) E(X|Y)-E(X) E(XY)E(X)被包含在 Σ x β i , i = 1   … , k \Sigma_{x}\beta_{i},i=1\,\dots,k Σxβi,i=1,k张成的线性空间中;
    • 在线性条件下,满足 Σ η b i = λ i Σ x b i \Sigma_{\eta}b_{i}=\lambda_{i}\Sigma_{x}b_{i} Σηbi=λiΣxbi的非零相对特征 λ i \lambda_{i} λi不超过 k k k个,其对应的相对特征向量 b i b_{i} bi被包含在 β i , i = 1 , … , k \beta_{i},i=1,\dots,k βi,i=1,,k张成的线性空间中;

具体步骤

  1. 切片逆回归对数据 ( Y i , X i ) , ( i = 1 , … , n ) (Y_{i},X_{i}),(i=1,\dots,n) (Yi,Xi),(i=1,,n)进行操作;

  2. 通过仿射变换标准化 X i X_{i} Xi得到 X i ~ = Σ ^ x x − 1 / 2 ( X i − X ‾ ) , i = 1 , … , n \widetilde{X_{i}}=\widehat{\Sigma}_{xx}^{-1/2}(X_{i}-\overline{X}),i=1,\dots,n Xi =Σ xx1/2(XiX),i=1,,n ,其中 Σ ^ x x \widehat{\Sigma}_{xx} Σ xx X ‾ \overline{X} X分别是 X X X 的样本协方差矩阵和样本均值;

  3. Y Y Y的取值 Y i Y_{i} Yi从小到大进行排序,并切为 H H H片,记为 I 1 , I 2 , … , I h I_{1},I_{2},\dots,I_{h} I1,I2,,Ih。其中 I h I_{h} Ih包含 Y i Y_{i} Yi的概率为 P h P_{h} Ph
    P h = 1 n ∑ i = 1 n δ h ( Y i ) P_{h}=\frac{1}{n}\sum_{i=1}^{n}\delta_{h}(Y_{i}) Ph=n1i=1nδh(Yi)

    δ h ( Y i ) = { 0 ,  if  Y i  inside the  h 1 ,  if  Y i  outside the  h \delta_{h}\left(Y_{i}\right)=\left\{\begin{array}{l} 0, \text { if } Y_{i} \text { inside the } \mathrm{h} \\ 1, \text { if } Y_{i} \text { outside the } \mathrm{h} \end{array}\right. δh(Yi)={0, if Yi inside the h1, if Yi outside the h

  4. 对于每一个切片,计算其 x i x_{i} xi的样本均值 m h m_{h} mh,即 m h = 1 n P h ∑ y ∈ I h X i ~ m_{h}=\frac{1}{nP_{h}}\sum_{y\in{I{_h}}}\widetilde{X_{i}} mh=nPh1yIhXi ;

  5. 对数据 m h m_{h} mh进行(加权)主成分分析,加权的协方差矩阵为 V = ∑ h = 1 H p h m h m h ′ V=\sum_{h=1}^{H}p_{h}m_{h}m_{h}^{'} V=h=1Hphmhmh,并找出V的特征值和特征向量。

  6. k k k个最大的特征向量为 η k , ( k = 1 , 2 , … , k ) \eta_{k},(k=1,2,\dots,k) ηk,(k=1,2,,k),可得 β k = η k Σ x x − 1 2 , k = 1 , 2 , … , k \beta_{k}=\eta_{k}\Sigma_{xx}^{-\frac{1}{2}},k=1,2,\dots,k βk=ηkΣxx21,k=1,2,,k

切片逆回归的Python实现

  • 仅包含一般情况,稀疏矩阵代补充
class SIR:
    def __init__(self, H, K, estdim=0, Cn=1):
        self.H = H
        self.K = K
        self.estdim = estdim
        self.Cn = Cn

    def fit(self, X, Y):
        self.X = X
        self.Y = Y
        self.mean_x = np.mean(X, axis=0)  # 计算样本均值
        self.sigma_x = np.cov(X, rowvar=False)  # 计算样本协方差矩阵
        self.Z = np.matmul(X - np.tile(self.mean_x, (X.shape[0], 1)),
                           fractional_matrix_power(self.sigma_x, -0.5))  # 标准化后的数据阵
        n, p = self.Z.shape
        if self.Y.ndim == 1:  # 判断响应变量Y的维度
            self.Y = self.Y.reshape(-1, 1)
        ny, py = self.Y.shape
        W = np.ones((n, 1)) / n
        nw, pw = W.shape
        # 输入数据异常判断
        if n != ny:
            raise ValueError('X and Y must have the same number of samples')
        elif p == 1:
            raise ValueError('X must have at least 2 dimensions')
        elif py != 1:
            raise ValueError('Y must have only 1 dimension')
        # 将y分为H片,c为每个片的样本数
        c = np.ones((1, self.H)) * (n // self.H) + np.hstack(
            [np.ones(
                (1, n % self.H)), np.zeros((1, self.H - n % self.H))])
        cumc = np.cumsum(c)  # 计算切片累计和
        # 参照Y的取值从小到大进行排序
        temp = np.hstack((self.Z, self.Y, W))
        temp = temp[np.argsort(temp[:, p])]
        # 提取排序后的z,y,w
        z, y, w = temp[:, :p], temp[:, p:p + 1], temp[:, p + 1]
        muh = np.zeros((self.H, p))
        wh = np.zeros((self.H, 1))  # 每个切片的权重
        k = 0  # 初始化切片编号
        for i in range(n):
            if i >= cumc[k]:  # 如果超过了切片的边界,则换下一个切片
                k += 1
            muh[k, :] = muh[k, :] + z[i, :]  # 计算切片内自变量之和
            wh[k] = wh[k] + w[i]  # 计算每个切片包含Yi的概率
        # 计算每个切片的样本均值,将其作为切片内自变量的取值
        muh = muh / (np.tile(wh, (1, p)) * n)
        # 加权主成分分析
        self.M = np.zeros((p, p))  # 初始化切片 加权协方差矩阵
        for i in range(self.H):
            self.M = self.M + wh[i] * muh[i, :].reshape(-1, 1) * muh[i, :]
        if self.estdim == 0: # 一般情况
            self.D, self.V = eigs(A=self.M, k=self.K, which='LM')
        else:
            """ # 稀疏矩阵情况,待修正
            [V D] = np.linalg,eig(full(M))
            lambda = np.sort(abs(diag(D)),'descend')
            L = np.log(lambda+1) - lambda
            G = np.zeros((p,1))
            if Cn == 1
                Cn = n^(1/2)
            elif Cn == 2
            Cn = n^(1/3)
            elif Cn == 3:
                Cn = 0.5 * n^0.25
            for k in range(p):
                G(k) = n / 2 * sum(L(1:k)) / sum(L) - Cn * k * (k+1) / p
            maxG, K = np. max(G)
            V, D = eigs(M,K,'lm')
            """
            pass
        return self.V, self.K, self.M, self.D
    def transform(self):
        hatbeta = np.matmul(fractional_matrix_power(self.sigma_x, -0.5),self.V)
        return hatbeta
X = pd.read_csv('X.csv',header=None).values
Y = pd.read_csv('Y.csv',header=None).values
model = SIR(H=6, K=4, estdim=0, Cn=1)
V, K, M, D = model.fit(X,Y)
hatbeta = model.transform()

  1. Li, Ker-Chau. “Sliced Inverse Regression for Dimension Reduction: Rejoinder.” Journal of the American Statistical Association, vol. 86, no. 414, 1991, pp. 337–42. JSTOR, https://doi.org/10.2307/2290568. Accessed 17 Jul. 2022. ↩︎

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
切片回归方法(Slice Inverse Regression, SIR)是一种非参数的降维方法,可以用于在高维数据中提取重要的低维结构。它的基本思想是通过对自变量进行线性组合,找到与因变量相关性最强的方向。下面我们来详细讲解一下SIR的算法流程,并且给出一个例子。 1.算法流程: 输入:$n$个样本,$p$个自变量和一个因变量 输出:$k$个方向$v_1,v_2,...,v_k$,其中$k\leq p$,每个方向$v_i$是自变量的线性组合 1. 计算方差矩阵$S=\frac{1}{n}X^TX$,其中$X$是自变量矩阵,$S$是$p\times p$的矩阵 2. 计算因变量$Y$的均值$\bar{Y}$ 3. 初始化$V_0=[1,1,...,1]$为初始方向,$k=1$ 4. 计算$Z=XV_{k-1}$ 5. 计算$u=Z^TY/n-\bar{Y}V_{k-1}$ 6. 对$u$做标准化:$u=u/\|u\|$ 7. 如果$k=p$或者$u$的方差为0,则停止迭代;否则,将$u$作为第$k$个方向,$V_{k-1}$替换为$u$,$k=k+1$,返回第4步 2.举个例子: 我们假设有一个$n=100$的样本集,每个样本有$p=3$个自变量和一个因变量。我们可以用SIR方法来从自变量中提取出与因变量相关性最强的方向。 首先,我们生成一个随机数据集: ```python import numpy as np np.random.seed(0) n = 100 p = 3 X = np.random.normal(size=(n, p)) Y = X[:, 0] + 2 * X[:, 1] - 3 * X[:, 2] + np.random.normal(size=n) ``` 接下来,我们实现SIR算法: ```python def SIR(X, Y): # 计算方差矩阵 S = np.cov(X.T) # 计算因变量均值 Y_mean = np.mean(Y) # 初始化方向 V = np.ones(p) k = 1 while True: # 计算Z Z = X.dot(V) # 计算u u = np.dot(Z, Y) / n - Y_mean * V # 标准化u u = u / np.linalg.norm(u) # 判断是否结束迭代 if k == p or np.var(u) == 0: break # 更新方向 V = u k += 1 return V[:k] ``` 最后,我们可以调用SIR函数来提取出与因变量相关性最强的方向: ```python V = SIR(X, Y) print(V) ``` 输出结果为:[ 0.422 -0.906 -0.029],表明第一个自变量对因变量的影响最大,第二个自变量对因变量的影响次之,第三个自变量对因变量的影响最小。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_泥鳅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值