K-L 变换

在机器学习学习中若存在维度过高的向量,则不利于分析向量的样本的方差与均值

原理分析

K-L变换的本质是寻找一个算子KL变换(PCA主成分分析)_协方差,通过KL变换(PCA主成分分析)_机器学习_02,其中KL变换(PCA主成分分析)_协方差_03KL变换(PCA主成分分析)_方差_04降维后的结果。

存在一个样本集KL变换(PCA主成分分析)_机器学习_05,其中KL变换(PCA主成分分析)_机器学习_06KL变换(PCA主成分分析)_协方差_07维向量,为了使KL变换(PCA主成分分析)_方差_08降低维度

设存在一个线性变换KL变换(PCA主成分分析)_协方差,使得$ y_i=U x_iKL变换(PCA主成分分析)_方差_10y_iKL变换(PCA主成分分析)_方差_11k$维向量,

为了使KL变换(PCA主成分分析)_协方差_03各个特征最大的限度分开,我们应该从中KL变换(PCA主成分分析)_协方差_07个特征中选择KL变换(PCA主成分分析)_协方差_14个最大限度可分不重叠的特征。其中各个线性可分的特征应该是不相关的,即他们的相关系数为0。可推出它的协方差为0。

相关系数:
KL变换(PCA主成分分析)_方差_15
协方差矩阵:
KL变换(PCA主成分分析)_方差_16

KL变换(PCA主成分分析)_方差_17

**目标:**将一组 KL变换(PCA主成分分析)_协方差_07 维向量降为 KL变换(PCA主成分分析)_协方差_14 维,其目标是选择 KL变换(PCA主成分分析)_协方差_14个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0,而变量方差则尽可能大。

因为KL变换(PCA主成分分析)_协方差_03的特征要尽可能的无关,则KL变换(PCA主成分分析)_方差_22

由此KL变换(PCA主成分分析)_协方差_03的相关系数矩阵为一个对角矩阵
KL变换(PCA主成分分析)_协方差_24
其中KL变换(PCA主成分分析)_协方差_25为实对称矩阵,它一定存在KL变换(PCA主成分分析)_协方差_07个特征向量,且相互可以正交。

KL变换(PCA主成分分析)_方差_27,则一定满足KL变换(PCA主成分分析)_方差_28KL变换(PCA主成分分析)_机器学习_29KL变换(PCA主成分分析)_协方差_30分别为特征向量与特征值,取前KL变换(PCA主成分分析)_协方差_14大的特征值对于的特征向量,并进行归一化,记为KL变换(PCA主成分分析)_协方差
KL变换(PCA主成分分析)_协方差_33

即通过K-L变换,实际上是找到了一个新的坐标系,在这个坐标系中,数据的协方差矩阵是对角的,而且对角线上的元素是原始数据协方差矩阵的特征值,这些特征值对应的特征向量则构成了新坐标系的基向量。

步骤

  1. 计算 KL变换(PCA主成分分析)_方差_34的协方差矩阵KL变换(PCA主成分分析)_协方差_35,并记为KL变换(PCA主成分分析)_UX_36
  2. 计算KL变换(PCA主成分分析)_UX_36的特征值与特征向量
  3. 取前KL变换(PCA主成分分析)_方差_38大的特征值对于的特征向量,并进行归一化,记为KL变换(PCA主成分分析)_UX_39
  4. 利用KL变换(PCA主成分分析)_机器学习_40进行降维度处理

示例

有样本集KL变换(PCA主成分分析)_机器学习_41,KL变换(PCA主成分分析)_UX_42,请用K-L变换将特征降至2维和1维,并画出在该空间中的位置

1、计算样本均值

KL变换(PCA主成分分析)_UX_43的均值KL变换(PCA主成分分析)_机器学习_44

KL变换(PCA主成分分析)_协方差_45的均值KL变换(PCA主成分分析)_机器学习_46

总体样本的均值KL变换(PCA主成分分析)_机器学习_47

2、去中心化
KL变换(PCA主成分分析)_方差_48

KL变换(PCA主成分分析)_方差_49

KL变换(PCA主成分分析)_方差_50
KL变换(PCA主成分分析)_UX_51
计算特征值与特征向量
KL变换(PCA主成分分析)_协方差_52
选取KL变换(PCA主成分分析)_机器学习_53
KL变换(PCA主成分分析)_机器学习_54
其余同理可得。

import numpy as np

# 样本数据
w1 = np.array([[0, 0, 0], [1, 0, 0], [1, 0, 1], [1, 1, 0]])
w2 = np.array([[0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 1, 1]])

u = (w1.mean(axis=0) + w2.mean(axis=0)) / 2

x1 = w1 - u
x2 = w2 - u
x = np.zeros((3, 3))

for i in x1:
    i = i.reshape(3, -1)
    x = x + i @ i.T

for i in x2:
    i = i.reshape(3, -1)
    x = x + i @ i.T

x = x / 8

lambda_value, vector = np.linalg.eigh(x)

U2d = vector[:2]
U1d = vector[0]

x2d_1 = (U2d @ x1.T).T
x2d_2 = (U2d @ x2.T).T

x1d_1 = (U1d @ x1.T).T
x1d_2 = (U1d @ x2.T).T