Fenrier Lab

Jigsaw 项目--模块系统快速导引(中文翻译)

原文地址:Project Jigsaw: Module System Quick-Start Guide。 本文为了开发者快速入门 Java 模块化而介绍几个简单的例子。 在例子中,文件路径使用斜杠,且用冒号分隔不同的路径。对于 Windows 开发者,应该使用反斜杠标志文件路径,使用分号作为文件分隔符。 Greeting Greeting world 多模块编译 打包 缺失 requires 或者缺失 exports 服务 链接器 Greeting 第一个例子是一个打印出 “Greetings!” 的简单模块,这里命名为 com.greetings. 模块包含两个源文件,即模块声明(module-info.java)和主类。 根据惯例,源码...
点我阅读更多...

笔记--Java Logger

使用日志,首先就是要拿到日志对象,然后再指定日志文件存储路径嘛。不知道怎地,搞半天没在网上找到一篇关于怎么通过配置文件指定日志存储目录的文章。最后发现这篇博文 Java Logging: Handlers 才搞定这个问题。 首先获取 Logger 实例对象 Logger logger = Logger.getLogger("myLog"); 这里的参数为日志名称,在其他地方如果需要此日志对象,可以通过名称来获取。然后使用 LogManager 来读取配置文件 try { LogManager.getLogManager() .readConfiguration(new FileInputStream(new File("path/to/lo...
点我阅读更多...

Delaunay 网格划分算法

将一块区域进行网格化是计算几何中的一项重要议题,基于化繁为简的思想,任何复杂的模型都能分解成简单的几何元素。在应用上,整体的非线性行为,便可以由局部的线性拼接得到。 举个简单的例子,一段向上的楼梯,老远看去就是一条斜向上的直线,但实际上是由一段段水平和竖直的线段连成的。从某种意义上讲,将斜线表述成水平线和竖直线的组合降低了描述的层次,但代价是我们需要维护大量的低层次信息。或许对于一段斜直线来讲,这种代价并不值得,但对于更高层次的复杂信息,局部简化是我们目前唯一的办法。 定义 Delaunay 网格划分不是一种具体的算法,而是一种规范,它确保了网格中的三角形的形状处于可控的状态。这是网格划分中不得不考虑的问题,如果同一个单元中的节点离得老远,那么在插值的时候,其误差便没有保证,因为...
点我阅读更多...

SMO 算法介绍

根据前面对支持向量机的介绍,需要求解的优化问题为 \[\max\limits_\alpha \quad W(\alpha) = - \frac 1 2 \sum_{i,j = 1}^n \alpha_i \alpha_j y_i y_j<x^{(i)}, x^{(j)}>+ \sum_{i=1}^n \alpha_i\] \[\begin{aligned} s.t. \quad & \sum_{i = 1}^n \alpha_i y_i = 0\\ &y_i (\omega^T x^{(i)} + b) > 1 \quad \Rightarrow \quad \alpha_i = 0\\ &y_i (\omega^T x^{(i)} + b...
点我阅读更多...

共轭梯度法解线性方程组

之前提到,求解线性方程组 \(A x = b\) 等价于求下面二次型的极小值 \[f(x) = \frac 1 2 x^T A x - x^T b\] 在最速下降算法中,迭代点沿负梯度方向移动,这就导致迭代点走位太罗嗦,具体来说,若函数的等高线是很狭窄的椭圆,如果初始点取得不好,那么将会产生如下图所示低效的迭代路径 仅仅是二阶矩阵就需要如此多的迭代显然是不可接受的,那么是否有使用极少迭代次数便成功收敛的算法呢?答案是显然的,在上一节讨论最速下降算法的时候,我们谈到了一种特殊情况,即迭代点刚好落在椭圆的轴上,便只用执行一次迭代。所以现在的想法是能不能将初始点经过一次迭代就移动到椭圆的轴上,类似于下图 虽说这是很理想的方案,但此时迭代步长和方向都是未知的,我们可以先分别假设...
点我阅读更多...