机器学习笔记 - SVD奇异值分解(2)

一、三次变换

         上一节如何通过旋转或缩放矩阵来转换向量和矩阵。

机器学习笔记 - 奇异值分解(1)_bashendixie5的博客-CSDN博客特征分解只能对方阵进行。对于非方阵的矩阵可以使用奇异值分解(SVD)。使用SVD,您可以将矩阵分解为三个矩阵。我们将这些新矩阵视为空间的子变换。不是在一个动作中进行转换,而是将其分解为三个动作。最后,我们会将SVD应用于图像处理,看到SVD对示例图像的影响。我们了解了如何通过旋转或缩放矩阵来转换向量和矩阵。SVD可以看作是将一个复杂变换分解为3个更简单的变换(旋转、缩放、旋转)。https://blog.csdn.net/bashendixie5/article/details/124266777

        现在矩阵和线性变换之间的联系更清楚了,我们可以进行与矩阵相关的变换是否可以在 SVD 的帮助下分解。

        但首先让我们创建一个函数,将 2D 矩阵作为输入,并在我们将此矩阵应用于它时绘制单位圆变换。 可视化转换将很有用。

def matrixToPlot(matrix, vectorsCol=['#FF9A13', '#1190FF']):
    
    # Unit circle
    x = np.linspace(-1, 1, 100000)
    y = np.sqrt(1-(x**2))

    # Modified unit circle (separate negative and positive parts)
    x1 = matrix[0,0]*x + matrix[0,1]*y
    y1 = matrix[1,0]*x + matrix[1,1]*y
    x1_neg = matrix[0,0]*x - matrix[0,1]*y
    y1_neg = matrix[1,0]*x - matrix[1,1]*y

    # Vectors
    u1 = [matrix[0,0],matrix[1,0]]
    v1 = [matrix[0,1],matrix[1,1]]

    plotVectors([u1, v1], cols=[vectorsCol[0], vectorsCol[1]])

    plt.plot(x1, y1, 'g', alpha=0.5)
    plt.plot(x1_neg, y1_neg, 'g', alpha=0.5)

        我们可以用它来检查 SVD 给出的三个变换是否等同于用原始矩阵完成的变换。 我们还将绘制 SVD 的每一步,以查看第一次旋转、缩放和第二次旋转的独立效果。

        我们将使用矩阵:,并用A绘制单位圆及其变换:

A = np.array([[3, 7], [5, 2]])

print 'Unit circle:'
matrixToPlot(np.array([[1, 0], [0, 1]]))
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.show()

print 'Unit circle transformed by A:'
matrixToPlot(A)
plt.xlim(-8, 8)
plt.ylim(-8, 8)
plt.show()

        单位圆 

单位圆

         A变换的单位圆:

矩阵 A 变换的单位圆

         这就是我们将矩阵 A 应用于单位圆和基向量时得到的结果。我们可以看到两个基向量不一定以相同的方式旋转。这与矩阵行列式的符号有关。

        现在让我们计算 A 的 SVD:

U, D, V = np.linalg.svd(A)

        我们现在可以通过以相反顺序查看矩阵 U、D 和 V 的效果来查看子变换。

# Unit circle
print 'Unit circle:'
matrixToPlot(np.array([[1, 0], [0, 1]]))
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.show()

print 'First rotation:'
matrixToPlot(V)
plt.xlim(-1.5, 1.5)
plt.ylim(-1.5, 1.5)
plt.show()

print 'Scaling:'
matrixToPlot(np.diag(D).dot(V))
plt.xlim(-9, 9)
plt.ylim(-9, 9)
plt.show()

print 'Second rotation:'
matrixToPlot(U.dot(np.diag(D)).dot(V))
plt.xlim(-8, 8)
plt.ylim(-8, 8)
plt.show()

        单位圆

        第一次旋转

由矩阵 V 旋转的单位圆

         缩放

旋转后,单位圆重新缩放 D

         第二次旋转

最后用 U 完成第三次旋转

         可以看到最后一步与上面A的转换进行比较,是一样的。

二、奇异值解释

        奇异值按降序排列。它们对应于一组新特征(即原始特征的线性组合)。例如,从上一个示例中,我们可以可视化这些新功能。椭圆的长轴将是第一个左奇异向量 (u1),其范数将是第一个奇异值 (σ1)。

u1 = [D[0]*U[0,0], D[0]*U[0,1]]
v1 = [D[1]*U[1,0], D[1]*U[1,1]]

plotVectors([u1, v1], cols=['black', 'black'])

matrixToPlot(A)

plt.text(-5, -4, r"$\sigma_1u_1$", size=18)
plt.text(-4, 1, r"$\sigma_2u_2$", size=18)

plt.xlim(-8, 8)
plt.ylim(-8, 8)
plt.show()
奇异值和向量显示了变换圆的长轴和短轴

         它们是椭圆的长轴 (σ1u1) 和短轴 (σ2u2)。 我们可以看到,对应于这个主轴的特征与更多的方差相关联(这个轴上的值范围比另一个更大)。

三、SVD 和特征分解

        矩阵 U、D 和 V 可以通过将 A 转换为方阵并通过计算该方阵的特征向量来找到。 方阵可以通过以另一种方式将矩阵 A 与其转置相乘来获得:

        U等于特征向量

        V等于特征向量

        D等于的特征值

         让我们看一个非方阵的例子:

         奇异值分解可以使用 Numpy 中的 linalg.svd() 函数完成(注意 np.linalg.eig(A) 仅适用于方阵)。

A = np.array([[7, 2], [3, 4], [5, 3]])
U, D, V = np.linalg.svd(A)

        求得U、D、V如下

array([[-0.69366543,  0.59343205, -0.40824829],
       [-0.4427092 , -0.79833696, -0.40824829],
       [-0.56818732, -0.10245245,  0.81649658]])

array([ 10.25142677,   2.62835484])

array([[-0.88033817, -0.47434662],
       [ 0.47434662, -0.88033817]])

1、左奇异值

        A 的左奇异值等于的特征向量。

U, D, V = np.linalg.svd(A)
np.linalg.eig(A.dot(A.T))[1]

        U和的值均为

array([[-0.69366543,  0.59343205, -0.40824829],
       [-0.4427092 , -0.79833696, -0.40824829],
       [-0.56818732, -0.10245245,  0.81649658]])

2、右奇异值

        A 的右奇异值等于的特征向量。

U, D, V = np.linalg.svd(A)
np.linalg.eig(A.T.dot(A))[1]

        V和的值均为

array([[ 0.88033817, -0.47434662],
       [ 0.47434662,  0.88033817]])

3、非零奇异值

        A 的非零奇异值是的特征值的平方根。

U, D, V = np.linalg.svd(A)
np.linalg.eig(A.T.dot(A))[0]
np.linalg.eig(A.dot(A.T))[0]
np.sqrt(np.linalg.eig(A.T.dot(A))[0])

        求得D的值和 的特征值以及它们的平方根。

array([ 10.25142677,   2.62835484])

array([ 105.09175083,    6.90824917])
array([ 105.09175083,    6.90824917,   -0.])

array([ 10.25142677,   2.62835484])

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/124302156