Fenrier Lab

Java 类运行时动态编译技术

从 JDK 1.6 开始引入了用 Java 代码重写的编译器接口,使得我们可以在运行时编译 Java 源码,然后用类加载器进行加载,让 Java 语言更具灵活性,能够完成许多高级的操作。 从源文件到字节码文件的编译方式 对于一个 java 源文件 //Example.java public class Example{ @Override public String toString() { return "hello java compiler"; } } 传统的编译方式是使用命令行在当前目录下运行 javac Example.java 然后在同一目录下生成 Example.class 字节码文件。而使用 Java API 来编译类文件则稍微有点复...
点我阅读更多...

Java 中的动态代理

动态代理需求的出现 代理是一种设计模式,其作用是对原方法进行增强,并且不具侵入性。比如一个接口提供某个服务 public interface Service{ public void serve(String[] args); } 然后有一个类实现此服务 public class ServiceImpl implement Service{ @Override public void serve(String[] args){ System.out.println("serving..." + Arrays.toString(args)); } } 但如果我们想在正式调用服务之前或之后做一些额外工作,比如参数校验、资源关闭等等。若不使用代理,那么就...
点我阅读更多...

模式识别中的最小风险分类决策

前面这篇文章探讨的是使得分类错误率最小的分类原则。但当我们根据已知信息做分类的时候,不同的决策结果通常伴随着不同的风险,比如说在对人做病情诊断时,患病与不患病对应两种状态,我们假设分别为 \(\mathcal{C}_1\) 和 \(\mathcal{C}_2\) 。在诊断过程中收集到的病情特征用 \(x\) 表示,并且特征空间被分为两个部分 \(R_1\) 和 \(R_2\) ,当 \(x\in R_1\) 时,诊断为 \(\mathcal{C}_1\) ,即患病,否则诊断为 \(\mathcal{C}_2\) 未患病。 那么病情特征和诊断结果就有四种组合方式,这里用四个元组来表示,即 \[(x\in R_1, \mathcal{C}_2),\quad (x\in R_2, \ma...
点我阅读更多...

反向传播算法

本文的符号约定来自于 Andrew Ng 的 cs294a,推导过程参考边肇祺的《模式识别 第二版》。 上图是一个典型的前馈网络结构,定义训练集 \[S = \{(x^{(i)}, y^{(i)}) \mid i = 1,,,m\}\] 定义权重矩阵集,和偏置项集 \[W = \{W^i \mid i = 1,,,n_l\}, b = \{b^i\mid i = 1,,,n_l\}\] 图中隐藏层和输出层的单元被分隔成两部分,其中左边部分的 \(z^l\) 代表前一层单元的加权值 \[z^{l+1} = W^l a^l + b^l\] 右边的 \(a^l\) 则代表本单元的激活值 \[a^{l+1} = f(z^{l+1})\] 其中 \(f\) 为激活函数。在输...
点我阅读更多...

模式识别中的最小错误率分类决策

对于一个有监督的分类学习问题,如果我们把注意力仅集中在分类的对错上面,就自然会想到使用一个函数来度量分类的错误率,并且在学习的过程中尽量减小训练数据的分类错误率,这就是基于最小错误率的决策方法。 假设我们拿到了一组特征数据及其类别标签 \[S = \{(x_i, y_i)\mid i\in N^+, i\le n ,\, \,y_i \in \{\mathcal{C}_j\},\,j=1,2,,,k\}\] 也就是说,总共有 n 个特征,它们分属于 k 个类别。如果特征的维度是 d ,那么可以认为特征空间是一个 d 维实向量空间 \(R^d\) 的子集。分类行为其实就是在计算一个从特征空间到类别集合的映射,我们定义该映射如下 \[f:R^d \rightarrow C\] 这...
点我阅读更多...