Skip to Content

§3. Вычисление главных компонент

Следующий простой алгоритм (степенной метод) позволяет вычислить для симметричной (не обязательно неотрицательно определённой) матрицы A\boldsymbol A несколько наибольших по модулю собственных значений λl\lambda_l и соответствующих собственных векторов cl\boldsymbol c_l. Сначала разберём частный случай этого алгоритма — вычисление λ1\lambda_1 и c1\boldsymbol c_1.

Возьмём произвольный ненулевой вектор x0\boldsymbol x_0 из Rm\mathbb R^m. Пусть выполнены два условия: ∣λ1∣>∣λ2∣≥⋯≥∣λm∣|\lambda_1| > |\lambda_2| \ge \dots \ge |\lambda_m| и c1Tx0≠0\boldsymbol c_1^T\boldsymbol x_0 \ne 0. Положим xi+1=Axi\boldsymbol x_{i+1} = \boldsymbol A\boldsymbol x_i (то есть xi=Aix0\boldsymbol x_i = \boldsymbol A^i\boldsymbol x_0, что объясняет название метода). Тогда последовательность значений ti+1=xiTxi+1/∣xi∣2t_{i+1} = \boldsymbol x_i^T\boldsymbol x_{i+1}/|\boldsymbol x_i|^2 сходится к λ1\lambda_1 со скоростью геометрической прогрессии со знаменателем γ=∣λ2/λ1∣<1\gamma = |\lambda_2/\lambda_1| < 1.

Доказательство. Обозначим через b1,…,bmb_1, \dots, b_m координаты вектора x0\boldsymbol x_0 в базисе c1,…,cm\boldsymbol c_1, \dots, \boldsymbol c_m, то есть x0=b1c1+⋯+bmcm\boldsymbol x_0 = b_1\boldsymbol c_1 + \dots + b_m\boldsymbol c_m. Так как Acl=λlcl\boldsymbol A\boldsymbol c_l = \lambda_l\boldsymbol c_l, то Aicl=λlicl\boldsymbol A^i\boldsymbol c_l = \lambda_l^i\boldsymbol c_l. Отсюда

xi=λ1ib1c1+⋯+λmibmcm=λ1i(b1c1+δi),\boldsymbol x_i = \lambda_1^ib_1\boldsymbol c_1 + \dots + \lambda_m^ib_m\boldsymbol c_m = \lambda_1^i(b_1\boldsymbol c_1 + \boldsymbol\delta_i),

где δi=b2(λ2/λ1)ic2+⋯+bm(λm/λ1)icm\boldsymbol\delta_i = b_2(\lambda_2/\lambda_1)^i\boldsymbol c_2 + \dots + b_m(\lambda_m/\lambda_1)^i\boldsymbol c_m, причём в силу первого условия ∣δi∣=O(γi)→0|\boldsymbol\delta_i| = O(\gamma^i) \to 0 при i→∞i \to \infty.

В частности, когда все λl>1\lambda_l > 1, это означает, что при каждой итерации длина вектора xi\boldsymbol x_i увеличивается, но быстрее остальных растёт его координата по оси c1\boldsymbol c_1. При этом направление xi\boldsymbol x_i приближается к направлению первой главной оси.

Формально это можно доказать с помощью известного из линейной алгебры неравенства Коши — Буняковского — Шварца ∣xTy∣≤∣x∣∣y∣|\boldsymbol x^T\boldsymbol y| \le |\boldsymbol x||\boldsymbol y|. Согласно второму условию алгоритма b1=c1Tx0≠0b_1 = \boldsymbol c_1^T\boldsymbol x_0 \ne 0. Отсюда ∣xi∣=(xiTxi)1/2=∣λ1∣i[∣b1∣+O(γi)]|\boldsymbol x_i| = (\boldsymbol x_i^T\boldsymbol x_i)^{1/2} = |\lambda_1|^i[|b_1| + O(\gamma^i)]; ei=xi/∣xi∣=(sign⁡λ1)i(sign⁡b1)c1+ri\boldsymbol e_i = \boldsymbol x_i/|\boldsymbol x_i| = (\operatorname{sign}\lambda_1)^i(\operatorname{sign}b_1)\boldsymbol c_1 + \boldsymbol r_i, где ∣ri∣=O(γi)|\boldsymbol r_i| = O(\gamma^i); ti+1=λ1+O(γi)t_{i+1} = \lambda_1 + O(\gamma^i). ■\blacksquare

По кирпичикам: каждое умножение на A\boldsymbol A растягивает координату вдоль cl\boldsymbol c_l в λl\lambda_l раз. После ii умножений координата по c1\boldsymbol c_1 обгоняет остальные в (λ1/λl)i(\lambda_1/\lambda_l)^i раз — экспоненциально. Остальные «тонут», и вектор разворачивается вдоль c1\boldsymbol c_1.

Смысл по-пацански: жми матрицей на любой вектор много раз подряд — и он обязательно повернётся туда, куда матрица «тянет» сильнее всего. Как толпа на митинге: кто бы где ни стоял, через пять минут все у самого громкого оратора.

Замечание 4. Если ∣λ1∣>1|\lambda_1| > 1, то ∣xi∣→∞|\boldsymbol x_i| \to \infty, а если ∣λ1∣<1|\lambda_1| < 1, то ∣xi∣→0|\boldsymbol x_i| \to 0 при i→∞i \to \infty. При вычислении на компьютере в первом случае возможно переполнение, во втором — исчезновение порядка. Предотвратить эти ситуации позволяет нормировка векторов xi\boldsymbol x_i на каждом шаге.

Учитывая замечание 4, приходим к следующему алгоритму для вычисления λ1\lambda_1 и c1\boldsymbol c_1.

  1. Положим i=0i = 0, t0=0t_0 = 0 и зададим произвольный ненулевой вектор x0\boldsymbol x_0 из Rm\mathbb R^m. Нормируем x0\boldsymbol x_0: пусть e0=x0/∣x0∣\boldsymbol e_0 = \boldsymbol x_0/|\boldsymbol x_0| (обычно сразу берут e0=(1,0,…,0)\boldsymbol e_0 = (1, 0, \dots, 0)).
  2. Вычислим xi+1=Aei\boldsymbol x_{i+1} = \boldsymbol A\boldsymbol e_i и ti+1=eiTxi+1t_{i+1} = \boldsymbol e_i^T\boldsymbol x_{i+1}.
  3. Нормируем xi+1\boldsymbol x_{i+1}: ei+1=xi+1/∣xi+1∣\boldsymbol e_{i+1} = \boldsymbol x_{i+1}/|\boldsymbol x_{i+1}|.
  4. Если ∣ti+1−ti∣≤ε|t_{i+1} - t_i| \le \varepsilon, где ε\varepsilon — достаточно малое число, то положим λ1=ti+1\lambda_1 = t_{i+1} и c1=ei+1\boldsymbol c_1 = \boldsymbol e_{i+1} и закончим итерационный процесс. Иначе увеличим ii на 1 и перейдём к шагу 2.

Замечание 5. Если при выборе x0\boldsymbol x_0 случится, что c1Tx0=0\boldsymbol c_1^T\boldsymbol x_0 = 0, то через несколько итераций за счёт погрешностей округления, как правило, появится ненулевая координата у xi\boldsymbol x_i в направлении c1\boldsymbol c_1, и процесс, хотя и с некоторым запаздыванием, выйдет на первое собственное значение. Можно также стартовать с разных x0\boldsymbol x_0 и сравнивать результаты.

Следующие компоненты: ортогонализация

Пусть ∣λ1∣>∣λ2∣>⋯>∣λk∣>∣λk+1∣≥⋯≥∣λm∣|\lambda_1| > |\lambda_2| > \dots > |\lambda_k| > |\lambda_{k+1}| \ge \dots \ge |\lambda_m|. Для вычисления k>1k > 1 первых главных компонент кроме умножения на A\boldsymbol A и нормировки понадобится ещё ортогонализация. Именно, предположим, что λl\lambda_l и cl\boldsymbol c_l уже известны при всех l≤k−1l \le k - 1. Чтобы найти λk\lambda_k и ck\boldsymbol c_k, выполним следующие шаги.

  1. Положим i=0i = 0, t0=0t_0 = 0 и зададим произвольный вектор x0\boldsymbol x_0 из Rm\mathbb R^m (надо только, чтобы ckTx0≠0\boldsymbol c_k^T\boldsymbol x_0 \ne 0).
  2. Проведём ортогонализацию xi\boldsymbol x_i к векторам c1,…,ck−1\boldsymbol c_1, \dots, \boldsymbol c_{k-1}: yi=xi−(c1Txi)c1−⋯−(ck−1Txi)ck−1\boldsymbol y_i = \boldsymbol x_i - (\boldsymbol c_1^T\boldsymbol x_i)\boldsymbol c_1 - \dots - (\boldsymbol c_{k-1}^T\boldsymbol x_i)\boldsymbol c_{k-1}.
  3. Нормируем yi\boldsymbol y_i: ei=yi/∣yi∣\boldsymbol e_i = \boldsymbol y_i/|\boldsymbol y_i|.
  4. Вычислим xi+1=Aei\boldsymbol x_{i+1} = \boldsymbol A\boldsymbol e_i и ti+1=eiTxi+1t_{i+1} = \boldsymbol e_i^T\boldsymbol x_{i+1}.
  5. Нормируем xi+1\boldsymbol x_{i+1}: zi+1=xi+1/∣xi+1∣\boldsymbol z_{i+1} = \boldsymbol x_{i+1}/|\boldsymbol x_{i+1}|.
  6. Если ∣ti+1−ti∣≤ε|t_{i+1} - t_i| \le \varepsilon, то положим λk=ti+1\lambda_k = t_{i+1}, ck=zi+1\boldsymbol c_k = \boldsymbol z_{i+1} и закончим процесс. В противном случае приравняем xi+1=zi+1\boldsymbol x_{i+1} = \boldsymbol z_{i+1}, увеличим ii на 1 и перейдём к шагу 2.

Смысл по-пацански: самого громкого оратора уже нашли — выведем его из зала (вычтем проекцию на c1\boldsymbol c_1). Тогда толпа соберётся у второго по громкости. И так далее.

Степенной метод: вычисление главных компонент

шаг itᵢ|tᵢ − λ|eᵢ
13,338797,6e-1(0,73; 0,15; 0,22; 0,29; 0,36; 0,44)
24,097932,0e-3(0,44; 0,43; 0,24; 0,42; 0,45; 0,42)
34,099934,2e-5(0,43; 0,43; 0,23; 0,44; 0,46; 0,41)
44,099971,1e-6(0,43; 0,43; 0,23; 0,44; 0,46; 0,42)
54,099973,3e-8(0,43; 0,43; 0,23; 0,44; 0,46; 0,42)
64,099971,1e-9(0,43; 0,43; 0,23; 0,44; 0,46; 0,42)
74,099973,9e-11(0,43; 0,43; 0,23; 0,44; 0,46; 0,42)
84,099971,5e-12(0,43; 0,43; 0,23; 0,44; 0,46; 0,42)

Матрица — корреляционная матрица собак и волков (рис. 3), старт e₀ = (1; 0,2; 0,3; …). Для λ1 каждый шаг: ортогонализация к уже найденным осям, умножение на A, нормировка. Ошибка убывает не медленнее геометрической прогрессии γⁱ с γ = |λ2/λ1| = 0,215: чем ближе соседние собственные значения, тем медленнее. Понадобилось шагов: 8; точное λ1 = 4,09997.

Для матрицы корреляций собак и волков γ=∣λ2/λ1∣=0,883/4,100≈0,22\gamma = |\lambda_2/\lambda_1| = 0{,}883/4{,}100 \approx 0{,}22, и λ1\lambda_1 находится за 8 шагов. Для λ2\lambda_2 скорость определяется отношением ∣λ3/λ2∣=0,639/0,883≈0,72|\lambda_3/\lambda_2| = 0{,}639/0{,}883 \approx 0{,}72 — шагов нужно уже около 40. Чем ближе соседние собственные значения, тем медленнее степенной метод.

Загрузка редактора…

(Матрица рис. 3 округлена до сотых, поэтому собственные значения по ней чуть отличаются от точных 4,100; 0,883; 0,639.)

Насколько доверять собственным значениям

В заключение обсудим, насколько следует доверять вычисленным значениям λl\lambda_l и cl\boldsymbol c_l. Следующий пример показывает, что для числа объектов nn порядка нескольких десятков разброс этих значений может оказаться достаточно большим.

Пример 2. Статистика главных компонент для нормальной модели. Предположим, что объекты представляют собой выборку размера nn из закона N(0,Σ)\mathcal N(\boldsymbol 0, \boldsymbol\Sigma) с невырожденной матрицей Σ\boldsymbol\Sigma, у которой все собственные значения λl\lambda_l (l=1,…,ml = 1, \dots, m) различны. Тогда:

  1. собственные значения λ^1,…,λ^m\hat\lambda_1, \dots, \hat\lambda_m и отвечающие им собственные векторы c^1,…,c^m\hat{\boldsymbol c}_1, \dots, \hat{\boldsymbol c}_m выборочной ковариационной матрицы Σ^\hat{\boldsymbol\Sigma} являются оценками максимального правдоподобия для соответствующих λ1,…,λm\lambda_1, \dots, \lambda_m, c1,…,cm\boldsymbol c_1, \dots, \boldsymbol c_m (см. пример 2 главы 19) и, следовательно, обладают асимптотической эффективностью (см. §4 главы 9);
  2. n(λ^l−λl)→dξ∼N(0,2λl2)\sqrt n(\hat\lambda_l - \lambda_l) \xrightarrow{d} \xi \sim \mathcal N(0, 2\lambda_l^2) при n→∞n \to \infty;
  3. n(c^l−cl)→dζ∼N(0,V)\sqrt n(\hat{\boldsymbol c}_l - \boldsymbol c_l) \xrightarrow{d} \boldsymbol\zeta \sim \mathcal N(\boldsymbol 0, \boldsymbol V) при n→∞n \to \infty, где элементами матрицы V\boldsymbol V служат vkl=λl∑k≠l∣cl∣2λk/(λk−λl)2v_{kl} = \lambda_l\sum_{k\ne l}|c_l|^2\lambda_k/(\lambda_k - \lambda_l)^2.

Построим на основе свойства 2 асимптотический доверительный интервал (см. §1 главы 11) для λ1\lambda_1 в примере 1. Так как свойство 2 равносильно сходимости n/2(λ^l/λl−1)→dξ/(λl2)∼N(0,1)\sqrt{n/2}(\hat\lambda_l/\lambda_l - 1) \xrightarrow{d} \xi/(\lambda_l\sqrt2) \sim \mathcal N(0, 1), то при достаточно больших nn приближённо с вероятностью 1−α1 - \alpha выполняется неравенство

λ^l/(1+x1−α/22/n)<λl<λ^l/(1−x1−α/22/n),\hat\lambda_l\big/\bigl(1 + x_{1-\alpha/2}\sqrt{2/n}\bigr) < \lambda_l < \hat\lambda_l\big/\bigl(1 - x_{1-\alpha/2}\sqrt{2/n}\bigr),

где x1−α/2x_{1-\alpha/2} — квантиль уровня (1−α/2)(1 - \alpha/2) закона N(0,1)\mathcal N(0, 1) (см. §3 главы 7). Для α=5 %\alpha = 5\,\% по таблице T2 находим, что x1−α/2=1,96x_{1-\alpha/2} = 1{,}96. При n=43n = 43 получаем 95 %-й доверительный интервал для λ1\lambda_1 от 2,88 до 7,1.

По кирпичикам: 2/43≈0,216\sqrt{2/43} \approx 0{,}216, 1,96⋅0,216≈0,4231{,}96\cdot0{,}216 \approx 0{,}423. Тогда 4,100/1,423≈2,884{,}100/1{,}423 \approx 2{,}88 и 4,100/0,577≈7,104{,}100/0{,}577 \approx 7{,}10.

Смысл по-пацански: «первая компонента объясняет 68 %» звучит солидно, но на 43 черепах сама λ1\lambda_1 гуляет от 2,9 до 7,1 — в два с половиной раза. Красивые проценты на малых выборках — с большим люфтом.

Проверка

Какой была бы нижняя граница 95 %-го интервала для λ1\lambda_1, если бы те же λ^1=4,1\hat\lambda_1 = 4{,}1 получились по n=100n = 100 животным?

Проверь себя

Тест

Собственные значения матрицы: 10, 9, 1. Как быстро степенной метод найдёт λ₁?
Обновлено