package edu.xaut.activityrecognition;
/**
* LDA(线性判别分析)算法实现
* 需要JAMAjar包的支持
* http://www.psychometrica.de/lda.html
*
*/
import java.util.ArrayList;
import Jama.Matrix;
public class LDA {
private double[][] groupMean;
private double[][] pooledInverseCovariance;
private double[] probability;
private ArrayList<Integer> groupList = new ArrayList<Integer>();
/**
* LDA算法主要实现代码:
* @param d data---存储数据信息,其数据个数必须与group分组个数一致(7),即一一对应关系---x(i)
* @param g group---分组数据信息---y(i)
* @param p Set to true, if the probability estimation should be based on
* the real group sizes (true), or if the share of each group
* should be equal
*/
@SuppressWarnings("unchecked")
public LDA(double[][] d, int[] g, boolean p) {
// 检查数据和分组信息是否一致,即一一对应关系
if (d.length != g.length)
return;
// 存储data数据信息{ { 2.95, 6.63 }, { 2.53, 7.79 }, { 3.57, 5.65 },
// { 3.16, 5.47 }, { 2.58, 4.46 }, { 2.16, 6.22 }, { 3.27, 3.52 } }
double[][] data = new double[d.length][d[0].length];
for (int i = 0; i < d.length; i++) {
for (int j = 0; j < d[i].length; j++) {
data[i][j] = d[i][j];
}
}
// 存储group数据信息{1,1,1,1,2,2,2}
int[] group = new int[g.length];
for (int j = 0; j < g.length; j++) {
group[j] = g[j];
}
// 原始数据(不区分类别)均值
double[] globalMean;
// 协方差
double[][][] covariance;
// 通过groupList存储标签信息1,2
for (int i = 0; i < group.length; i++) {
if (!groupList.contains(group[i])) {
groupList.add(group[i]);
}
}
// 根据标签信息将数据划分为一个个子集,同一子集内的数据信息所对应的标签(类别)相同
ArrayList<double[]>[] subset = new ArrayList[groupList.size()];
for (int i = 0; i < subset.length; i++) {
subset[i] = new ArrayList<double[]>();
for (int j = 0; j < data.length; j++) {
if (group[j] == groupList.get(i)) {
subset[i].add(data[j]);
}
}
}
// 计算每一个子集(标签1,2)内的中心点,即均值mean
groupMean = new double[subset.length][data[0].length];
for (int i = 0; i < groupMean.length; i++) {
for (int j = 0; j < groupMean[i].length; j++) {
groupMean[i][j] = getGroupMean(j, subset[i]);
}
}
// 计算原始数据(不区分类别)的均值
globalMean = new double[data[0].length];
for (int i = 0; i < data[0].length; i++) {
globalMean[i] = getGlobalMean(i, data);
}
// 将每一个子集内的数据-globalMean,存储在原来的位置,为下一步计算协方差准备好数据
for (int i = 0; i < subset.length; i++) {
for (int j = 0; j < subset[i].size(); j++) {
double[] v = subset[i].get(j);
for (int k = 0; k < v.length; k++)
v[k] = v[k] - globalMean[k];
subset[i].set(j, v);
}
}
// 计算协方差
covariance = new double[subset.length][globalMean.length][globalMean.length];
for (int i = 0; i < covariance.length; i++) {
for (int j = 0; j < covariance[i].length; j++) {
for (int k = 0; k < covariance[i][j].length; k++) {
// 为每一个子集计算协方差,因为subset中存储的数据已经减去了globalMean,所以只需要相乘求和取其均值即可
for (int l = 0; l < subset[i].size(); l++)
covariance[i][j][k] += (subset[i].get(l)[j] * subset[i]
.get(l)[k]);
covariance[i][j][k] = covariance[i][j][k]
/ subset[i].size();
}
}
}
// 逆协方差池
pooledInverseCovariance = new double[globalMean.length][globalMean.length];
for (int j = 0; j < pooledInverseCovariance.length; j++) {
for (int k = 0; k < pooledInverseCovariance[j].length; k++) {
for (int l = 0; l < subset.length; l++) {
pooledInverseCovariance[j][k] += ((double) subset[l].size() / (double) data.length)
* covariance[l][j][k];
}
}
}
pooledInverseCovariance = new Matrix(pooledInverseCovariance).inverse()
.getArray();
// 计算测试数据属于不同分组的概率
this.probability = new double[subset.length];
// 如果p为false的话,则每种类别的概率相同1/n,n为类别数
if (!p) {
double prob = 1.0d / groupList.size();
for (int i = 0; i < groupList.size(); i++) {
this.probability[i] = prob;
}
} else {
// 如果p为true的话,则每种类别的概率等于属于该分组的条目数除以总数
for (int i = 0; i < subset.length; i++) {
this.probability[i] = (double) subset[i].size()
/ (double) data.length;
}
}
}
private double getGroupMean(int column, ArrayList<double[]> data) {
double[] d = new double[data.size()];
for (int i = 0; i < data.size(); i++) {
d[i] = data.get(i)[column];
}
return getMean(d);
}
private double getGlobalMean(int column, double data[][]) {
double[] d = new double[data.length];
for (int i = 0; i < data.length; i++) {
d[i] = data[i][column];
}
return getMean(d);
}
/**
* 计算不同分组的判别函数值
*
* @param values
* @return
*/
public double[] getDiscriminantFunctionValues(double[] values) {
double[] function = new double[groupList.size()];
for (int i = 0; i < groupList.size(); i++) {
// tmp就是w的转置
double[] tmp = matrixMultiplication(groupMean[i],
pooledInverseCovariance);
function[i] = (matrixMultiplication(tmp, values))
- (.5d * matrixMultiplication(tmp, groupMean[i]))
+ Math.log(probability[i]);
}
return function;
}
/**
* 根据马氏距离计算算不同分组的判别函数值
*
* @param values
* @return
*/
public double[] getMahalanobisDistance(double[] values) {
double[] function = new double[groupList.size()];
for (int i = 0; i < groupList.size(); i++) {
double[] dist = new double[groupMean[i].length];
for (int j = 0; j < dist.length; j++)
dist[j] = values[j] - groupMean[i][j];
function[i] = matrixMultiplication(matrixMultiplication(dist,
this.pooledInverseCovariance), dist);
}
return function;
}
/**
* 通过玛氏距离预测测试数据属于哪个类别
*
* @param values
* @return the group
*/
public int predictM(double[] values) {
int group = -1;
double max = Double.NEGATIVE_INFINITY;
double[] discr = this.getMahalanobisDistance(values);
for (int i = 0; i < discr.length; i++) {
if (discr[i] > max) {
max = discr[i];
group = groupList.get(i);
}
}
return group;
}
/**
* 计算测试数据属于不同分组的概率
*
* @param values
* @return the probabilities
*/
public double[] getProbabilityEstimates(double[] values) {
// TODO
return new double[] {};
}
/**
* 计算权值
*
* @return the weights
*/
public double[] getFisherWeights() {
double[] tmp = null;
for (int i = 0; i < groupList.size(); i++) {
// tmp就是w的转置
tmp = matrixMultiplication(groupMean[i],
pooledInverseCovariance);
}
return tmp;
}
/**
* 预测一个测试数据属于哪个类别
*
* @param values
* @return the group
*/
public int predict(double[] values) {
int group = -1;
double max = Double.NEGATIVE_INFINITY;
double[] discr = this.getDiscriminantFunctionValues(values);
for (int i = 0; i < discr.length; i++) {
if (discr[i] > max) {
max = discr[i];
group = groupList.get(i);
}
}
return group;
}
// /**
// * 两个矩阵相乘并将计算结果以 double[][]-array的形式返回.
// *
// * @param a
// * the first matrix
// * @param b
// * the second matrix
// * @return the resulting matrix
// */
// @SuppressWarnings("unused")
// private double[][] matrixMultiplication(final double[][] matrixA,
// final double[][] matrixB) {
// int rowA = matrixA.length;
// int colA = matrixA[0].length;
// int colB = matrixB[0].length;
//
// double c[][] = new double[rowA][colB];
// for (i
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
对原始数据集进行预处理,窗口划分,特征提取,特征融合,分类识别.zip (170个子文件)
FeatureExtraction.class 8KB
DSNaiveBayesianAlgorithm.class 6KB
LDA.class 6KB
KNNAlgorithm.class 6KB
NaiveBayesianAlgorithm.class 5KB
DecisionTreeAlgorithm.class 5KB
DataFusion.class 5KB
DataPreprocess.class 5KB
LDANew.class 4KB
Test.class 4KB
MatlabDS.class 4KB
SVMDataFormat.class 3KB
FeatureExtractionImpl.class 2KB
DBOperation.class 2KB
LDAImpl.class 2KB
DSDataFusion.class 2KB
DSDataFusionImpl.class 2KB
DataFusionImpl.class 2KB
ClassificationAlgorithmsImpl.class 2KB
SVMDataFormatImpl.class 2KB
DButil.class 1KB
KNNAlgorithm$1.class 1KB
KNNNode.class 1KB
LDAData.class 1002B
ActivityRecognition.class 926B
PreprocessingDataSaveImpl.class 690B
DataEntity.class 686B
ClassificationAlgorithms.class 355B
FeatureExtractionDao.class 347B
DSDataFusionDao.class 317B
DataFusionDao.class 305B
ClassificationAlgorithmsDao.class 301B
LDADao.class 291B
SVMDataFormatDao.class 279B
PreprocessingDataSaveDao.class 182B
.classpath 6KB
hadoop-core-1.2.1.jar 4.01MB
hibernate-core-3.6.10.Final.jar 2.98MB
lucene-core-4.6.1.jar 2.24MB
guava-15.0.jar 2.07MB
commons-math3-3.3.jar 1.86MB
mahout-math-0.9.jar 1.54MB
aws-java-sdk-1.0.002.jar 1.53MB
lucene-analyzers-common-4.6.1.jar 1.52MB
mockito-all-1.9.5.jar 1.51MB
mahout-core-0.9.jar 1.4MB
jfreechart-1.0.12.jar 1.31MB
util-core_2.10-6.23.0.jar 1.24MB
guava-r07.jar 1.03MB
jaxb-impl-2.2.3-1.jar 869KB
commons-math-2.1.jar 813KB
mysql-connector-java-5.1.20.jar 784KB
jackson-mapper-asl-1.9.12.jar 762KB
guice-3.0.jar 694KB
jersey-server-1.8.jar 678KB
javassist-3.12.1.GA.jar 629KB
commons-collections-3.1.jar 546KB
mysql-connector-java-5.0.8.jar 528KB
joda-time-1.5.2.jar 519KB
xstream-1.4.4.jar 472KB
jersey-core-1.8.jar 447KB
antlr-2.7.6.jar 433KB
logback-core-1.1.1.jar 418KB
log4j-1.2.13.jar 350KB
commons-lang3-3.1.jar 308KB
dom4j-1.6.1.jar 307KB
jcommon-1.0.15.jar 302KB
commons-httpclient-3.1.jar 298KB
commons-configuration-1.6.jar 292KB
hibernate-annotations-3.4.0.GA.jar 273KB
logback-classic-1.1.1.jar 265KB
commons-lang-2.4.jar 256KB
quickml-0.4.8.8.jar 252KB
junit-4.11.jar 239KB
commons-beanutils-core-1.8.0.jar 201KB
commons-beanutils-1.7.0.jar 184KB
commons-net-1.4.1.jar 177KB
commons-io-2.1.jar 159KB
jackson-core-asl-1.4.5.jar 147KB
jersey-json-1.8.jar 144KB
commons-digester-1.8.jar 140KB
commons-el-1.0.jar 110KB
jaxb-api-2.2.2.jar 103KB
hibernate-jpa-2.0-api-1.0.1.Final.jar 100KB
super-csv-2.2.0.jar 91KB
commons-cli-2.0-mahout.jar 89KB
hibernate-commons-annotations-3.2.0.Final.jar 70KB
jettison-1.1.jar 66KB
javatuples-1.2.jar 64KB
activation-1.1.jar 62KB
commons-logging-1.2.jar 60KB
libsvm-3.17.jar 60KB
ejb3-persistence-1.0.2.GA.jar 49KB
util-0.0.44.jar 49KB
commons-codec-1.3.jar 46KB
hamcrest-core-1.3.jar 44KB
asm-3.1.jar 42KB
stats-0.0.44.jar 41KB
commons-cli-1.2.jar 40KB
Jama-1.0.3.jar 35KB
共 170 条
- 1
- 2
资源评论
博士僧小星
- 粉丝: 1931
- 资源: 5896
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 萤石云固件CS-XP1-8B4WF
- HTML5小游戏【农场连连看-优秀H5小游戏合集】游戏源码分享下载 - farm.zip
- 基于Python的酒店评论情感分析源码+文档(高分项目).zip
- meta-llama-3-8b-instruct 的 model-00003-of-00004.safetensors 的3/3
- nginx配置文件,注意其中需要对应宿主机的路径
- 自用数据集自用数据集自用数据集
- HTML5小游戏【堆雪人-优秀H5小游戏合集】游戏源码分享下载 - epicsnowman.zip
- SNMP Client 是SNMP测试工具
- Android Camera内存统计脚本
- AD9220高速数据芯片硬件参考设计原理图+STM32F103单片机驱动程序代码+芯片技术手册资料.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功