矩阵

因为在机器学习中,一些概念、算法都涉及到矩阵的知识,比如训练数据集通常都是以矩阵的方式存在,所以在这里首先介绍一下矩阵的概念。

基本概念

在数学概念中,一个$m \times n$的矩阵指的是一个由$m$行$n$列元素排列而成的矩形阵列。用大白话解释就是将一些元素排列成若干行,每行放上相同数量的元素,就是一个矩阵。矩阵里的元素可以是数字、符号或数学式,比如下面这个$A$矩阵就是一个四行两列的矩阵:
$$ A=\begin{bmatrix}
1&2\\
3&4\\
5&6\\
7&8\\
\end{bmatrix}$$

一个矩阵$A$从左上角数起的第$i$行第$j$列上的元素称为第$i$,$j$项,通常记为$A_{i,j}$、$A_{ij}$或者$A_{[i,j]}$,那么上面的$A$矩阵中$A_{3,2}=6$。如果我们不知道矩阵$A$的具体元素,通常将其表示为$A=[a_{ij}]_{m \times n}$,如果$A$的元素可以写成与行$i$和列$j$有关的统一函数$f$,那么也可以用$A=[f(i,j)]_{m \times n}$来表示。

矩阵的基本运算

矩阵的最基本运算包括矩阵加(减)法、数乘、转置、矩阵乘法运算。

加减法运算

$m \times n$矩阵$A$和$B$的和(差)$A \pm B$也是一个$m \times n$矩阵,其中每个元素是$A$和$B$相应元素的和(差),即$ (A \pm B)_{ij}=A_{ij} \pm B_{ij} $,其中$1 \le i \le m$,$1 \le j \le n$。举个例子:

$$ \begin{bmatrix}
1&2&3\\
4&5&6\\
\end{bmatrix} + \begin{bmatrix}
6&5&4\\
3&2&1\\
\end{bmatrix} = \begin{bmatrix}
1+6 & 2+5 & 3+4 \\
4+3 & 5+2 & 6+1 \\
\end{bmatrix}=\begin{bmatrix}
7&7&7\\
7&7&7\\
\end{bmatrix}
$$

数乘运算

标量$c$与$m \times n$的矩阵$A$的数乘也是一个$m \times n$的矩阵$cA$,它的每个元素是矩阵$A$的相应元素与$c$的乘积$(cA)_{ij}=c \cdot A_{ij}$,举个例子:

$$
2 \cdot \begin{bmatrix}
1&2&3\\
4&5&6\\
\end{bmatrix}=\begin{bmatrix}
2 \cdot 1 & 2 \cdot 2 & 2 \cdot 3 \\
2 \cdot 4 & 2 \cdot 5 & 2 \cdot 6 \\
\end{bmatrix}=\begin{bmatrix}
2&4&6\\
8&10&12\\
\end{bmatrix}
$$

閱讀全文 »

机器学习的定义

  • 非正式定义:在不直接针对问题进行编程的情况下,赋予计算机学习能力的一个研究领域。
  • 正式定义:对于一个计算机程序来讲,给他一个任务T和一个性能测量方法P,如果在经验E的影响下P对T的测量结果得到了改进,那么就说该程序从E中得到了学习。

举个机器下棋的例子,经验E对应着程序不断和自己下棋的经历,任务T是下棋,性能测量方法P可以是它在和人类棋手对弈的胜率。如果说机器与人类棋手对应的胜率不断提高,那说明机器从自己和自己下棋的过程中得到了学习。

机器学习四大内容简述

  • 监督学习(Supervised Learning)
  • 学习理论(Learning Theory)
  • 无监督学习(Unsupervised Learning)
  • 强化学习(Reinforcement Learning)

监督学习(Supervised Learning)


如上图所示,描述了假定城市区域的房屋面积与售价的关系。横坐标是房屋面积,纵坐标是售价。如果我想在横轴随意取一个面积,就希望知道它的售价,那么就需要一个方法通过面积确定售价。图中的方法是通过一条标准线来找到对应的售价。那么这条线要如何得来呢?

在这个示例中,我们已经给出了若干房屋面积和售价的数据集,即已经告知了机器若干问题和答案。机器通过这些数据集中面积和售价的关系,自我学习从而得出这条线,这种学习类型就属于监督学习类型。

因为这种场景中的数据集取值都是连续的,所以这类问题都可以归为线性回归的问题。

如上图所示,描述了肿瘤大小与恶性良性的关系。横坐标是肿瘤的大小,纵坐标表示恶性或良性,与连续的房屋售价不同的是,这里的纵坐标只有两个值0或1。

这个示例中,我们同样给出了一组肿瘤大小与恶性良性的数据集,我们希望机器通过这组答案数据集自我学习然后有能力通过肿瘤大小判断出恶性或良性。当然这里只是示例,实际中会有很多其他的横轴指标值用于判断学习。

该示例中这种离散的数值问题可以归为分类的问题。

学习理论(Learning Theory)

任何具体的方式方法背后都有一个或多个理论进行支撑,机器学习也不例外。

这一大块的内容贯穿整个机器学习,包括人工智能和机器学习正式诞生之前的定理证明,理解为什么学习型算法是有效的。每种学习型算法需要多少训练数据,比如上面的房屋售价示例到底需要多少房屋的样本。以及机器学习渗透在我们生活中的真实应用场景等等。

无监督学习(Unsupervised Learning)

如果我现在有一组不知道任何信息的数据集,然后需要机器进行分析然后给出这组数据集中的几种共性或者相似的结构,将其聚类,这个方式就称之为无监督学习。即我们不会提供机器问题和答案,只提供数据,需要机器自我学习和分析找出共性进行聚类。

无监督学习的应用场景很多,当下流行的各种P图软件都或多或少的用到了这类算法,比如图的修复功能,抠图功能,像素化等一些滤镜都是对像素的聚类。还有声音驳杂功能,从嘈杂的声音中提取出有用的声音等。

强化学习(Reinforcement Learning)

强化学习是机器学习的精髓,更贴近机器的自我学习,用在不能通过一次决策下定论的情形中,比如分析病人肿瘤病情的例子,通过监督学习,我们给定了确切的答案,不是良性就是恶性,即我们做的决策要么对,要么错。但在强化学习中,在一段时间内会机器做出一系列决策。比如我们编写一个程序让一架无人机做出一系列特技表演动作,这种场景就不是一次决策能实现的了的。

那么强化学习究竟是什么?在它背后有一个称为回报函数的概念。比如我们训练宠物狗坐下、握手等行为,每当小狗做出的正确的行为,我们都会给小狗奖励,比如摸摸头进行鼓励或者给一块小骨头。渐渐的小狗就知道做出怎样的行为有奖励,怎样的行为没有奖励,即学会了坐下和握手的行为。这就很类似强化学习的理论,我们需要找到一种方式,来定义我们想要什么,如何定义一个好的行为和一个坏的行为,然后就需要一个合适的学习型算法来获得更多的回报和更少的惩罚。

閱讀全文 »

什么是TestNG

TestNG是一套开源测试框架,是从JUnit继承而来,TestNG意为test next generation。它的优势如下:

  • 支持注解。
  • 可以在任意的大线程池中,使用各种策略运行测试(所有方法都可以拥有自己的线程或者每个测试类拥有一个线程等等)。
  • 代码多线程安全测试。
  • 灵活的测试配置。
  • 支持数据驱动测试(@DataProvider)。
  • 支持参数。
  • 强大的执行模型(不再用TestSuite)。
  • 支持各种工具和插件(Eclipse、IDEA、Maven等)。
  • 可以更灵活地嵌入BeanShell。
  • 默认JDK运行时功能和日志记录(无依赖关系)。
  • 依赖应用服务测试的方式。

TestNG的最简单示例

我们先来看一个TestNG最简单的示例:

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.testng.annotations.Test;

public class HelloWorld {

@BeforeClass
public void beforeClass() {
System.out.println("this is before class");
}

@Test
public void TestHelloWorld() {
System.out.println("this is HelloWorld test case");
}

@AfterClass
public void afterClass() {
System.out.println("this is after class");
}
}

从面上的简单示例中可以看出TestNG的生命周期,并且可以看到TestNG是使用注解来控制生命周期的。下面我们来看看TestNG支持的各种注解。

TestNG的注解

TestNG的注解大部分用在方法级别上,一共有六大类注解。

Before类别和After类别注解

  • @BeforeSuite:被注解的方法将会在所有测试类执行之前运行。
  • @AfterSuite:被注解的方法将会在所有测试类执行之后运行。
  • @BeforeTest:被注解的方法将会在当前测试类中的所有测试方法执行之前运行。
  • @AfterTest:被注解的方法将会在当前测试类中的所有测试方法执行之后运行。
  • @BeforeClass:被注解的方法将会在当前测试类中的第一个测试方法执行之前运行。
  • @AfterClass:被注解的方法将会在当前测试类中的最后一个测试方法执行之后运行。
  • @BeforeMethod:被注解的方法将会在当前测试类中的每个测试方法执行之前运行。
  • @AfterMethod:被注解的方法将会在当前测试类中的每个测试方法执行之后运行。
    我们可以根据不同的场景来使用不同的注解。
閱讀全文 »

Google是一个伟大的公司,有很多伟大的产品。从Google一直不做桌面系统和对Chrome的大力发展来看,Google对前端事业是非常热衷的。

Angular

Angular、React、Vue是目前前端框架的三驾马车。我在16年9月写过一篇文章《温故而知新-AngularJS 1.x 小记》,当时还叫AngularJS,版本是1.X,那时已经很惊艳了,把前端解释性的脚本语言封装成了面向对象的编程模式,另外对HTML的元素维护提供了便利的方式方法。当时我负责的BPM产品,Process Builder的前端架构果断更新为了AngularJS。时隔两年多,Angular 6都已经发布了,如果我还有机会做前端产品的话,我应该还是会果断选择Angular。

Angular 6 添加了ng update和ng add这样的新功能,让你的应用程序保持最新的状态,帮助Angular开发者加快创新的步伐。渲染器Project Ivy也有很大的改进,它能使Angular调试更容易,以更快地速度编译和运行,它还可以与现有的应用程序一起使用,Angular团队还在小型Hello World应用程序做了演示,不使用的Angular功能将自动从应用的JavaScript bundle自动删除。

PWA

在移动的世界里,Application是重中之重,是构建移动生态的核心。那么构建Mobile App的方式的问题就来了。

  • Native App:既用iOS的原生语言OC、Swift或Android原生语言Java构建的App。
  • Web App:既使用前端框架和技术(Angular、React、Vue,HTML 5,CSS 3等)构建的,在移动设备上运行展现的App。
  • Native & Web App:原生语言和Web技术混搭构建的App。这类App还孕育出了像React Native这种使用前端语言解析为原生语言的框架。

以上三种类型各有利弊:

  • Native App给用户的体验是最好的,交互动画效果平滑,可以基于硬件的性能做优化等。但是研发周期比较长,并且因为iOS和Android应用的审核机制,导致版本更新周期比较长,修复完问题或有新需求增加后无法做到及时更系用户设备上的App。
  • Web App可以做到版本的热更新,研发周期短,Web端和移动端可共享研发资源。但是用户体验比较差,一些需要使用到硬件功能不好实现。
  • Native & Web App则致力于综合他们的优点,规避他们的缺点。

Progressive Web App(PWA)就是Google推出的提升Web App体验,给用户原生应用体验的框架。主要特点包括:

  • 可靠 - 即使在不稳定的网络环境下,也能瞬间加载并展现。
  • 体验 - 快速响应,并且有平滑的动画响应用户的操作
  • 粘性 - 像设备上的原生应用,具有沉浸式的用户体验,用户可以添加到桌面
    目前已支持Android,iOS 11.3以后版本,Safari,Chrome,MS Edge。
閱讀全文 »

技术实力的本质和基本原则:

  • 不存在放之四海皆准的技术
  • 技术要能解决具体问题才有价值
  • 问题的复杂度决定技术实力的高度

在技术实力的基本原则前提下,将技术实力分为两大类,六个小分类。

硬实力

硬实力有四个等级,从低到高为点、线、面、体,对应的解决问题的复杂度也越来越高。

技术点

技术点是一个个颗粒性小,且相互较为独立的技术的使用方式和其原理认知。比如使用Java多线程的方式方法和解决的具体问题,使用Java进行I/O操作的方式方法和解决的具体问题。掌握了技术点,就可以开始基本的业务能力开发了

技术线

技术线是由若干个技术点串联起来的,该条技术线能解决某一类相关问题。比如一个常规的Web应用流程,用户发起请求,经过负载均衡路由,到达业务Controller进行业务逻辑处理,过程中对数据库的操作,对缓存的操作,然后返回结果给用户等。这就是由若干个技术点组成的一条技术线,这条技术线能支撑起来Web应用开发中实现业务功能的全过程。掌握了技术线,就能完成业务功能的全流程设计和开发了

技术面

技术面是由若干技术线排列交织而成。比如Web应用开发,性能优化,数据库维护等都属于技术面。掌握技术面,表明已经是某个领域的专家了

技术体

技术体既多个技术面的综合。最小的技术体也得有三个技术面组成。最常见的就是架构师,对于一个大型业务系统的架构师而言,需要掌握多个技术面,然后站在全局的角度进行系统,架构的设计和取舍,比如一个后端的架构师需要掌握Java开发的技术面,数据的技术面,网络的技术面,包括专业业务领域的技术面。掌握了技术面,表明已经是某个领域的资深架构师或专家了,可以解决领域级的复杂问题

软实力

软实力既不是很容易量化的一种能力,但是更能体现技术实力。

发现问题

发现问题是一个很重要的软实力,当系统出现问题后,大多数问题可以很容易的定位,但是就有个别问题找不出是因为哪个环节引起的问题,而往往这些找不出原因的问题都是优先级比较高或者比较严重的问题。还有一种场景是系统三天两头出问题,出一个问题解决一个问题,但是都是治标不治本,找不出反复引起问题的根本原因。所以发现隐藏很深很细节的问题和发现根源问题是彰显技术实力的一个软实力,这个能力主要来源于经验,有成功的经验,也有踩坑的经验,也有参考别人的经验。所以需要多思考、多总结、多学习、多交流。

技术创新

要达到这一项软实力其实比较难,比如在Google开创出大数据的大神,亚马逊开创出云计算的大神。但是这是我们为之努力的目标之一。

阅读文章:《当我们聊技术实力的时候,我们到底在聊什么》