You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改正交矩阵采样方法使单位矩阵期望距离一致?能否指定距离生成?

随机正交矩阵采样的改进与指定距离生成方法

原方法的问题

用高斯随机矩阵做SVD得到正交矩阵的方法,本质是采样Haar分布的正交矩阵(正交群上的均匀分布)。但随着维度n增大,正交群的“体积”急剧膨胀,靠近单位矩阵I或负单位矩阵-I的区域占比越来越小,导致采样样本的余弦相似度(与I)范围不断收窄,越来越难出现接近I或-I的样本,这和你给出的实验结果一致。


问题1:修改采样方法,让任意n下到I的期望距离一致

要实现这一点,核心是打破Haar分布的均匀性,让采样分布不随n的增大而“稀释”在整个正交群上,而是聚焦在与I保持固定期望距离的区域。这里提供两种可行方案:

方案1:固定随机旋转的数量

正交矩阵可以表示为多个Givens旋转(二维平面旋转)的乘积。我们可以固定旋转的次数k(比如k=2),不管n多大,只对随机选取的k组维度对进行旋转,其余维度保持单位矩阵的状态。这样,到I的距离仅由这k次旋转决定,期望距离自然不随n变化。

代码示例:

import numpy as np

def random_ortho_fixed_rot(n, k=2):
    U = np.eye(n)
    for _ in range(k):
        # 随机选两个不同维度
        i, j = np.random.choice(n, 2, replace=False)
        # 随机采样旋转角度
        theta = np.random.uniform(0, 2 * np.pi)
        # 构造Givens旋转矩阵
        G = np.eye(n)
        G[i,i] = np.cos(theta)
        G[i,j] = -np.sin(theta)
        G[j,i] = np.sin(theta)
        G[j,j] = np.cos(theta)
        # 应用旋转
        U = U @ G
    return U

这个方法的优势是计算简单,直观可控,旋转次数k越大,样本离I的期望距离越远。

方案2:归一化反对称矩阵的范数

正交矩阵可以表示为反对称矩阵的矩阵指数(即U = expm(X),其中X^T = -X)。当X的范数较小时,U ≈ I + X,此时U到I的距离近似等于X的范数。我们可以通过归一化X的Frobenius范数到固定值,让U到I的期望距离保持一致。

代码示例:

import numpy as np
from scipy.linalg import expm

def random_ortho_fixed_dist(n, target_norm=1.0):
    # 生成反对称矩阵
    upper_tri = np.random.normal(0., 1., (n, n))
    X = upper_tri - upper_tri.T
    # 归一化到目标范数
    current_norm = np.linalg.norm(X)
    X = X / current_norm * target_norm
    # 矩阵指数得到正交矩阵
    return expm(X)

这里target_norm是你希望X保持的固定范数,调整它可以直接控制U到I的期望距离大小。


问题2:直接生成指定距离d的随机正交矩阵

可以实现,但需要先明确距离的定义(这里以常用的Frobenius距离为例):
Frobenius距离的平方为:
$$||U - I||_F^2 = 2(n - \text{tr}(U))$$
因此,指定距离d等价于指定矩阵的迹tr(U) = n - d²/2,且tr(U)必须满足-n ≤ tr(U) ≤ n(对应d的有效范围是0 ≤ d ≤ 2√n)。

生成思路是:

  1. 构造具有目标迹的正交矩阵的特征值结构(正交矩阵的特征值是模为1的复数,共轭成对出现);
  2. 用随机Haar正交矩阵做相似变换,得到分布均匀的随机正交矩阵。

代码示例:

import numpy as np
from scipy.linalg import block_diag

def random_ortho_specified_dist(n, d):
    # 计算目标迹
    t = n - (d ** 2) / 2
    if not (-n <= t <= n):
        raise ValueError(f"距离d超出有效范围,应为[0, {2*np.sqrt(n):.2f}]")
    
    # 构造特征值对应的块矩阵
    blocks = []
    if n % 2 == 0:
        m = n // 2
        target_sum = t / 2
        # 拒绝采样生成满足余弦和的角度(小m时效率可接受)
        while True:
            thetas = np.random.uniform(0, 2*np.pi, m)
            current_sum = np.sum(np.cos(thetas))
            if np.abs(current_sum - target_sum) < 1e-6:
                break
        # 生成旋转块
        for theta in thetas:
            blocks.append(np.array([[np.cos(theta), -np.sin(theta)],
                                    [np.sin(theta), np.cos(theta)]]))
    else:
        m = (n - 1) // 2
        # 奇数维时固定一个实特征值为1,其余为复共轭对
        target_sum = (t - 1) / 2
        while True:
            thetas = np.random.uniform(0, 2*np.pi, m)
            current_sum = np.sum(np.cos(thetas))
            if np.abs(current_sum - target_sum) < 1e-6:
                break
        blocks.append(np.array([[1]]))
        for theta in thetas:
            blocks.append(np.array([[np.cos(theta), -np.sin(theta)],
                                    [np.sin(theta), np.cos(theta)]]))
    
    # 构造块对角矩阵
    diag_mat = block_diag(*blocks)
    # 随机Haar正交矩阵做相似变换
    V = np.linalg.svd(np.random.normal(0, 1, (n, n)))[0]
    U = V @ diag_mat @ V.T
    return U

对于大维度n,拒绝采样的效率较低,可以替换为更高效的参数化方法生成满足余弦和的角度,但上述代码足以展示核心逻辑。


内容的提问来源于stack exchange,提问作者Genius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:13:10