Voy a suponer que ha entrenado su clasificador utilizando el mismo número de muestras donde y=0 y y=1 es decir, con un previo implícito de que POld(y=1)POld(y=0)=11 .
También supondré que su clasificador hace predicciones probabilísticas sobre POld(y=1|x,θ) donde x son los datos a predecir y θ son los parámetros/vectores de soporte entrenados. Resulta útil representar estas predicciones como odds ratios, POld(y=1|x,θ)POld(y=0|x,θ) .
Para obtener las probabilidades posteriores dada su nueva prior, tenemos que encontrar la razón de verosimilitud, P(x|y=1,θ)P(x|y=0,θ) . Dado que sus antiguas probabilidades anteriores eran 11 , el cociente de probabilidades es el mismo que el cociente de probabilidades de tu antigua predicción:
P(x|y=1,θ)P(x|y=0,θ)=11×POld(y=1|x,θ)POld(y=0|x,θ);
Ahora, imagine primero que sus nuevas probabilidades previas son sólo una estimación puntual, PNew(y=1)PNew(y=0)=π1π0 . Sus nuevas probabilidades posteriores son simplemente las nuevas probabilidades anteriores multiplicado por la razón de verosimilitud, que es también la predicción de su SVM:
PNew(y=1|x,θ)PNew(y=0|x,θ)=π1π0×POld(y=1|x,θ)POld(y=0|x,θ)
En su lugar, tiene una distribución sobre probabilidades a priori, P(y=1)∼Beta(α,β) . Hay varias formas de obtener la posterior correspondiente, pero la más sencilla es muestrear las probabilidades de clase a partir de la anterior, convertirlas en probabilidades y multiplicarlas por la probabilidad para obtener muestras de la probabilidad posterior. Alternativamente, se puede calcular la densidad sobre una rejilla de probabilidades a priori, y transformar apropiadamente para encontrar las correspondientes probabilidades a posteriori. El código siguiente muestra ambos enfoques.
library(magrittr)
odds2prob = function(o) o / (1 + o)
prob2odds = function(p) p / (1 - p)
old.prior.odds = 1/1
svm.posterior.prob = .8 # P(y=1)
svm.posterior.odds = prob2odds(svm.posterior.prob) # = 4/1
likelihood.ratio = svm.posterior.odds / old.prior.odds # Also = 4/1
# New odds point estimate
new.prior.odds = 1/3
new.posterior.odds = new.prior.odds * likelihood.ratio # 4/1 * 1/3 = 4/3
new.posterior.odds
# Samples from posterior
prior.prob.samps = rbeta(1000, 10, 20)
prior.odds.samps = prob2odds(prior.prob.samps)
new.posterior.odds.samps = prior.odds.samps * likelihood.ratio
# Take the mean of the log odds to Normalise the distribution
new.posterior.prediction = new.posterior.odds.samps %>% log() %>% mean() %>% exp() %>% odds2prob()
new.posterior.prediction # ~0.66
# Calculate over grid
probs = seq(0.001, .999, .01)
density = dbeta(probs, 10, 20)
odds = prob2odds(probs)
plot(probs, density, main='Prior density', xlab = 'P(y=1)')
plot(odds2prob(odds * likelihood.ratio), density,
main='Posterior density', xlab = 'P(y=1)')
![enter image description here]()