Внедрить линейный дискриминантный анализ

Я пытаюсь реализовать LDA с нуля, используя эти заметки https://web.stanford.edu/class/stats202/content/lec9.pdf (стр. 34).

Чтобы проверить мою реализацию, я сравниваю свои априоры, групповые средние значения и коэффициенты линейных дискриминантов с lda() функция в библиотеке MASS. Мои значения приоры и группы совпадают со значениями, произведенными lda(), Однако мои коэффициенты отличаются. Вот игрушечный пример:

group1 = replicate(3, rnorm(10, mean = 1))
group2 = replicate(3, rnorm(15, mean = 2)) 
x = rbind(group1, group2)
colnames(x) = c(1, 2, 3)
y = matrix(rep(1, 10), ncol = 1)
y = rbind(y, matrix(rep(2, 15), ncol = 1))
colnames(y) = 'y'

library(MASS)
xy = cbind(x, y)
lda.fit = lda(y ~ ., as.data.frame(xy))

LDA <- function(x, y) {
    group1_index = which( y == 1 )
    group2_index = which( y == 2 )
    #priors:
    prior_group1 = length(group1_index) / length(y)
    prior_group2 = length(group2_index) / length(y)
    print("Prior probabilities of groups:")
    print(c(prior_group1, prior_group2))
    #means:
    mean_group1 = colMeans(x[group1_index, ])
    mean_group2 = colMeans(x[group2_index, ])
    print("Group means:")
    print(rbind(mean_group1, mean_group2))
    #discriminant coefficients:
    x[group1_index, ] = sweep(x[group1_index, ], 2, mean_group1, "-")
    x[group2_index, ] = sweep(x[group2_index, ], 2, mean_group2, "-")
    sigma = solve(cov(x))
    disc_coeff = sigma %*% mean_group1 
    print("Coefficients of linear discriminants:")
    print(disc_coeff)
}

LDA(x, y)

Итак, я вычисляю векторы отклонений и оцениваю ковариационную матрицу, как описано на слайдах. Вот результаты моей реализации и lda():

> LDA(x, y)
[1] "Prior probabilities of groups:"
[1] 0.4 0.6

[1] "Group means:"
                    1         2        3
mean_group1 0.9886488 0.7906502 1.228568
mean_group2 1.9180531 1.9603046 2.175800

[1] "Coefficients of linear discriminants:"
      [,1]
1 2.449038
2 2.687901
3 3.108110

> lda.fit
Call:
lda(y ~ ., data = as.data.frame(xy))

Prior probabilities of groups:
  1   2 
0.4 0.6 

Group means:
        `1`       `2`      `3`
1 0.9886488 0.7906502 1.228568
2 1.9180531 1.9603046 2.175800

Coefficients of linear discriminants:
          LD1
`1` 0.7204303
`2` 1.0612863
`3` 1.0114053

Я пытался посмотреть на исходный код lda() Функция, однако, это очень сложно для начинающего программиста R.

Кто-нибудь может предложить, если коэффициенты линейных дискриминантов должны быть рассчитаны по-другому? Или, возможно, lda() делает некоторую постобработку, которую я не включил в мою реализацию?

0 ответов

Другие вопросы по тегам