赞
踩
当我们执行主成分分析 (PCA) 时,我们希望找到数据集的主成分。令人惊讶不是吗?那么,数据集的主要组成部分是什么,我们为什么要找到它们,它们告诉我们什么?数据集的主成分是数据集中变化最大的“方向”(我假设您对术语方差有基本的了解。如果没有,请在此处查找。简单来说,第一个主成分是数据集是沿数据集变化最大的方向。
考虑以下数据集,我在其上绘制了由不同颜色箭头表示的不同“方向”。你怎么看,哪个箭头指向数据集方差最大的方向?
好吧,通过肉眼我们看到橙色箭头可能指向方差最大的方向。
好的,但是为什么我们需要这个方向?
我们希望有这个方向(方差最大的方向),因为将来我们希望使用数据集的主成分来降低数据集的维度,或者通过将其减少到三个或更少的维度来使其“可绘制”,或者只是在不丢失太多信息的情况下减小数据集的大小。降低数据集的维度就像通过组合列来创建新列,使得新==组合的列数小于原始列数。
想象一个只有两列 A 和 B 的数据集,那么这个数据集就被称为是二维的。如果我们现在将这两列合并为一列,例如通过简单地添加第一列和第二列,数据集就会减少到一维。决定应该组合哪些列以及我们应该如何组合它们是 PCA 的目标。请注意,此插图并非 100% 正确,因为 PCA 的目标是转换数据,而不是简单地切掉或组合某些内容,而是此插图应该对它进行第一步。
也就是说,我们希望减小数据集的大小以使算法更容易使用,或者通过将数据变为 2 维或 3 维来简单地可视化数据。
但是等等,我说减小数据集的大小,这有点“丢失一些东西”,对吗?正确的!通过减少数据集的维数,我们会松散维度,即我们会松散信息。想象一个 3D 电影,我们移除了第三维,使得剩下的电影是二维的。我们仍然可以观看电影,但我们丢失了一些信息。我们必须找到答案的问题是:哪些维度包含数据集的最多信息,哪些维度只包含很少信息——因此可以在不丢失太多信息的情况下被截断。
找到这些维度(主成分)并使用这些主成分将数据集转换为较低维度的数据集是 PCA 的任务。如上所述,最后我们使用找到并选择的主成分来转换我们的数据集,即使用这些主成分来投影我们的数据集(投影是通过矩阵乘法完成的)。通过这样做,我们得到了一个维度减少(即减小的大小)的数据集,而不会丢失太多信息——希望如此——。
好的,要继续,为了理解,我们必须退后一小步。我们想要找到主成分,因为这些是具有最高方差的数据集的“方向”。你问自己:为什么方差最大?好吧,事实证明具有最高方差(主成分)的方向是信息量最大的方向。让我们用一个小图形说明清楚这一点:
由于分配给三角形的值(假设单位为 kg)都相同,因此方差为 0,而球的方差为 16.66 克G2
现在让我们进一步假设有人选择了一个球和一个三角形,告诉您分配的权重,并希望您对颜色进行预测。无论人选择什么三角形,重量总是 10 公斤,因此你没有机会根据公斤数正确预测三角形的颜色。但是,球的重量不同(它们的方差比三角形更大),无论人们告诉您什么重量,您都可以根据数字预测颜色。为了更清楚地说明这一点,假设在下一步中,此人希望您做同样的事情,但现在他或她没有告诉您确切的数字,而只是告诉您一个接近上述数字之一的数字。例如,11公斤。
根据这个数字,你可以预测球的颜色为蓝色,因为 11 比 15 更接近 10。因此,分配的权重越远,即方差越大,你就越容易预测颜色。请把上述作为主要思想,为什么我们可以使用方差作为信息量的衡量标准,而不是声称 100% 的数学正确性。
好的,现在我们已经明白为什么我们想要具有最高方差(主成分)的方向。但在我们的路上,主要问题仍未得到解答。*我们如何获得这些主成分?* 我们通过找到具有最高方差的方向来获得这些主成分。
聪明的家伙……我们已经知道了。这句话包含两个重要的词:方向和方差——找到*方差*最高的*方向*——。好吧,我们可以做和我上面做的完全一样的事情,只需在数据集中画一条任意线。要知道这条线的好坏,我们必须沿着这条线测量数据的方差。现在我们知道(总体的)方差的公式是:
v一个r(X)=∑一世=1n(X一世-X¯)2n
但是这里 x 是一维的,我们的数据集有两个维度 x 和 y,因此:我们应该使用它们中的哪一个作为 X在方差计算中?我们应该计算 x 或 y 的方差吗?答案是:没有一个是正确的。为什么?看下图:
在这张图中,我画了两个箭头,一个指向 x 轴的方向,一个指向 y 轴的方向。如果我沿着这些箭头计算方差会发生什么?好吧,我计算沿特征 x 和沿特征 y 的方差。数据集如下所示:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import style
style 。使用( "fivethirtyeight" )
将 numpy 导入为 np
数据 = np 。阵列([[ 2.5 ,0.5 ,2.2 ,1.9 ,3.1 ,2.3 ,2 ,1 ,1.5 ,1.1 ],[ 2.4 ,0.7 ,2.9 ,2.2 ,3.0 ,2.7 ,1.6 ,1.1 ,1.6 ,0.9 ]])
打印(数据)
无花果 = plt 。图()
ax0 = 图。add_subplot ( 111 )
轴0 。分散(数据[ 0 ],数据[ 1 ])
PLT 。显示()
其中第一个列表表示 x 特征,第二个列表表示 y 特征。考虑下面的代码。如果我们沿着*x-箭头* 和*y-箭头* 计算数据集的方差会发生什么?我们计算沿特征 x 和 y 的方差!我们通过分别忽略另一个维度(特征)x 或 y 来隐式地做到这一点。也就是说,通过忽略 x 或 y,我们将数据投影到 x 或 y 轴上,从而降低维度,即切掉一维。
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import style
style 。使用( "fivethirtyeight" )
将 numpy 导入为 np
数据 = np 。阵列([[ 2.5 ,0.5 ,2.2 ,1.9 ,3.1 ,2.3 ,2 ,1 ,1.5 ,1.1 ],[ 2.4 ,0.7 ,2.9 ,2.2 ,3.0 ,2.7 ,1.6 ,1.1 ,1.6 ,0.9 ]])
打印(数据)
无花果 = plt 。图()
ax0 = 图。add_subplot ( 111 )
轴0 。分散(数据[ 0 ],数据[ 1 ])
ax0 。散射(数据[ 0 ],NP 。ones_like (数据[ 1 ])*分钟(数据[ 1 ])- 0.2 ,颜色= “红” )
AX0 。散射(NP 。ones_like (数据[ 0 ])*min ( data [ 0 ]) - 0.2 , data [ 1 ], color = "blue" )
ax0 。箭头( min ( data [ 0 ]) - 0.2 , min ( data [ 1 ]) - 0.2 , 0 , max ( data [ 1 ]) - 0.5 , width = 0.01 , color ="blue" , alpha = 0.4 , length_includes_head = "True" )
ax0 。箭头( min ( data [ 0 ]) - 0.2 , min ( data [ 1 ]) - 0.2 , max ( data [ 0 ]) - 0.3 , 0 , width = 0.01 , color = "red" , alpha = 0.4 ,length_includes_head = "True" )
ax0 。vlines ( data [ 0 ], min ( data [ 1 ]) - 0.2 , data [ 1 ], colors = "red" , linestyles = "--" , linewidth = 0.7 )
ax0 。hlines ( data [ 1 ], min ( data [ 0 ]) - 0.2 ,数据[ 0 ],颜色= “蓝色” ,线型= “--” ,线宽= 0.7 )
PLT
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。