2017年总结

又是一年过去了, 回首过去一年的工作经历, 起起伏伏很不平静。

项目

  1. 千里眼

16年大部分时间都在百米生活, 主要负责还是千里眼平台的后端开发和维护. 对比15年主要是千里眼后台的重构.

  1. angular 2
    也用业余时间玩了一下angular, 但是没有在正式环境中使用过, 肯定有很多的坑是没遇到的.

  2. 机器学习

16年下半年的时候买了一些机器学习的书, 但是看完的屈指可数, 几乎所有的书都只读了一大半. 这个坑必须在2017年填上!

Apriori 算法

Apriori简介

Apriori 算法可以说是经典的亲和性分析算法。它只从数据集中频繁出现的商品中选取共同出现的商品组成频繁项集 ( frequent
itemset ),避免了上述复杂度呈指数级增长的问题。一旦找到频繁项集,生成关联规则就很容易了。
Apriori 算法背后的原理简洁却不失巧妙。首先,确保了规则在数据集中有足够的支持度 。 Apriori 算法的一个重要参数就是最小
支持度。比如,要生成包含商品 A 、 B 的频繁项集( A, B ),要求支持度至少为 30 ,那么 A 和 B 都必须至少在数据集中出现 30
次。更大的频繁项集也要遵守该项约定,比如要生成频繁项集( A, B, C, D ),那么子集 (A, B, C) 必须是频繁项集(当然 D 自己
也要满足最小支持度标准)。
生成频繁项集 后,将不再考虑其他可能的却不够频繁的项集(这样的集合有很多),从而大大减少测试新规则所需的时间。
其他亲和性分析算法有 Eclat 和频繁项集挖掘算法 ( FP-growth )。从数据挖掘角度看,这些算法比起基础的 Apriori 算法有很多
改进,性能也有进一步提升。接下来,先来看一下最基础的 Apriori 算法。

测试数据请下载 这里

余弦相似度算法

余弦相似度

余弦相似度 通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为0到1之间。

注意这上下界对任何维度的向量空间中都适用,而且余弦相似度最常用于高维正空间。例如在信息检索中,每个词被赋予不同的维度,而一个文档由一个向量表示,其各個维度上的值对应于该词在文档中出现的频率。余弦相似度因此可以给出两篇文档在其主题方面的相似度。

另外,它通常用于文本挖掘中的文件比较。此外,在数据挖掘领域中,会用到它来度量集群内部的凝聚力。

公式如下:

$$ \cos(x,y) = \frac{x \cdot y}{||x|| \cdot ||y||} $$

其中: “⋅”表示数量积. “||x||”表示向量x的模, 计算公式是:

$$ \sqrt{\sum_{i=1}^{n}x_{i}^{2}} $$

Slope One算法

介绍

Slope One算法是一种比较流行的基于物品的协同过滤算法, 最大的优点就是简单. 它是在一篇名为: Slope One: 基于在线评分系统的协同过滤算法的论文中提出的.

用一个简单的例子来了解它. 假设Amy给SPY打了3分, Whitney Houston打了4分; Ben给SPY打了4分. 来预测Ben会给Whitney Houston打几分.

PSY Whitney Houston
Amy 3 4
Ben 4 ?

先来简单预测一下: 由于Amy给Whitney Houston打的分数比PSY高一分, 所以预测Ben也会给高一分, 即5分.

个人简历

赵少君

4年python开发经验, 负责大型项目(高并发), 学习能力强
python工程师 · 深圳百米生活有限公司
男 ︳ 32岁 ︳本科 ︳ 7年工作经验 ︳ 深圳
18680679530 ︳amaozhao@gmail.com

工作经历

深圳百米生活有限公司

python工程师 2014.03-至今

  1. 负责路由器后台管理项目开发(维护), 高并发请求处理.
  2. 开发广告管理平台, 实现路由器广告展示.
  3. 开发路由器固件升级平台, 实现路由器远程升级
  4. 网络爬虫以及数据分析工作
  5. 系统维护,部署以及更新
  6. 培训实习生,新员工以便快速上手

Tornado 源码阅读

Tornado 源码阅读

准备开始学习django的文档和源代码了,先总结一下看tornado源码的收获,防止忘记。
这里写的是tornadov1.2的代码,因为我看了一遍4.3版本,和1.2思路相差不大,只是
utils更多了,1.2版本代码量少,更有利于理清思路。列出我们将会涉及到的文件:

tree
.
├── httpserver.py
├── httputil.py
├── __init__.py
├── ioloop.py
├── iostream.py
├── web.py

自上而下 - 总体概览

首先,我们来一张图,表明tornado整体的框架,但是并不涉及tornado中所有文件和类,
只是其中一部分而已。

sqlalchemy分表处理

最近在处理公司的业务逻辑时碰到了分表的问题, 查了半天资料只发现了一种解决方案, 具体链接在 这里
但是不太符合我的想法, 所以我自己做了一些修改, 比如 我要对日志进行分表, 可以如下实现:

class DeviceOnlineLog(object):
@staticmethod
def model(month):
table_index = month
class_name = 't_dev_log_%s' % table_index
engine = get_engine(str=LOG_STRING)
Base.metadata.reflect(engine)
table = Table(
class_name,
Base.metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column(
'devId', Integer, ForeignKey(Device.id), nullable=False),
Column('onTime', DateTime),
Column('offTime', DateTime),
extend_existing=True,
schema=MYSQL_LOG
)
table.create(engine, checkfirst=True)
return table
class Log(object):
pass
def mapperClass(cls, table, entity_name, **kw):
newcls = type(entity_name, (cls, ), {})
mapper(
newcls,
table,
# non_primary=True,
# polymorphic_on=table.c.type,
properties={
'id': table.c.id,
'devId': table.c.devId,
'onTime': table.c.onTime,
'offTime': table.c.offTime,
}
)
return newcls

2015年总结

又是一年过去了, 回首过去一年的工作经历, 踩了太多的坑,也填了一些坑。

项目

15年做了2个项目:

  1. 腾达路由管理

这个项目最后并未上线,总总原因导致的结果,在这里就不提了。这个项目进一步加深了sqlalchemy和tornado的理解。同时也用到了angular,这是我在前端即backbone后又一次尝试。总体感觉不错。

  1. 千里眼(其实还是百米的路由器管理后台)

我负责了核心的api部分,同时也负责对接百万点(这个是百米的广告管理平台)数据。主要还是用了tornado和sqlalchemy。但是由于前期的规划和实现方法的问题,导致了很多问题,比如mysql的慢查询,分页查询等等问题,这些坑我填了好久,有些甚至至今未平!

当然,我也用到了celery框架,用过之后才发现这个框架的不凡,但是由于我是第一次用,有些地方不是很理解,也踩出了一些坑。

  1. 个人blog改写

原来的blog是基于zinnia的,出于学习的目的,把它用django-rest-framework和angular重写了。就是现在的blog。

Tornado中同步方法的异步化

缘由

上次在公司用 Tornado 做了路由平台管理后台的API, 但是由于没有用到tornado的异步操作, 全部采用同步执行, 所以效率很差, 公司要求改进.

资料

抽空找了下python下的异步微型库, 发现了 gevent.
但是gevent似乎不能直接用在tornado上, 看了看gevent的文档, 发现它用了一个叫 greenlet 的协程库, 看了下它的文档, 也很简单, 就是一个切换, 貌似用 C 语言封装了线程, 重写了python库的线程库.

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器