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):
Python在读写远程MySql数据库时,在数据量略大时(约4000条),总是运行一段时间后,过程中出现:OperationalError: MySQL Connection not available,查看代码与cursor = conn.cursor()有关。
网上查了些资料,与MySql的固有bug有关(http://bugs.mysql.com/bug.php?id=67649):
链家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、 信息触发发送用户
当有新上房源或者价格变动时,可触发邮件或短信给用户。
推荐系统简介之一(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,添加了部分注释.
Tensorflow Playground是Google开源的一个神经网络深度学习展示demo,以图形化形式展示,可以直观地理解神经网络的工作原理。
本地部署
同样也可以将其git到本地部署,便于无网络环境下研究。
其采用node.js开发,nn.ts即是简化的nn库。
1、在控制台执行:
1
npm install https://github.com/tensorflow/playground.git
则在当前目录下,生成node_modules/deep-playground-prototype.
其主目录位于deep-playground-prototype下的dist目录,将web server主目录设为此即可。
2、启动npm run server,提示缺乏http-server,因http-server依赖jitsu,则首先安装jitsu。
执行:
1
2
3 npm install jitsu -g
cd node_modules/deep-playground-prototype
jitsu install http-server
则在deep-playground-prototype目录下,生成http-server目录,web server文件为其下的bin/http-server,执行:
1
2 cd dist
node ../http-server/bin/http-server
则可在http://localhost:8080 访问。
method 1: github
在原电脑将Hexo服务端文件全部提交到github, 在新电脑拉出github仓库,进行正常Hexo操作即可。
method 2: copy file
首先按照搭建hexo的过程一步步重新在新电脑上操作,之后只要用原电脑的scaffolds, source, themes 和 _config.yml替换新生成的文件就行了;为方便可以将服务端整个文件夹拷贝下来。
opencv功能强大,并提供C++、Python等各种接口而易于使用。
在Python下用img=cv2.imread()函数读取图像时,总是返回为None,造成后面的处理img.shape总是返回为NoneType错误。
系统为Ubuntu14.03,查看已安装有opencv2.4,网上查了下,有说是因为opencv的bug,建议用cv2.cv.LoadImage()代替使用,使用这个函数代替后,总是返回ioerror,再查似乎并没有他人遇到过ioerror问题。
既然这种方法行不通,那就可以考虑下面替代方法:
Alt 1:由于后面的img处理时是ndarray格式,那可以考虑先用matlab将图片读取后存储为mat格式,在python中直接读取mat数据,略过直接读取图片的imread操作。这种方法规避了上述错误,验证可行。
然后,偶尔查看pip list时,发现并没有opencv-python,忽然想到,可能是因为底层虽然安装了opencv,但并没有安装python接口,而python自带的cv2 api仅包含了函数列表,没有进一步与opencv的交互,这样imread时就可能不报错,但实际没有读取数据,造成返回为NoneType。
Final solution:执行pip install --upgrade opencv-python,成功后重新打开python console验证,imread jpg通过,返回的img为正常的M*N*3数据;至此解决此错误。