使用谱聚类(spectral clustering)进行特征选择

简介: 在本文中,我们将介绍一种从相关特征的高维数据中选择或提取特征的有用方法。

谱聚类是一种基于图论的聚类方法,通过对样本数据的拉普拉斯矩阵的特征向量进行聚类,从而达到对样本数据聚类的目的。谱聚类可以理解为将高维空间的数据映射到低维,然后在低维空间用其它聚类算法(如KMeans)进行聚类

本文使用2021-2022年常规赛NBA球员的赛季数据。从特征之间的相关矩阵中绘制一个图表,显示可能相似的特征组,然后将研究谱聚类如何在这个数据集中工作。

数据中存在相关特征

在数据集进行EDA时,可能会得到一个结论:某些特征没有那么丰富的信息,一个简单的线性模型可以通过其他特征来准确预测它们。这种现象称为“多重共线性”,它不利于模型的泛化和可解释性。在理想情况下,我们希望特征都是彼此独立的,这样可以更好地解释和满足一些统计过程的假设,因为大多数统计模型假设随机变量是独立的。

我们可以用谱聚类算法对特征进行聚类来解决这个问题。

我们的数据集包括三张表:2021-2022赛季NBA球员的平均数据、高级数据和每百次控球数据。在球员姓名栏中加入特征后,我们计算特征的方差膨胀系数(VIF)来研究多重共线性。结果得到了下表:

因为合并了三个表,所以这些表中的一些特征彼此相关。

从相关矩阵创建图

为了能够看到相关的特征,我们画了一个特征图,将高度相关的特征连接在一起,希望能够找到公共相关性,循环相关性应该创建一些区域,其中每个特征依赖于其他特征。

 # We only display correlations higher than 0.7 in absolute value
 G=nx.Graph()
 foriinrange(len(columns)):
     col1=columns[i]
     forjinrange(i):
         col2=columns[j]
         val=corr_matrix.values[i,j]
         ifabs(val) >vis_threshold:
             G.add_edge(columns.index(col1), columns.index(col2) , color=get_color(abs(val), color_threshold))

圆圈内的每一个整数都对应这个图中的一个特征。看看在图的右下角形成一个五边形的公共相关性,10-3323-3-4。

10:投篮命中率,33:进攻效率,23:真实命中率,3:有效投篮命中率。这几个都表示进攻的效率。

而中心的密集连接使我们无法手工选择所有的特征。所以需要一种数学方法来找到这些规律。

拉普拉斯特征图

首先需要为一对特征定义“链接”或“邻居”的概念。我们的目标是将上图分解为不相连的部分,其中每个部分都由成对相关的特征组成,不同的部分应尽可能独立。由于我们只显示高于 0.7 的相关性(绝对值,相关性也可以为负,这里不关心符号),因此使用以下邻接矩阵定义:

我们有D个特征,矩阵B是邻接矩阵。

而我们希望在K维空间中找到这些特征的表示形式,其中K是用户定义的数字,指定将使用多少个坐标来表示每个特征。拉普拉斯特征映射方法的目的是寻找特征的表示法,使相邻特征尽可能接近地表示。这是通过以下损失函数[1]来实现的。

y向量是K维特征的表示。E函数惩罚相邻表示之间的距离。我们与论文不同,将y按行而不是列堆叠,以便更容易地看到特征向量的坐标解释。D是数据中特征的数量。

通过显式地写出这个和的项,可以很容易地看到这个问题实际上是一个轨迹最小化问题。

对使用 D 矩阵缩放的 Y 施加正交约束,可以从与 K 个最小非零特征值相关联的归一化拉普拉斯算子的特征向量中获得此优化问题的解 Y [1]。

Y矩阵的初始定义是将表示叠加到行上,但这里我们将特征向量叠加到列上,表明每个特征向量为表示增加一个维度。

我们最初的目标是将邻接图切割成小块,其中每个小块是一组独立于其他小块的特征。

这里我们想用损失函数来模拟目标。所以假设有m个不相交的邻接图顶点子集,惩罚子集之间的交叉连接,也就是说,不希望一个子集中的顶点连接到另一个子集[1]中的顶点。

这里的F是符合目标的损失函数。分子在一个顶点的交叉连接上求和,用总的簇内连接归一化。这里可以将总和中的项解释为给定子集的交叉连接与内部连接的比率。不相交的子集实际上就是要寻找的特征的谱簇。

下一步就是要证明拉普拉斯特征映射误差F和E之间的相似性。对于特征(上面定义的V集)的给定划分(聚类),定义一个矩阵Z,其形状为(D, m)。

该矩阵的列表示簇的元素。为了更清楚地说明这一点,这里演示了当D = 4和m = 3时这个矩阵是怎样的

上图有问题,只是为了演示

函数F是

这里的L是上面定义的拉普拉斯矩阵。与拉普拉斯特征映射的轨迹恒等式相同,但约束条件不同。

这样,我们将找到簇的问题变为找到一个最小化这条轨迹的上述形式的矩阵 Z。尽管有相似性,但这与拉普拉斯特征图不是同一个问题,因为 Z 的选择仅限于上述形式。如果不局限于这种形式,则Z的列一定是前m个特征向量。

为了放宽此约束并使用拉普拉斯特征图的机制,并且观察到 Z 矩阵的每一行都分配给一个簇,这与拉普拉斯特征映射类似,所以可以用Y矩阵代替Z, Y矩阵的行是K维特征的表示。所以要使用这两个最小化问题之间的联系,Z可以被认为是Y行的聚类版本。为了简化问题,只要设置Z等于与前m个非零最小特征值相关的前m个特征向量的堆栈,然后将其行聚类。

聚类步骤

取拉普拉斯算子的前 7 个特征向量来构造 Z,并采用分层聚类方法寻找Z行内的聚类。

我们检查树图,决定设置n_cluster = 6。这些特征簇是:

这6个组都有有意义的解释。

  • 第一个有点复杂,因为图的中心有一个非常密集的区域但是可以看到投篮次数、罚球次数、PER、使用率和场均时间统计数据被收集在这里,其他数据随着球员上场时间和进攻责任的增加而增加。因此可以得出结论,这个簇对应于进攻活动。
  • 第二个是组织能力,因为持球者通常有更高的失误。
  • 第三个对应进攻效率。
  • 第四个只有一个特征,表示球员的防守技巧
  • 第五个是篮板能力。
  • 最后一个是球员的三分球技术。

这里一个很好的发现是,我们的方法成功地区分了篮板和防守技能。好的篮板手并不总是好的防守(篮板包含进攻和防守,而防守不仅仅只有篮板),但是他们之间可能存在相关性。

该方法可以说的确成功地找到了邻接图的分组

总结

本文中我们绘制了特征的邻接图,展示了如何通过拉普拉斯矩阵的行发现特征之间的公共相关性,并进行聚类。

本文的代码:

https://avoid.overfit.cn/post/cfaa81824c714736970e7f49ffde07ab

作者:Yiğithan Gediz

目录
相关文章
|
12月前
|
安全 数据挖掘 文件存储
开发者如何使用文件存储CPFS
【10月更文挑战第8天】开发者如何使用文件存储CPFS
320 1
|
缓存 JavaScript 前端开发
JavaScript中DOM操作:新手常犯错误与避免策略
【4月更文挑战第1天】本文介绍了JavaScript中DOM操作的基础和新手常犯错误,包括频繁查询DOM、不恰当的遍历、滥用innerHTML、忽视异步与DOM状态以及过度同步更新。建议包括缓存DOM引用、注意文本节点、慎用innerHTML以防止XSS、正确处理异步和批量更新。遵循最佳实践,开发者能提升代码质量和应用性能。
525 2
|
机器学习/深度学习 5G
5G中的调制技术:从QPSK到256QAM,赋能高速率通信
5G中的调制技术:从QPSK到256QAM,赋能高速率通信
2947 5
|
11月前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统。重做日志主要用于保证事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务更改。二进制日志则记录了数据库的所有逻辑变化操作,用于数据的复制、恢复和审计。两者在写入时机、存储方式、配置参数和使用范围上有所不同,共同确保了数据库的稳定性和可靠性。
281 2
|
12月前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
444 5
|
设计模式 Java
Log4j 输出日志到 TextArea & JavaFX、Swing
Log4j 输出日志到 TextArea & JavaFX、Swing
|
SQL 安全 API
Django的安全性基石:防止SQL注入攻击
【4月更文挑战第15天】Django,Python的流行Web框架,以其内置的安全机制防范SQL注入攻击。通过ORM系统、安全查询API、用户输入验证和CSRF保护,确保应用安全。开发者应遵循最佳实践,如使用ORM、严格验证输入、及时更新库和限制敏感数据访问,以增强安全性。
|
机器学习/深度学习 人工智能 算法
【BN层】基础回顾:带你认识神经网络中常见的BN层
【BN层】基础回顾:带你认识神经网络中常见的BN层
1460 0
|
JavaScript 安全 前端开发
原生JS实现一键复制,一键粘贴
原生JS实现一键复制,一键粘贴
236 0
|
传感器 机器学习/深度学习 数据采集
使用PointNet深度学习进行点云分类
训练 PointNet 网络以进行点云分类。 点云数据由各种传感器获取,例如激光雷达、雷达和深度摄像头。这些传感器捕获场景中物体的3D位置信息,这对于自动驾驶和增强现实中的许多应用非常有用。例如,区分车辆和行人对于规划自动驾驶汽车的路径至关重要。然而,由于每个对象的数据稀疏性、对象遮挡和传感器噪声,使用点云数据训练稳健分类器具有挑战性。深度学习技术已被证明可以通过直接从点云数据中学习强大的特征表示来解决其中的许多挑战。点云分类的开创性深度学习技术之一是PointNet。
1322 0