Tensorflow Neural Network初体验 - 让电脑自己学习艺术风格去处理图片

  最近俄国的一款APP比较火,名叫Prisma,利用人工神经网络技术,可以学习名画艺术风格,对我们的照片进行艺术化处理。
  好奇心起,了解了一下其原理,简单说即学习一副画的风格,并将这幅画的风格应用到另一幅图片上。那我们完全可以利用Tensorflow Neural Network功能,来实现类似Prisma的功能,可以自定义诸多参数,比如多幅画的混合风格,不同权重,学习率等,来任意定制我们想要的绘画风格,取得比Prisma更灵活的效果。
  利用神经网络进行人工智能绘画,起源于2015年9月的一篇论文”A Neural Algorithm of Artistic Style”,如下图显示不同风格的处理效果。
  A Neural Algorithm of Artistic Style
  代码参考anishathalye/neural-style,基于Tensorflow CNN工具包和VGG模型。VGG做为常用的几种模型结构,与AlexNet类似,如下图示意:
  VGG model
  转换图片风格命令如下:
python neural_style.py --content <content file> --styles <style file> --output <output file>

Read More

MySQL Connection not available的定位

  Python在读写远程MySql数据库时,在数据量略大时(约4000条),总是运行一段时间后,过程中出现:OperationalError: MySQL Connection not available,查看代码与cursor = conn.cursor()有关。
  网上查了些资料,与MySql的固有bug有关(http://bugs.mysql.com/bug.php?id=67649):

1
2
3
4
5
6
7
8
Description:
If you open an unbuffered cursor and you do not read the WHOLE result set before closing the cursor, the next query will fail with
File "/usr/lib/python3.2/site-packages/mysql/connector/connection.py", line 1075, in cursor
raise errors.OperationalError("MySQL Connection not available.")
mysql.connector.errors.OperationalError: MySQL Connection not available.
and all subsequent database calls will fail too.

Read More

爬取链家房屋信息-网络爬虫初体验demo

  链家APP以前可以查看房屋的价格变动信息,但新版本后取消了该功能,这样便不利于了解该房源的情况,比如某些房源一路调价3个月仍没卖出,要么不诚心卖,要么有各种问题。
  那么对于想购房的同学,有了目标区域重点关注的房源,如何能够获知其价格变动信息呢?很容易想到,自己轮个爬虫,每天自动爬一次,把房屋信息爬下后存起来,然后展示出来。
  主要的设计思路为:
1、 页面的爬取,house info的获取,主要涉及beautifulsoup库的使用;仅爬取指定的若干小区。
2、 信息存取:使用MySql数据库,数据库名称lianjiaHouse,包含两张表,两张表通过houseid进行关联:
  a) houseinfo,保存房屋基本信息,字段包括 价格、朝向、小区、户型、年代、税费等;
  b) hisprice,保存每天价格信息,字段包括日期、价格等;
3、 信息的更新,包括:
  a) new house的加入:当前爬取的houseid,数据库中没有,则插入记录。 validflag 标记为1,validdate标记为当前日期。并插入hisprice表
  b) old house失效:每次爬取前,首先将数据库中所有validflag标记为0;若当前爬取的houseid,数据库中有,则validflag 标记为1,validdate标记为当前日期,并更新价格信息;若为同一日期,则覆盖更新价格。这样若非当前爬取的houseid,数据库中保留validflag =0,validdate为最后有效日期,价格信息也仅更新到最后有效日期。
4、 信息展示
  a) 前端页面,输入指定小区,可展示所有房源信息和价格变动情况。
5、 信息触发发送用户
  当有新上房源或者价格变动时,可触发邮件或短信给用户。   

Read More

推荐系统简介之一(itemCF算法)

推荐系统简介之一(itemCF算法)
  习惯了今日头条、网易云音乐的推荐,对其背后的推荐原理产生了兴趣,大致了解了一下,主要利用用户上下文信息,比如注册信息、社交好友、时间地点、用户行为(购买、浏览记录等),来进行相关的分析。
  目前比较流行的推荐算法有userCF、itemCF、SVD++等。
  对于电商类网站,基于物品的协同过滤(item-based collaborative filtering)算法是目前业界应用最多的算法,如Amazon等。
  itemCF思想:给用户推荐那些和他们之前喜欢的物品相似的物品。
  (1) 计算物品之间的相似度。
  (2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。
  
  itemCF算法具体过程:
  1、构建M*N矩阵,N为用户数,M为item数,矩阵中数值rji表示用户i对item j的打分项。
  2、计算item i与item j的相似度,可以采用余弦相似度进行计算。
  余弦相似度定义
  为增强数值范围的健壮性,通常对每个item的N个user的打分值进行归一化,即每个user的打分值减去该item项的平均打分值。
  为避免未打分的user与item项影响,通常仅取矩阵中的item i与item j的公共用户的打分值进行相似度计算。
  相似度计算时,矩阵中打分数据通常并不进行归一化操作,如下面代码所示,而是直接计算,这时公式需要变形为下式:
  代码中余弦相似度的计算
  3、对用户x的待预测各item i,预测打分值,打分值按照最相似的topN个物品的加权打分和进行计算:
  预测值计算
  top N可以固定参数N,也可以设置门限,仅取相似度高于门限的参与计算。用movielens 100w数据集测试,N=10左右有较好效果。
  这样就完成了预测,从而可以将预测打分值高于门限的item项推荐展示给用户。
  
  下面代码来自于justdark/dml,添加了部分注释.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
from __future__ import division
import numpy as np
import scipy as sp
class Item_based_C:
def __init__(self,X):
self.X=np.array(X)
print "the input data size is ",self.X.shape
self.movie_user={}
self.user_movie={}
self.ave=np.mean(self.X[:,2])
for i in range(self.X.shape[0]):
uid=self.X[i][0]
mid=self.X[i][2]
rat=self.X[i][3]
self.movie_user.setdefault(mid,{})
self.user_movie.setdefault(uid,{})
self.movie_user[mid][uid]=rat
self.user_movie[uid][mid]=rat
self.similarity={}
pass
def sim_cal(self,m1,m2):
self.similarity.setdefault(m1,{})
self.similarity.setdefault(m2,{})
self.movie_user.setdefault(m1,{})
self.movie_user.setdefault(m2,{})
self.similarity[m1].setdefault(m2,-1)
self.similarity[m2].setdefault(m1,-1)
if self.similarity[m1][m2]!=-1:
return self.similarity[m1][m2]
si={}
for user in self.movie_user[m1]: # itme m1 and item target m2 ,common user set si =1
if user in self.movie_user[m2]:
si[user]=1
n=len(si)
if (n==0):
self.similarity[m1][m2]=1
self.similarity[m2][m1]=1
return 1
s1=np.array([self.movie_user[m1][u] for u in si]) # item j, common user
s2=np.array([self.movie_user[m2][u] for u in si]) # item target mid, common user
sum1=np.sum(s1)
sum2=np.sum(s2)
sum1Sq=np.sum(s1**2)
sum2Sq=np.sum(s2**2)
pSum=np.sum(s1*s2)
num=pSum-(sum1*sum2/n) # equal to sum[(s1-aveS1)*(s2-aveS2)]
den=np.sqrt((sum1Sq-sum1**2/n)*(sum2Sq-sum2**2/n))
if den==0:
self.similarity[m1][m2]=0
self.similarity[m2][m1]=0
return 0
self.similarity[m1][m2]=num/den
self.similarity[m2][m1]=num/den
return num/den
def pred(self,uid,mid):
sim_accumulate=0.0
rat_acc=0.0
for item in self.user_movie[uid]: # only fetch rating[item][uid]!=0, avoid cal all item
sim=self.sim_cal(item,mid) # sji, i=mid
if sim<0:continue
#print sim,self.user_movie[uid][item],sim*self.user_movie[uid][item]
rat_acc+=sim*self.user_movie[uid][item] # weight sum all non-zero items, Sij*rjx
sim_accumulate+=sim # sum(sij)
#print rat_acc,sim_accumulate
if sim_accumulate==0: #no same user rated,return average rates of the data
return self.ave
return rat_acc/sim_accumulate
def test(self,test_X):
test_X=np.array(test_X)
output=[]
sums=0
bersum=0
ber=0
print "the test data size is ",test_X.shape
for i in range(test_X.shape[0]):
pre=self.pred(test_X[i][0],test_X[i][4])
output.append(pre)
#print pre,test_X[i][5]
sums+=(pre-test_X[i][6])**2
bersum+=np.abs(pre-test_X[i][7])/test_X[i][8]
rmse=np.sqrt(sums/test_X.shape[0])
ber = bersum/test_X.shape[0]
print "the rmse on test data is ",rmse
print "the precision error percent on test data is ",ber
return output

Read More

Tensorflow Playground 初体验

  Tensorflow Playground是Google开源的一个神经网络深度学习展示demo,以图形化形式展示,可以直观地理解神经网络的工作原理。
  
  本地部署
  同样也可以将其git到本地部署,便于无网络环境下研究。
  其采用node.js开发,nn.ts即是简化的nn库。
  1、在控制台执行:
  

1
  npm install https://github.com/tensorflow/playground.git

Read More

NB-IoT简介(1)--下行公共信道与信号之NRS、NPSS、NSSS、NPBCH

Read More

机器学习资源-Python版

内容摘自:https://github.com/jobbole/awesome-machine-learning-cn

Read More

使用Hexo建立静态博客

环境配置

Read More

更换电脑时,如何更新Hexo Blog?

method 1: github
在原电脑将Hexo服务端文件全部提交到github, 在新电脑拉出github仓库,进行正常Hexo操作即可。
method 2: copy file
首先按照搭建hexo的过程一步步重新在新电脑上操作,之后只要用原电脑的scaffolds, source, themes 和 _config.yml替换新生成的文件就行了;为方便可以将服务端整个文件夹拷贝下来。

Read More

开源推荐系统Crab安装

安装环境:Ubuntu kylin 16.04 LTS, 自带 python 2.7.11

Read More