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\]
这...
点我阅读更多...