<p>可以通过检查相关矩阵的特征值来检测高多重共线性。很低的特征值表明数据是共线的,对应的特征向量显示哪些变量是共线的。</p>
<p>如果数据中不存在共线性,则期望特征值都不接近零:</p>
<pre><code>>>> xs = np.random.randn(100, 5) # independent variables
>>> corr = np.corrcoef(xs, rowvar=0) # correlation matrix
>>> w, v = np.linalg.eig(corr) # eigen values & eigen vectors
>>> w
array([ 1.256 , 1.1937, 0.7273, 0.9516, 0.8714])
</code></pre>
<p>但是,如果说<code>x[4] - 2 * x[0] - 3 * x[2] = 0</code>,那么</p>
<pre><code>>>> noise = np.random.randn(100) # white noise
>>> xs[:,4] = 2 * xs[:,0] + 3 * xs[:,2] + .5 * noise # collinearity
>>> corr = np.corrcoef(xs, rowvar=0)
>>> w, v = np.linalg.eig(corr)
>>> w
array([ 0.0083, 1.9569, 1.1687, 0.8681, 0.9981])
</code></pre>
<p>其中一个特征值(这里是第一个)接近于零。对应的特征向量为:</p>
<pre><code>>>> v[:,0]
array([-0.4077, 0.0059, -0.5886, 0.0018, 0.6981])
</code></pre>
<p>忽略几乎为零的系数,上面基本上说<code>x[0]</code>,<code>x[2]</code>和<code>x[4]</code>是共线的(如预期)。如果将<code>xs</code>值标准化并乘以该特征向量,结果将在0附近徘徊,且方差很小:</p>
<pre><code>>>> std_xs = (xs - xs.mean(axis=0)) / xs.std(axis=0) # standardized values
>>> ys = std_xs.dot(v[:,0])
>>> ys.mean(), ys.var()
(0, 0.0083)
</code></pre>
<p>注意<code>ys.var()</code>基本上是接近于零的本征值。</p>
<p>因此,为了获得高的多线性度,可以考虑相关矩阵的特征值。</p>