人们经常将无监督特征选择 (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。