Java实现MultivariateGaussian
来源:互联网 发布:mac文件放在桌面 编辑:程序博客网 时间:2024/06/04 19:18
用java写了MultivariateGaussian 类,计算高斯密度分布。
可以用于高斯混合分布中,
import java.io.Serializable;
import org.apache.spark.mllib.linalg.BLAS;
import org.apache.spark.mllib.linalg.DenseMatrix;
import org.apache.spark.mllib.linalg.Matrices;
import org.apache.spark.mllib.linalg.Matrix;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.util.MLUtils$;
import org.netlib.util.intW;
import com.github.fommil.netlib.LAPACK;
import scala.Array;
import scala.Tuple2;
import scala.reflect.ClassManifestFactory;
/**
*
*/
public class JavaMultivariateGaussian implements Serializable
{
private Vector mu;
private Matrix sigma;
private Matrix rootSigmaInv;
private double u ;
public JavaMultivariateGaussian( Vector mu, Matrix sigma )
{
super( );
this.mu = mu;
this.sigma = sigma;
Tuple2<Matrix, Double> value = calculateCovarianceConstants( );
rootSigmaInv = value._1;
u= value._2;
}
private Tuple2<Matrix, Double> calculateCovarianceConstants()
{
Tuple2<Vector, Matrix> value = eigSym( sigma );
Vector d = value._1;
Matrix u = value._2;
double tol = MLUtils$.MODULE$.EPSILON( )*d.apply( d.argmax( ) ) * d.size( );
double logPseudoDetSigma = caleSum( d, tol );
Matrix pingS = Matrices.diag( calePinvS( d, tol ) );
return new Tuple2<Matrix, Double>(pingS.multiply( (DenseMatrix)u.transpose( ) ), -0.5*(mu.size( ) * Math.log( 2.0*Math.PI ) + logPseudoDetSigma));
}
public double pdf(Vector x)
{
return Math.exp( logpdf( x ) );
}
private double logpdf(Vector x)
{
Vector delta = x.copy( );
BLAS.axpy( -1.0, mu, delta );
Vector v = rootSigmaInv.multiply( delta );
return u + BLAS.dot( v, v )*(-0.5);
}
private static Vector calePinvS(Vector v, double tol)
{
double[] ds = new double[v.size( )];
for (int i=0; i<v.size( ); i++)
{
double value = v.apply( i );
if (value > tol)
{
ds[i] = Math.sqrt( 1.0/value );
}
else
{
ds[i] = 0.0;
}
}
return Vectors.dense( ds );
}
private static double caleSum(Vector v, double tol)
{
double retValue = 0.0;
for (int i=0; i<v.size( ); i++)
{
double d = v.apply( i );
if (d > tol)
{
retValue = retValue + Math.log( d );
}
}
return retValue;
}
private static Tuple2<Vector, Matrix> eigSym(Matrix m)
{
int N = m.numRows( );
int C = m.numCols( );
Matrix A = Matrices.dense( N, C, lowerTriangular( m.toArray( ), N, C ));
double[] ms = A.toArray( );
Vector evs = Vectors.zeros( N );
int lwork = Math.max( 1, 3*N-1);
double[] work = (double[])Array.ofDim( lwork, ClassManifestFactory.classType( double.class ) );
intW info = new intW(0);
LAPACK lapack = LAPACK.getInstance( );
lapack.dsyev( "V", "L", N, ms, Math.max( 1, N ), evs.toArray( ), work, lwork, info );
A = Matrices.dense( N, C, ms );
return new Tuple2<Vector, Matrix>(evs, A);
}
private static double[] lowerTriangular(double[] martice, int row, int col)
{
int len = martice.length;
double[] retValue = new double[len];
for (int i=0; i<col; i++)
{
for (int j=0; j<row; j++)
{
int pos = i*col + j;
if (j>=i)
{
retValue[pos] = martice[pos];
}
else
{
retValue[pos] = 0.0;
}
}
}
return retValue;
}
}
- Java实现MultivariateGaussian
- Java实现
- java实现
- java实现排列组合实现
- 实现缓存 java实现
- JAVA实现的时钟实现
- 基数排序---Java实现+C++实现
- 整数实现翻转---java实现
- 手写实现Java ArrayList实现
- Java实现 数组实现队列
- java 实现递归实现tree
- 【算法数据结构Java实现】Java实现单链表
- 【java】java实现回文判断,递归实现
- 水果机(java实现)java多态性
- [java]java实现回调
- 【Java】Java实现多线程下载
- [Java] java实现多重继承
- 【Java】Java实现多线程下载
- maven项目svn的导入导出
- zTree插件,父子级不关联情况下,实现右击全选父级及子级菜单
- iFunk新动向,从科技到生活
- 阿里云centos环境之被dos,syn攻击策略和排查方法,持续更新<九>
- 支持向量机原理(二) 线性支持向量机的软间隔最大化模型
- Java实现MultivariateGaussian
- 12.11 CODING COFFEE菜单页面
- 三种编程命名规范
- 产品经理不再纸上谈兵——解析产品的评论排序规则
- D3D11 骨骼动画(基于MD5格式)
- 软件测试常考面试题
- C++类的成员函数,静态函数以及虚函数
- HDU 1698 Just a Hook (线段树区间更新)
- 线程并发学习----JUC工具类