# 2022VIS 投稿经验总结:如何从零开始进行一项科研

# 大方向的确定

根据自己的兴趣或是导师的推荐,确定自己研究的大方向是开启科研的第一步。研究大方向的确定一般包括以下几个方面。类似地,阅读一篇未知的论文,需要率先搞懂的问题也是下面的几个。

  1. 研究需要针对的问题是什么?

    越细致越好,具体到一个可以直接下手的问题。并且在确定问题的过程中,尽量加入限定的条件,例如解决问题的对象,解决问题的策略,以方便日后反射条件查找相应文献,提出解决策略。例如,将 “提出一个新的 Treemap 算法” 细化为 “对于一组时序数据,提出一个新的 Treemap 算法,使得算法具有良好的视觉质量布局稳定性”。

  2. 研究需要跟随哪一篇论文?

    对于一个研究 (而不是综述等研究的总结),如果自己不是某个领域的开山鼻祖,那么一定需要跟随先前的研究。在跟随的过程中,需要解决的问题最为相似,且在相关领域中研究成果最新的,一般是我们跟随的对象。

  3. 改进的策略是什么?

    与主论文相比,我们需要在哪部分进行改进?需要进行怎样的改进?我们改进的想法是什么?

    想法的来源:

    1. 来自导师 or 与行业大佬的交流
    2. 将问题进行迁移,借助其余相关领域的方法解决
    3. 来自自己原有的算法知识和数学知识等
    4. 拍脑瓜

如果你能完成以上三个问题,那么恭喜你!你在科研的道路上已经迈出第一步了。

# 真正开启一个项目 —— 开题报告

开启一个项目的标志是开题报告的完成。开题报告可以证明你对一个项目的流程具有基本的认识,并且已经认识到了项目以及自己提出的解决方案具有可行性。可行性包括问题是真正可解的,以及问题可以在一个给定的时间 (例如半年过一年等) 内完成。

关于开题报告,一般包括以下四个方面:

  1. 本项目研究的研究背景、研究意义及国内外研究现状。
  2. 本项目的总体框架、研究目标、研究内容、拟突破的重点和难点。
  3. 本项目的研究思路和研究方法、计划进度、前期研究基础及资料准备情况。
  4. 项目预算情况。

# 一篇论文的结构

一篇论文主要分以下几个部分:

  1. 摘要 (Abstract)
  2. 引入 (Introduction)
  3. 相关工作 (Related Work)
  4. 提出的算法 / 模型 / 解决方案 (Technique)
  5. 对提出方案的实验评估 (Evaluation)
  6. 对相关讨论,对未来研究方向的展望。

在完成一篇论文的写作过程中,我们一般需要按照这个顺序:

# 相关工作的查找

  1. 按照对应领域的关键词进行查找 (一般针对较小的领域)
  2. 从主论文的引用开始进行查找 (可能有失偏颇,也可能迷失方向或钻牛角尖,不能作为唯一的查找思路)(部分论文有乱引、滥引的现象)
  3. 从对应领域的综述 (Survey) 入手,阅读相对较为知名的文章

在查找到对应的文章之后,就应当精读这些文章,并抱有三个问题 (额外关注文章 Introduction 末尾的 contribution):

  1. 文章解决怎样的问题 (具体)
  2. 文章的创新点在哪里,采用了怎样的工具和方法 (这两个问题往往是相同的回答)
  3. 文章采用了怎样的评估方式 (如何验证其实验结论的)

对于这些问题,需要做笔记,并深入到脑中。

在查找完相关工作之后,一般就可以开始自己方法的设计了。

# 算法 / 程序设计

# 运行主论文的代码 / 相关论文的代码

运行主论文或相关论文的代码是进行算法程序设计的第一步。

论文的代码大多是开源的,因为开源代码的论文往往更容易被期刊或会议接受。代码一般保存于 GitHub 仓库,在论文脚注或作者主页存在链接。

运行相关的代码也常常会存在一些问题。包括环境配置语言学习库模块学习等。

# 语言学习

前端代码常常采用 JavaScript 编写 ( d3 , vega ),但也可能采用 Python ,甚至是对于图形支持并不十分友好的 JavaC 等语言编写。因此,在几天内快速熟悉一门语言的基本语法,能够编写和调试最基本的程序是极其重要的技能。此外,许多未经优化的代码可能需要通过命令行运行,因此提前掌握一些 bash 的基本知识也十分重要。

# debug

对相关的代码进行 debug 也是重要的技能。关于 debug,打断点 (breakpoint)、查看当前变量 (variable)、跳转 (resume)、暂停 (suspend)、终止 (terminate)、单步执行 (step into)、单步跳过 (step over)、单步返回 (step return) 都是重要的操作。

# 写代码 (核心)

变量命名、数据结构、模块化、设计模式、测试代码

# 评估 (evaluation)

# 数据评估

采用数据进行对比是最常见的评估方式。

# 评估标准的确定 *

首先需要摒除一个误区,就是评估量大多是简单的、公认的、合理的。实际上,对于一些较偏门的领域,以及一些相对主观的领域,评估的方式往往是多元的、不确定的,甚至是存在争议的。因此,提出和确定评估量是一个相当重要的工作。

由于绝大多数提出新算法的论文都有评估,且不同的论文可能给出不同的评估量和评估标准。因此在确定评估方式时,首先要做的就是多尝试。此外,我们在评价评估量的优劣,以及如何选择评估量时,一般要考虑以下几个方面:

  1. 评估量是否正确。(评估分数最高 / 最低的情况是否是现实中最优 / 最劣的情况。)
  2. 评估量是否合理。(如果一个评估量先天带有偏向性,那么一定是不合理的。如果评估量本身不具有全面性,则不能认为其不合理,但是需要寻找其余的评估量作为补充。)
  3. 评估量是否被广泛接受。(如果一个体系已经被研究得比较成熟,那么一定存在一些公认的评估量。采用这些评估量往往会使评估更加可信。)

# 评估标准的提出

如果我们提出的注意到了现有方法都没有注意到的问题,或者说我们的工作拓宽了一个工具的应用场景,而不仅仅是在算法上进行优化,那么现有的评估指标往往不适合我们。我们需要在正确、合理的基础上提出自己的工作想法。同样地,自己设计评估量也需要满足正确合理的要求。

# 案例分析 (case study) 和用户实验 (user study)

在前端领域,除简单的数据评估外,还常常采用案例分析和用户评估的方法作为评估。

案例分析 (case study) 指的是,根据某个特定的数据集 (输入),在论文中列出我们提出算法的输出结果 (也可以一并列出其余算法的结果并进行比较)。然后分析我们的结果优秀点在何处。

用户分析 (user study) 指的是,对于一项具有主观性的问题,我们通过进行一定数量的用户调查,然后对统计数据进行分析,获取主观上更可信的结果。目前,前端领域的用户分析所需要的用户量级中,不少在几十左右。(这与心理学或医学等相关专业的严谨性相差甚远。)

# 论文写作

未完不续。