Machine Learning-神经网络(Neural Network)

本文覆盖Coursera Machine Learning Week 4&Week 5的内容。

什么是神经网络?
在机器学习和认知科学领域,人工神经网络(Artificial Neural Network,缩写ANN),简称神经网络(英文:Neural Network,缩写NN)或类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。(摘自:维基百科-人工神经网络
神经网络并不是什么新鲜的玩意儿,早在1958年,美国心理学家Frank Rosenblatt就提出了一种具有单层计算单元的神经网络,称为感知器(Perceptron)。这个概念一经提出就被认为有着良好的发展潜能,因为他结构简单,也能解决一些复杂问题。但是感知器有一个天生不可解决的问题:只能解决线性可分问题,连最简单的异或(XOR)模型都无能为力。1969年Marvin Minsky写了一本叫做《Perceptrons》的书,他提出了著名的两个观点:1.单层感知机没用,我们需要多层感知机来解决复杂问题 2.没有有效的训练算法。大意就是这玩意儿[……]

继续阅读

Machine Learning-逻辑回归(Logistic Regression)

本文覆盖Coursera Machine Learning Week 3的内容。

二元分类问题(Binary Classification Problem)
所谓的二元分类问题,指的是他的预测输出结果只有两个值 y = {0,1},比如“预测某封邮件是否为垃圾邮件”就是一个二元分类问题。之所以称之为二元分类是相对于多分类问题(Multi Classfication Problem)而言的,比如识别10个数字就是一个多分类问题(一共有10个类别,分别是0-9)。而二元分类问题的求解是解决多分类问题的基础,具体方法下文会介绍。
现在如果要你使用一个函数来模拟分类问题,你最先想到的肯定是一个分段函数(或者叫阶跃函数:unit-step function),简单的如下:
seg_function
这个函数是非常契合我们对这个问题的直觉的,模型非常简单,大于某个值输出1,否则输出0。看上去很理想,但是这个模型却存在很多问题,比如它不够光滑,不连续,在数学上不容易被处理。那么有没有替代的模型呢?

逻辑回归(Logistic Regression)
为了达到和分段函数一样的效果,并且是连续,光滑的,我[……]

继续阅读

Machine Learning-线性回归(Linear Regression)

引言
最近在学习Machine Learning,为什么要学呢?一来呢是觉得AI是未来的一大发展趋势几乎是板上钉钉的事了,他的应用范围实在是太过广泛,不仅仅是在被媒体宣传的火热的AlphaGo,自动驾驶,高级机器人等,还有很多很多你看不到的领域正在逐步应用人工智能技术,比如广告系统,推荐系统,金融领域的量化交易,大数据分析等等。而ml恰恰是AI里面一个非常重要的部分。其次是因为对这门学科分支很感兴趣,想知道这背后到底有什么奥秘,机器究竟是如何学习的?它到底能智能到何种水平?
其实在13年的时候看过Andrew Ng在standford上的一门公开课CS229 Machine Learning,一开始看还可以,可是到后面黑板上书写的各种数学公式推导很模糊,感觉很吃力,而且没什么人监督,学着学着就荒废了。今年卷土重来,查了查入门资料,有人推荐Coursera上的Andrew Ng的课程,一开始我以为这门课就是我以前在网易公开课上看的那门课程,觉得体验不怎么好。但后面真正看了之后才发现两门课很不一样,Coursera的课堂互动模式实在太赞了,秒杀各种公开课视频。不仅PPT上的公式写的很清[……]

继续阅读

Java 8 新特征

本文主要包括以下内容:
Lambda 表达式
方法引用
接口的默认方法和静态方法
Stream API

Lambda 表达式(Lambda Expression)
Java8最大的变化莫过于引入函数式编程的概念,也就是Lambda表达式,它因数学中的λ演算得名。1958年LISP语言第一个支持了Lambda,发展至今,越来越多的编程语言也逐渐开始支持这一特征,比如C#,C++,PHP等。而Oracle终于在2014年正式在Java8中支持Lambda表达式,这个广大Java程序员期待已久的特性终于来临。
什么是Lambda 表达式?
看起来很高大上的名字,其实说白了就是一个匿名函数,它没有函数名,没有访问修饰符,只是用一个表达式来代表一个函数。在Java8中你可以把一个函数(Lambda表达式)作为一个方法的参数传递进去(很奇怪?下面会说)。
语法:

圆括号里代表的是参数,花括号里是函数体(返回),->在数学上的解释是由A推导可以得到B。Lambda表达式的语法很简单,具体细则就不说了,参考以个几个例子就可以很好[……]

继续阅读

P和NP问题(P versus NP problem)

P和NP问题(P versus NP problem)
P/NP问题是在理论信息学中计算复杂度理论领域里至今没有解决的问题,它也是克雷数学研究所七个千禧年大奖难题之一。学计算机的肯定会经常听到P和NP,但我相信很多人跟我一样对这个问题既熟悉又陌生,并不能真正地把他理解透彻,今天花点时间总结下吧。

什么是P问题?
能够在多项式时间内给出答案的问题被称为P问题,也就是说存在一个多项式时间复杂度内的算法解决该问题。这个很好理解,那为什么要是在多项式时间呢?因为只有在多项式时间内的复杂度才是计算机所能接受的,再大的复杂度(比如指数级,阶乘级别)即使有解也没有实际价值(计算量太大)。

什么是NP问题?
对有些问题而言,并不存在一个已知的多项式时间内的算法来解决问题,但是如果有人能够提供一个答案(不论对错),我们却能够很快地验证这个解是否正确,那么这些能够在多项式时间内验证一个解的问题被称为NP问题。通俗,不严谨的讲就是能在多项式时间内猜出解的问题。举个栗子:著名的子集合求和问题(subset sum problem),给定一个整数集合:{−2, −3, 15, 14, 7, −[……]

继续阅读