机器学习:使用分形维数快速选择特征

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 查看本文章

机器学习:使用分形维数快速选择特征

换句话说:

  1. 绘制指向原始数值的属性E,称为embedded dimension space。由于机器学习数据集值不是无限的,因此生成的表面是有界的。
  2. 将机器学习数据集的表面划分为边长r的相等部分,从而产生r ^(E-1)个boxes的“超网格”。
  3. 仅计算包含至少一个点的boxes。
  4. 将这些boxes分成r ^(E-1)个boxes。
  5. 迭代E次。
  6. 数一数还有多少boxes。如果属性确实彼此独立,它们就不会共享一个box。这表示相关积分S(r)
  7. 取该积分的导数,利用S(r)的自然对数与(r)的自然对数成正比这个事实。

用ln(S(r))除以ln(r)就得到了机器学习数据集的本征维数的近似!这也被称为相关分形维数。

机器学习:使用分形维数快速选择特征

将该分数舍入到最接近的整数J,就得到了表示机器学习数据集所需的最小属性数。

接下来,我们按重要性顺序对这些特征进行排序,并丢弃最低的特征,直到您拥有前J个特征:

机器学习:使用分形维数快速选择特征

实质上:

  1. 逐个获取E特征中的一个并计算我们的机器学习数据集相对于其他E-1特征的部分分形维数。
  2. 选择最接近整个分形维数的部分分形维度的分组。
  3. 迭代此过程,直到我们有J个。
  4. 我们剩下的是最重要的特征。

令人兴奋的是,这些都来自于最初的特征,且是可读的。

参考资料:https://kilthub.cmu.edu/articles/Fast_feature_selection_using_fractal_dimension/6605570

猜你喜欢

转载自blog.csdn.net/weixin_42137700/article/details/91945232