Основные компоненты могут решить эту проблему за вас. Предполагая, что ваши данные действительно соответствуют плоскости, первые два основных компонента должны хорошо описывать эту плоскость.
Вы не предоставляете никаких образцов данных, поэтому я проиллюстрирую некоторые искусственные данные. Мои данные десятимерны, но все точки лежат близко к плоскости (с некоторой погрешностью в остальных восьми направлениях).
## Sample data
set.seed(2018)
NPts = 1000
x = runif(NPts)
y = runif(NPts)
cx = rnorm(1)
cy = rnorm(1)
V1 = cx*x + cy*y + rnorm(NPts, 0, 0.1)
MyData = data.frame(V1)
for(i in 2:10) {
cx=rnorm(1)
cy= rnorm(1)
name = paste0("V", i)
MyData[,name] = cx*x + cy*y + rnorm(NPts, 0, 0.1)
}
Поскольку все переменные представляют собой линейные комбинации x и y (плюс небольшая ошибка), данные являются только двумерными и находятся вблизи плоскости x-y. Здесь я рассматриваю x и y как скрытые переменные. Они не появляются в данных, но управляют поведением всех остальных переменных.
## Principal Components Analysis
PCA = prcomp(MyData)
plot(PCA)
Да, данные выглядят в основном двухмерными. Остается только получить первые две главные компоненты. Они хранятся в структуре, возвращенной из prcomp
.
PCA$rotation[,1:2]
PC1 PC2
V1 0.42752681 -0.204894748
V2 -0.64546573 -0.056503044
V3 0.04606707 -0.009614603
V4 0.01956126 -0.539070667
V5 0.15987617 0.600122935
V6 -0.06255399 0.054053476
V7 0.26497132 0.388920891
V8 0.21645814 -0.366709584
V9 0.49363625 -0.116954131
V10 0.08874645 0.040656622
Плоскость, которую мы ищем, — это плоскость, натянутая на эти два вектора.
person
G5W
schedule
12.02.2018