分类目录归档:技术文章

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, −[……]

继续阅读

Spring的DataSource是如何工作的

如果你使用过Spring管理过数据库连接,那么一般会在applicationContext.xml文件里看到如下的代码:

这段配置就是用来指定datasource的,其实跟普通的bean注入没什么区别啊,那在这背后Spring到底干了些什么呢?这个bean是如何管理数据库连接的呢?想要理解这背后的一切自然就要看看这个类:org.springframework.jdbc.datasource.DriverManagerDataSource到底干了些什么。

看到这里应该很清楚了,DriverManagerDataSource这个类只不过非常简单地封装了一下JDK的DriverManager,本质上还是使用DriverManager来获取数据库连接。值得注意的是,DriverManagerDataSource最顶层继承了JDK的DataSource,也就是说只要有一个DataSource的实例,然后调用getConnection()即[……]

继续阅读

Netty简明教程

在阅读了netty-4.0.0-final的源码以及参考了《Netty in Action v5 MEAP》这本书之后,决定写一篇文章记录这几天的心得体会,介绍下netty的相关知识。但并不会面面俱到地阐述每一个细节,只会记录一些个人认为非常重要的部分,比如其线程模型,关键组件,以及使用方法等。

一.Netty是什么?

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。

以上这个定义来自百度百科,简单来说Netty就是一个服务器端的网络通信框架,用于处理网络请求,和你自己写一个简单的服务器没什么本质上的区别,只不过Netty做的更强大。因为它是一个基于网络IO的通信框架,不受限于网络协议,所以他的应用范围就很广。比[……]

继续阅读