这几天华为在清理35岁以上员工传的沸沸扬扬,虽然有各种杂七八的不同说法,但不可否认,国内的 大环境 确实就是如此。

对于做技术面言(其实我就是说写代码),观察周围同事,基本都是年轻人的天下了,35岁以上的比较少。

眼看着自己混了这么多年头,再过些看着自己也步入35大关了,很久之前的一写代码的同事现在有当老板的,有开店的,有转做管理、业务、产品等的,不过应该还是有包括本人在内的一半左右还在写代码,现在可能是技术组长、技术经理之类,在自己的一块技术小天地里,独档一面。

搞技术是青春饭?

个人认为,如果你不在体制内,那么基本上百分之八十以上的职业都是不能让你干一辈子的,甚至有些在体制内职业,也不一定是铁饭碗了。

阅读全文

最近新开一个项目,一部分页面,大部分属于API,新开当然严格要求下Restful规范,要求技术栈是Java,对比了一下目前的几个框架,觉得 Jersey 和 Spring MVC 都不错,但是 Jersey支持 JSR311 规范,所以就没随主流使用 Spring MVC 了。

关于框架怎么搭,看下官方文档其实很快的,这里记录一搭建时遇到的一些问题。

技术栈说明

首先,使用 Maven 做为依赖管理工具,另外,除子很的的 Restful API 之外,我的项目里面还有一部分 Web 页面。所以多引入了 jersey-mvc-jsp 扩展,使用 jersey-media-json-jackson 返回 json 风格的数据。

另外,使用 Jetty 做为开发用的服务器,感觉比 Tomcat 实在方便太多。直接在 Maven 里面配置即可。

最后,我的前端页面使用了 Sass 进行 CSS 编译,使用 gulp、webpack、babel 进行 Js 编译与自动化。

阅读全文

大概五六年前接触过 Selenium 了,当时使用 Selenium 结合 jUnit 写过一套自动化测试与报警系统,但是效果不太好(和网络、数据各方面都有关系),而且仅仅几十个用例虽然不然,但写的超级心烦,每次都要找 xpath 一个操作写好多行 java代码。

现在由于有差不多的需求,使我回想到了它。所以拿出来再重温下,当然时代变了,现在更流行的 phantomjs 也下载试用了一下,由于几个不能忍的Bug档住了我的去路,所以还是先保持一下观望的态度了。再者 Selenium 是 Thoughtwork 公司出品,个人比较相信他们的水平。

Selenium 这个技术确实很有趣,上次使用是做一套自动化测试的工具,现在用它来做一些网页插件,它也可也做爬虫,一般的爬虫对 javascript 产生的内容,ajax 等没有读取能力,这时候 headless 爬虫就有用武之地了。

简单使用

引入依赖

1
2
3
4
5
6
7
8
9
10
11
 <dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.0.1</version>
</dependency>

<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.0.1</version>
</dependency>

阅读全文

降维是属于无监督学习的一种。 通常用于数据计算中的化简,预处理和可视化分析。常见算法有PCA、NMF、LDA等等。

PCA降维算法

特征向量、协方差矩阵

如果一个矩阵满足这个公式 $A \vec{v} = \lambda \vec{v} $ ,其中,$A$ 是一个方阵,那么,就可以说 $\vec{v} $ 是这个矩阵的特征向量,$\lambda$ 则是这个矩阵的特征值 。

协方差可以用于解释两个属性之间的正向相关或负向相关性。 协方差距阵 是由变量的协方差值构成的一个距阵。

PCA原理

我们把一个矩阵的 协方差矩阵 对应的 特征向量 称为这个矩阵的 主成分,那么再按照其对应的 特征值,那么将矩阵的这些特征值求出,排序即可。

如果要使用 PCA 算法将一个 M维的数据集降到 N维,那么就是取这个矩阵的前 N 个特征向量,相乘,即可得到一个投影矩阵,具体的过程可以参考相关资料。

阅读全文

很久以前,我们上一些新闻网站,购物网站点过一些页面后,就会不停的有类似“相似推荐”的东西,我们基本上是不会点进去看的,因为推荐的太水了,不费脑子想就知道是基于一些标签的推荐,毫无新意。

现在的广告就有了很大进步,很多广告看上去就是 为你而设 的。关于推荐算法,最多使用的是 协同过滤。 最简单的协同过滤算法是 Slope One

今天就自己不用框架,纯手打一个 Slope One 算法出来!grin

Slope One算法

如下数据,已经三个用户对三部电影在豆花网上的评分如下,问号是因为他们没有评分,所以暂时没有,那么:求问号内的值。(也就是他们如果看了电影再来评,可能会评多少分)?

阅读全文

有个成语叫 物以类聚,人以群分,就比较形象的解释了聚类的现象。聚类属于无监督学习,提供数据时,只需要提供对应算法的分析参数,不需要提供每条数据所属的类别。

聚类的算算法有很多,用的最多的是 K-MeansDBScan 算法,这里也只简单介绍这两种。 其它的聚类算法也有很多,比如: K-medoids近领传播算法Birch等等。

K-means

K-Means 是比较常用的聚类方法之一。原理也很容易理解,K-Means算法必须有一个参数K,代表最终聚出类别的个数。其它参数可根据使用的算法库提供的API进行扩展,比如距离度量方式等,初始点的放置等。

K-Means 的流程如下

  1. 初始化数据,在数据所在的空间中放置K个点,(K个Label)
  2. 计算空间中所有的点分别到这K个点的距离,离每个点最近的那个( Label ),就是那个点的 Label
  3. 得到了K个簇(每个Label都有离自己最近的一群小弟了),每个簇的点,重新计算中心点,做为新的K个点的位置( Label 的新位置)
  4. 重新计算 2-3-2-3,最后结果差不多不变或变化很小时,聚类就稳定了。

阅读全文

分类算法还有很多,但由于水平太菜, SVM神经网络没有办法表述的清,这两种分类算法的数学实现都很高深和精妙,一种算法写个几千页的书都没问题。

支持向量机

支持向量机 Support Vector Machines,多称 SVM,为什么算法的名字都这么奇怪?

先看看下面一张图,驾校考试科目二:曲线行驶

大家都知道考试时车不能压线,所以越往中间开越安全,这个和SVM的概念就很象了。

看下图,普通的分类器在理念上可能是一条线将两种不同的类别分开,而 SVM 则是使用一条可移动的线,线在中间往左移动 b 的距离或向右移动 b 的距离都可以很好的将两组数据分开,而这段可移动的距离称为 margin,支持这根线最高可以移动的点(绿色的部分),叫做 支持向量(Support Vector)

阅读全文

在概率论里面,贝叶斯可是鼎鼎大名,所以贝叶斯是基于概率的另一种分类器。

朴素贝叶斯

如果根据上面的贝叶斯公式,去计算一百条数据,条条数据十个属性,那么按照贝叶斯算法,每条数据的各个概率再联合另外的属性,另外的数据去计算,计算量会很大,如果是十万百万的数据是根本没有可能算完的。

我们知道在贝叶斯里面,如果两个事件相互独立,那么算起来就简单多了, P( A 交 B ) = P( A ) * P( B ) 。

而 Naive Bayesian(中文译朴素贝叶斯,为数不多的翻译的好听的词),实际上就是做了这样一个假设,假设所有数据里的各种属性是独立的,那么就可以运用独立事件的特性。可能结果并没有标准的贝叶斯那么精确,但计算量一下子降低 N 个指数级别!

阅读全文