Я бы предложил комбинацию выбора функций на основе PCA и k-средних.
Найдите ваши основные компоненты и закажите их по весу. И потребляют этих весов на каждой глубине вашей иерархии.
Например, давайте предположим, что у вас есть кластерная иерархия из четырех глубин, и вы получаете веса компонентов, например:
W1: 0.32
W2: 0.20
W3: 0.18
W4: 0.09
...
W1000: 0.00
Мы хотим потреблять вес 1/N
сверху для каждой глубины, где N
- это счетчик глубины. Принимая N
здесь 4
. 0.25
первого компонента расходуется, и мы достигаем:
W1: 0.07*
W2: 0.20
W3: 0.18
W4: 0.09
...
W1000: 0.00
Новая оценка для первого компонента становится 0.32-0.25=0.07
. Во второй итерации мы снова потребляем вершину 0.25
.
W1: 0.00*
W2: 0.02*
W3: 0.18
W4: 0.09
...
W1000: 0.00
Третья итерация:
W1: 0.00
W2: 0.00*
W3: 0.00*
W4: 0.04*
...
W1000: 0.00
И четвертая итерация использует остаток, где весит некоторые до 0.25
.
На каждой итерации мы используем только те функции, вес которых мы потребляем. Например, мы используем только PC1 и PC2 функций после KLT на второй итерации, поскольку это единственные компоненты, вес которых мы потребляем. Таким образом, компоненты для кластеризации для каждой итерации становятся:
Iteration 1: PC1
Iteration 2: PC1, PC2
Iteration 3: PC2, PC3, PC4
Iteration 4: PC4, ... PC1000
Вы можете настроить конечное потребление веса менее чем на 1.0
и использовать для этой цели меньшее количество весов. Это практически то же самое, что отфильтровывать все компоненты, превышающие целевой вес, для уменьшения размеров до кластеризации.
Наконец, я не знаю, есть ли название для этого подхода. Просто естественно использовать PCA для неконтролируемых проблем. Вы также можете попробовать контролируемый выбор объектов после первой итерации, поскольку у вас под рукой есть метки кластера.