pub struct PpcaModel {
pub num_channels: usize,
pub num_components: usize,
pub mean: Vec<f32>,
pub weights: Vec<f32>,
pub posterior_projection: Vec<f32>,
pub noise_variance: f32,
pub eigenvalues: Vec<f32>,
}Expand description
Probabilistic Principal Component Analysis (PPCA) model (Tipping & Bishop, 1999).
Generative Gaussian latent variable model: $$\mathbf{x} = \mathbf{W}\mathbf{z} + \boldsymbol{\mu} + \boldsymbol{\epsilon}, \quad \mathbf{z} \sim \mathcal{N}(\mathbf{0}, \mathbf{I}_q), \quad \boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \sigma^2 \mathbf{I}_D)$$
Fields§
§num_channels: usize§num_components: usize§mean: Vec<f32>§weights: Vec<f32>Factor loading matrix $\mathbf{W}$ of shape [num_channels, num_components] (row-major).
posterior_projection: Vec<f32>Posterior projection matrix $\mathbf{P} = \mathbf{W} (\mathbf{W}^\top \mathbf{W} + \sigma^2 \mathbf{I})^{-1}$
of shape [num_channels, num_components] so $\mathbb{E}[\mathbf{z} \mid \mathbf{x}] = \mathbf{P}^\top (\mathbf{x} - \boldsymbol{\mu})$.
noise_variance: f32Isotropic observation noise variance $\sigma^2$.
eigenvalues: Vec<f32>Top-$q$ eigenvalues of the sample covariance matrix.
Implementations§
Source§impl PpcaModel
impl PpcaModel
Sourcepub fn fit<F: DspFloat>(
client: &Client,
data: &[f32],
channels: usize,
samples: usize,
num_components: usize,
) -> Self
pub fn fit<F: DspFloat>( client: &Client, data: &[f32], channels: usize, samples: usize, num_components: usize, ) -> Self
Fits PPCA in closed form (maximum likelihood from the covariance eigendecomposition) on host
data [channels, samples]; covariance and eigendecomposition on the device in F.
Sourcepub fn fit_em_masked<F: DspFloat>(
client: &Client,
data: &[f32],
observed_mask: &[bool],
channels: usize,
samples: usize,
num_components: usize,
max_iters: usize,
) -> Self
pub fn fit_em_masked<F: DspFloat>( client: &Client, data: &[f32], observed_mask: &[bool], channels: usize, samples: usize, num_components: usize, max_iters: usize, ) -> Self
Fits PPCA via Expectation-Maximization (EM) with an observation mask ([channels, samples],
true = observed, false = missing/outside local neighborhood).
Sourcepub fn project_cpu(
&self,
data: &[f32],
channels: usize,
samples: usize,
) -> Vec<f32>
pub fn project_cpu( &self, data: &[f32], channels: usize, samples: usize, ) -> Vec<f32>
Computes posterior latent expectations $\mathbb{E}[\mathbf{z} \mid \mathbf{x}] = \mathbf{M}^{-1}\mathbf{W}^\top(\mathbf{x} - \boldsymbol{\mu})$
of shape [num_components, samples] on the CPU.
Sourcepub fn reconstruct_cpu(&self, z: &[f32], samples: usize) -> Vec<f32>
pub fn reconstruct_cpu(&self, z: &[f32], samples: usize) -> Vec<f32>
Reconstructs observations $\hat{\mathbf{x}} = \mathbf{W}\mathbf{z} + \boldsymbol{\mu}$ ([channels, samples]) from latent codes z ([num_components, samples]).
Sourcepub fn to_device<F: DspFloat>(&self, client: &Client) -> DeviceProjection
pub fn to_device<F: DspFloat>(&self, client: &Client) -> DeviceProjection
The projection with its weights uploaded once as F, for repeated calls.
Sourcepub fn project_gpu<F: DspFloat>(
&self,
client: &Client,
input_handle: &Handle,
output_handle: &Handle,
channels: usize,
samples: usize,
)
pub fn project_gpu<F: DspFloat>( &self, client: &Client, input_handle: &Handle, output_handle: &Handle, channels: usize, samples: usize, )
One-off device projection of [channels, samples] into [num_components, samples] (uploads
the weights; use Self::to_device for repeated calls).
Trait Implementations§
Auto Trait Implementations§
impl Forget for PpcaModel
impl Freeze for PpcaModel
impl Move for PpcaModel
impl RefUnwindSafe for PpcaModel
impl Send for PpcaModel
impl Sync for PpcaModel
impl Unpin for PpcaModel
impl UnsafeUnpin for PpcaModel
impl UnwindSafe for PpcaModel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneExpand for Twhere
T: Clone,
impl<T> CloneExpand for Twhere
T: Clone,
fn __expand_clone_method(&self, _: &Scope) -> T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more