如何为聚类进行特征选择并在python中实现?

数据挖掘 机器学习 数据挖掘 聚类 特征选择 无监督学习
2021-10-10 14:49:51

我正在尝试在 60-70 个特征上实现 k-means 聚类,我在quora上看到了 Julian Ramos 的一篇关于特征选择技术的帖子,但我不明白提到的几个步骤。我还想知道它是否是选择最佳聚类特征的正确方法?

这些是帖子中提到的步骤:

Sf={∅} #选择的特征集,初始为空

  1. 对一些 k 分别对每个特征执行 k-means。
  2. 对于每个集群,测量一些集群性能指标,如邓恩指数或轮廓。
  3. 获取为您提供最佳性能的功能并将其添加到 Sf
  4. 分别对 Sf 和剩余的每个特征执行 k-means
  5. 获取为您提供最佳性能的功能并将其添加到 Sf
  6. 如果您已达到所需的功能数量,则停止,否则返回 4

另外,我们如何在 python 中实现相同的功能。我希望为相同的函数编写选择最佳的函数k并实现所有其他步骤。

2个回答

人们经常将无监督特征选择 (UFS) 和降维 (DR) 算法混为一谈。例如,著名的 DR 算法是主成分分析 (PCA),它经常被混淆为 UFS 方法!研究人员认为 PCA 是一种特征提取算法而不是特征选择,因为它将原始特征集转换为相互关联的转换特征的子集,这些特征难以模仿(Abdi & Williams, 2010)。

文献中出现的 UFS 方法是主要特征分析PFA它的工作方式如下:脚步:

  • 计算样本协方差矩阵或相关矩阵,
  • 计算协方差或相关矩阵 A 的主成分和特征值。
  • 选择子空间维度n,我们得到新的矩阵A_n,向量Vi是A_n的行。
  • 使用 K-Means 对向量 |Vi| 进行聚类
  • 对于每个聚类,找到最接近聚类平均值的对应向量 Vi。

下面给出了 PFA 的一个可能的 python 实现;

from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from collections import defaultdict
from sklearn.metrics.pairwise import euclidean_distances
from sklearn.preprocessing import StandardScaler
import pandas as pd
# create some dummy data
df = pd.DataFrame({'num_legs': [2, 4, 8, 0],
                   'num_wings': [2, 0, 0, 0],
                   'num_specimen_seen': [10, 2, 1, 8]},
                  index=['falcon', 'dog', 'spider', 'fish'])
print(df)
class PFA(object):
    def __init__(self, n_features, q=None):
        self.q = q
        self.n_features = n_features
    
    def fit(self, X):
        if not self.q:
            self.q = X.shape[1]
    
        sc = StandardScaler()
        X = sc.fit_transform(X)
    
        pca = PCA(n_components=self.q).fit(X) # calculation Covmatrix is embeded in PCA
        A_q = pca.components_.T
    
        kmeans = KMeans(n_clusters=self.n_features).fit(A_q)
        clusters = kmeans.predict(A_q)
        cluster_centers = kmeans.cluster_centers_
    
        dists = defaultdict(list)
        for i, c in enumerate(clusters):
            dist = euclidean_distances([A_q[i, :]], [cluster_centers[c, :]])[0][0]
            dists[c].append((i, dist))
    
        self.indices_ = [sorted(f, key=lambda x: x[1])[0][0] for f in dists.values()]
        self.features_ = X[:, self.indices_]
            
# Usage
pfa = PFA(n_features=3)
pfa.fit(df)
# To get the transformed matrix
x = pfa.features_
print(x)
# To get the column indices of the kept features
column_indices = pfa.indices_

结果

        num_legs  num_wings  num_specimen_seen
falcon         2          2                 10
dog            4          0                  2
spider         8          0                  1
fish           0          0                  8
[[-0.50709255  1.73205081  1.23942334]
 [ 0.16903085 -0.57735027 -0.84802649]
 [ 1.52127766 -0.57735027 -1.10895772]
 [-1.18321596 -0.57735027  0.71756088]]

参考

Abdi, H. 和 Williams, LJ (2010)。主成分分析。威利跨学科评论:计算统计,2(4),433-459。

您可能对这篇论文和集群工具和论文的各种其他特征选择的 python 实现感兴趣:

http://www.public.asu.edu/~huanliu/papers/pakdd00clu.pdf

https://github.com/danilkolikov/fsfc

总结该方法的摘录:

我们解决了为整个数据选择重要特征子集的问题,而不仅仅是针对 [1,2] 中的集群,这有​​助于在进行聚类之前了解重要特征,并且聚类任务变得更加高效和集中只能使用重要特征 为整个数据找到重要的原始特征有助于更好地理解数据,这与主成分不同 数据存储收集和处理任务变得更加高效,并且随着数据的修剪减少了噪音

我们的方法是一种两步法,我们首先排名,然后选择重要特征的子集。根据特征对聚类的重要性对特征进行排序引入基于熵的排序度量然后使用标准函数选择特征子集,该标准函数对于不同数量的特征是不变的基于随机抽样的新型可扩展方法是为数据挖掘应用程序中常见的大数据引入

此外,本文概述了可用的不同方法:

https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.295.8115&rep=rep1&type=pdf