首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

清理、处理和可视化数据集,第 2 部分 从干净的数据集中获取宝贵洞察-3

清理、处理和可视化数据集,第 2 部分 从干净的数据集中获取宝贵洞察-3

自适应共振理论ART 是一个算法系列,灵感来源于大脑处理信息的方式。ART                实现了增量学习的概念,使大脑能够在存储新记忆的同时保留旧记忆(解决了所谓的“可塑性/稳定性”窘境)。该理论的思路是:学习模型需要可塑性来整合新知识,但需要稳定性来保留旧知识。随着新样本的出现,经过向后传播训练的网络可能会丢失信息。
图 4 显示了用于无监督学习的 ART                模型的基本架构。输入被应用于一个比较层,进而通过一组权重应用于一个识别层。如果输入与识别层中的某个神经元足够相似,就会针对新观察值来更新权重。相似性测试基于某个警戒参数,该参数可以将观察值应用到一个新的、不活动的神经元上。此参数允许                ART 根据输入来调节输出类的数量,将观察值推送到新神经元(实现了旧神经元和它拥有的信息的稳定性,以及新神经元合并新知识的可塑性)。
图 4. ART1 无监督学习架构警戒参数是 ART 模型的一个重要部分:较高的警戒参数将会生成详细的记忆,较低的警戒参数将会产生更为笼统的记忆。警戒参数为 1.0                时,会强制输出神经元等于它们的输入。
实现 ART从前面的描述很容易看出,ART 实现了矢量分类(ART1                特别关注二进制值数据)。输入特征矢量类似于已存储的现有知识时,就会针对该观察值强化分类输出节点。如果观察值与任何活动的输出神经元都不相似(给定警戒值),可以形成一个新神经元对此模式进行分类。
查看                 的一个样本实现。此实现的基本高级流程如下图所示。与 VQ 一样,文件 learn.c 实现了通用元素,而 art.c 实现了 ART                算法。初始化后,art_train 实现了 ART1                学习,能够将观察值划分到一个类似输出,或者为观察值创建一个新集群。art_validation                函数能够确定新观察值的输出节点(集群),但不会对模型执行任何新训练。
图 5. ART 实现的高级流程图下面,我最多支持 9                    个集群(或可供该算法创建的原型矢量)。矢量是一种用作观察值(特征矢量)和集群本身的多用途结构,包括观察值信息(名称、特征)、集群和以前定义的类。对于集群,count                字段表明了集群中包含多少个特征矢量。
清单 7. ART1                    类型和符号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define CLUSTERS           9

#define BETA             ( double )7.0
#define RHO              ( double )0.55

typedef struct vector
{
   char name[ MAX_NAME ];
   int  features[ MAX_FEATURES ];
   int  count;    // Prototype cluster count
   int  cluster;  // Feature vector cluster
   int  actual_class;
} vector;

// In-memory observations (feature vectors)
vector feature_vectors[ MAX_FEAT_VECS ];
int    max_feature_vectors;

// Prototype feature vectors
vector clusters[ CLUSTERS ];




清单 8 提供了 ART 算法的主循环。尽管任何特征矢量都可以更改类,但我将继续通过该算法执行整个数据集。我迭代每个观察值,并调用                cluster_observation                来查看它属于何处。如果没有找到类似的集群,该代码会尝试创建一个新集群;否则,它会将该观察值添加(或移动)到识别出的集群。
清单 8. ART                主循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void art_train( FILE *fptr )
{
   int changes = 1;
   int cluster;

   while ( changes )
   {
      changes = 0;

      for (int feature = 0 ; feature < max_feature_vectors ; feature++)
      {
         cluster = cluster_observation( feature );

         if ( cluster == CLUSTERS )
         {
            cluster_create( feature );
            changes++;
         }
         else
         {
            // If this feature vector has moved, move it.
            if ( feature_vectors[ feature ].cluster != cluster )
            {
               cluster_add( cluster, feature );
               changes++;
            }
         }
      }
   }

   emit_clusters( fptr );

   return;
}




ART 算法可在清单 9 中的 cluster_observation                    中找到。此函数确定了某个观察值与原型矢量集的相似性,或者确定是否要创建一个新原型矢量(集群)来支持该观察值。此函数依赖于矢量幅值,矢量幅值被定义为一个矢量中包含的                1                的数量。此函数拆分为两部分:第一部分查找与特征矢量最相似的原型集群,第二部分确定该集群的相似程度是否足以将观察值放入该集群中。否则,可以创建一个新集群。
清单 9. 在 ART1                    中对观察值进行聚类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
int cluster_observation( int feature )
{
   vector result;
   double best_max = 0.0;
   int best_cluster = CLUSTERS;

   double featureMag = ( double )vMagnitude( &feature_vectors[ feature ] );

   for ( int cluster = 0 ; cluster < CLUSTERS ; cluster++ )
   {
      // If a cluster has no members, skip it.
      if ( clusters[ cluster ].count == 0 ) continue;

      vAnd( &result, &feature_vectors[ feature ], &clusters[ cluster ] );
      double resultMag = ( double )vMagnitude( &result );
      double clusterMag = ( double )vMagnitude( &clusters[ cluster ] );
      double maximum = resultMag / ( BETA + clusterMag );

      if ( maximum > best_max )
      {
         best_max = maximum;
         best_cluster = cluster;
      }

   }

   if ( best_cluster != CLUSTERS )
   {
      vAnd( &result, &feature_vectors[ feature ], &clusters[best_cluster] );
      double resultMag = ( double )vMagnitude( &result );
      double clusterMag = ( double )vMagnitude( &clusters[ best_cluster ] );
      double maximum    = resultMag / ( BETA + clusterMag );
      double similarity = featureMag / ( BETA + ( double ) MAX_FEATURES );

      // See if the feature vector is similar to the cluster
      if ( maximum > similarity )
      {
         if ( ( resultMag / clusterMag ) >= RHO )
         {
            return best_cluster;
         }
      }
   }

   return CLUSTERS;
}




在一个示例的上下文中查看来自清单 9 的等式。图 6演示了对一个特征矢量和两个原型矢量进行聚类的过程。回想一下,集群的幅度是该矢量中包含的 1                的数量,矢量 AND 运算类似于按位 AND。值 n                是我的特征矢量和集群的维度。
在部分 A 和部分 B 中,可以注意到原型矢量 0 最大化了所显示的等式。然后,部分 C 和部分 D 将测试在满足我的阈值                RHO 的前提下,特征矢量是否与所选的原型矢量足够相似。所以,在这种情况下,特征矢量被添加到原型矢量 0                所表示的集群中。
图 6. ART 相似性等式图示清单 10 提供了集群管理函数。第一个函数 cluster_create                找到一个空集群,并将特征矢量作为其原型加载到其中。它将成员数设置为 1,然后表明该特征矢量包含在该集群中。在                cluster_add                中,我首先检查该特征矢量目前是否包含在某个集群中。如果是,则从该集群删除它,然后重新计算该集群的原型矢量。然后,将该特征添加到新集群并重新计算它的原型矢量。
清单 10. 创建特征或向现有集群添加特征的函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void cluster_create( int feature )
{
   int cluster = find_empty_cluster( );

   if ( cluster != CLUSTERS )
   {
      for ( int i = 0 ; i < MAX_FEATURES ; i++ )
      {
         clusters[ cluster ].features[ i ] =
            feature_vectors[ feature ].features[ i ];
      }
      clusters[ cluster ].count = 1;
      feature_vectors[ feature ].cluster = cluster;
   }

   return;
}

void cluster_add( int cluster, int vector )
{
   // If the current feature vector has been classified, pull it out.
   if ( feature_vectors[ vector ].cluster != CLUSTERS )
   {
      int prior_cluster = feature_vectors[ vector ].cluster;
      feature_vectors[ vector ].cluster = CLUSTERS;
      clusters[ prior_cluster ].count--;
      recalculate_cluster( prior_cluster );
   }

   // Add the feature vector to the new cluster.
   feature_vectors[ vector ].cluster = cluster;
   clusters[ cluster ].count++;
   recalculate_cluster( cluster );

   return;
}




这个 ART 演示中的最后一个函数是 recalculate_cluster(参见清单                11)。此函数将迭代特征矢量,并找到包含在该集群中的那些特征矢量。将找到的第一个特征矢量直接载入集群的原型矢量中,在该矢量中,后续特征矢量都被屏蔽(以便该原型矢量是与该集群有关的所有特征成员的按位                AND 运算结果)。
清单 11. 重新计算集群的原型矢量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void recalculate_cluster( int cluster )
{
   int first = 0;

   for ( int vec = 0 ; vec < max_feature_vectors ; vec++ )
   {
      if ( feature_vectors[ vec ].cluster == cluster )
      {
         if ( !first )
         {
            first = 1;

            // Set the cluster to the first feature vector.
            for (int feature = 0 ; feature < MAX_FEATURES ; feature++ )
            {
               clusters[ cluster ].features[ feature ] =
                  feature_vectors[ vec ].features[ feature ];
            }
         }
         else
         {
            // Boolean AND the next feature vectors into the cluster.
            for (int feature = 0 ; feature < MAX_FEATURES ; feature++ )
            {
               clusters[ cluster ].features[ feature ] &=
                  feature_vectors[ vec ].features[ feature ];
            }
         }
      }
   }

   return;
}代码比矢量量化的代码多一些,但 ART 可能比 VQ 更稳健。接下来,我将展示该算法的实际应用。

返回列表