https://www.toutiao.com/a6701977671481426439/
大数据与维度诅咒
在机器学习中,哪些数据特征与最相关呢?我们的参数列表都会非常多。这可能会增加计算成本,对其他数据造成严重影响,并且由于数据属性的冗余而降低机器学习模型性能。有几种方法可以减少数据维度,如主成分分析、因子分析和人工神经网络。今天我们来看另一种方法。
使用分形维数
分形是嵌入在维度空间E中的自相似对象。让我们看一下嵌入2维的经典Sierpiński地毯。
import pillow as PIL
from PIL import Image
from PIL import ImageDraw
def save_animated_gif(filename, images, duration):
# done using https://pillow.readthedocs.io/en/latest/handbook/image-file-formats.html#saving
first_image = images[0]
other_images = images[1:]
first_image.save(filename, save_all=True, append_images=other_images, duration=duration, loop=0)
def make_pattern(draw, x, y, section_size, remaining_levels):
if remaining_levels <= 0:
return
hole_color = (5, 205, 65)
corner = (x + section_size / 3, y + section_size / 3)
# -1 necessary due to https://github.com/python-pillow/Pillow/issues/3597
opposite_corner = (x + section_size * 2/3 - 1, y + section_size * 2/3 - 1)
draw.rectangle((corner, opposite_corner), fill=hole_color)
parts = 3
for x_index in range(parts):
for y_index in range(parts):
x_anchor = x + section_size * x_index / parts
y_anchor = y + section_size * y_index / parts
new_size = section_size / 3
new_levels = remaining_levels - 1
make_pattern(draw, x_anchor, y_anchor, new_size, new_levels)
def make_carpet(levels, size):
carpet_color = (5, 60, 20)
carpet = Image.new("RGBA", (size, size), carpet_color)
draw = ImageDraw.Draw(carpet)
make_pattern(draw, 0, 0, size, levels)
return carpet
levels = 7
size = 3**levels
carpets = []
carpets.append(make_carpet(0, size))
standard_frame_time_in_ms = 1200
durations = [standard_frame_time_in_ms / 2] # first stage visible for a short time
for i in range(levels - 1):
carpets.append(make_carpet(i + 1, size))
durations.append(standard_frame_time_in_ms)
durations[-1] *= 4 # final stage of animation visible for a long time
save_animated_gif("Sierpiński's carpet.gif", carpets, durations)
Sierpiński地毯的分形动画
这很简单。将表面划分为每个维度3个部分(r = 3,E = 2)。这样就去掉了原来9 (r^E)个squares中的1个square,只剩下8 (k)个。在这种情况下,分形维数是ln(k)/ ln(r)。这里是ln(8)/ ln(3),大约是1.8928。
近似数据集的分形维数
真实数据不是无限自相似的。box-counting算法是近似对象(在本例中为机器学习数据集)的最常用方法。
扫描二维码关注公众号,回复:
6538995 查看本文章
换句话说:
- 绘制指向原始数值的属性E,称为embedded dimension space。由于机器学习数据集值不是无限的,因此生成的表面是有界的。
- 将机器学习数据集的表面划分为边长r的相等部分,从而产生r ^(E-1)个boxes的“超网格”。
- 仅计算包含至少一个点的boxes。
- 将这些boxes分成r ^(E-1)个boxes。
- 迭代E次。
- 数一数还有多少boxes。如果属性确实彼此独立,它们就不会共享一个box。这表示相关积分S(r)
- 取该积分的导数,利用S(r)的自然对数与(r)的自然对数成正比这个事实。
用ln(S(r))除以ln(r)就得到了机器学习数据集的本征维数的近似!这也被称为相关分形维数。
将该分数舍入到最接近的整数J,就得到了表示机器学习数据集所需的最小属性数。
接下来,我们按重要性顺序对这些特征进行排序,并丢弃最低的特征,直到您拥有前J个特征:
实质上:
- 逐个获取E特征中的一个并计算我们的机器学习数据集相对于其他E-1特征的部分分形维数。
- 选择最接近整个分形维数的部分分形维度的分组。
- 迭代此过程,直到我们有J个。
- 我们剩下的是最重要的特征。
令人兴奋的是,这些都来自于最初的特征,且是可读的。
参考资料:https://kilthub.cmu.edu/articles/Fast_feature_selection_using_fractal_dimension/6605570