[娱乐] 一个监控NIKE官网NBA球衣打折的QQ机器人

上次写的微信版机器人的爬虫已经失效了,这次重新搞了爬虫,平常用的qq比较多所以也换成了qq版。

需要准备:

  • Windows服务器一台,阿里云ECS即可(Linux也可以但是需要Wine,不如直接原生Windows)
  • QQ小号一个,用来作为发送消息的载体

首先到coolq的社区下载最新版的coolq air,图灵版或者小i版都行,无所谓,我们不会用到他们的ai。
继续阅读“[娱乐] 一个监控NIKE官网NBA球衣打折的QQ机器人”

[数学] 向量函数的雅可比矩阵与链式法则

复习一下我的数学知识T_T

1. 回顾高等数学:多元数量函数的梯度

回想高等数学中常见的多元数量函数$f:\mathbb{R}^{n}\rightarrow \mathbb{R}^{1}$,我们可以把他的输入当作一个向量 $\bf{x}\in \mathbb{R}^{n}$,输出$y=f(\bf{x})\in \mathbb{R}^{1}$是一个数字。那么由高数的知识我们知道$f$的梯度定义为
$$
\nabla f_{\boldsymbol{x}} \overset{\underset{\mathrm{def}}{}}{=} \left[ \frac{\partial f }{\partial x_1}, \frac{\partial f }{\partial x_2},\cdots,\frac{\partial f }{\partial x_n} \right]=\frac{\partial f }{\partial \boldsymbol{x}}
$$

有了上式,我们还可以写出全微分的向量化表示

\[
\begin{aligned}
df &= \frac{\partial f}{\partial x_1}dx_1+\frac{\partial f}{\partial x_2}dx_2+\cdots+\frac{\partial f}{\partial x_n}dx_n \\
&=\left[ \frac{\partial f }{\partial x_1}, \frac{\partial f }{\partial x_2},\cdots,\frac{\partial f }{\partial x_n} \right] \left[dx_1, dx_2,\cdots,dx_n \right]^T \\
&=\frac{\partial f }{\partial \boldsymbol{x}} d\boldsymbol{x}
\end{aligned}
\]

接下来我们将其推广到向量函数。向量函数的“梯度”其实就是雅可比矩阵
继续阅读“[数学] 向量函数的雅可比矩阵与链式法则”

强化学习入门: Q-Learning的python实现

强化学习入门: Q-Learning的python实现

观摩了微软俱乐部游戏组大佬的一个unity+tensorflow搞出来的的游戏AI之后对强化学习产生了点兴趣(其实说起来我当时进俱乐部面试的是游戏组最后给我整到软件了???),准备从小白开始学习一下强化学习和游戏里的AI。不过,查了很多资料之后直观感受是,国内这方面的优质资源真的很少,尤其是面向新手的。。。讲的乱七八糟,看的头皮发麻。经过一番扒拉后,找到了两个非常nice的国外大神做的入门教程,链接分别在

当我看到这两个Tutorial的时候感觉就像这位朋友的评论一样hhh

这里的代码用到的环境是openAI-gym里的Taxi-v2,这个游戏的界面长这样

简单说下这个图的含义:

总共5*5个空格,RGBY是四个表示乘客/目的地的位置 继续阅读“强化学习入门: Q-Learning的python实现”

机器学习中的数学 –标量函数对矩阵求导的方法

标量函数对矩阵求导的方法

写这个是因为今天在推CNN的反向传播的时候遇到了数学上无法理解的操作2333,google了一波发现主要问题出在我并没有学会矩阵求导运算,这个东西和普通的标量函数运算还是有很大区别的,比如认为AX对X的导数为A就是错的。因此今天专门来学习一下这个知识。

符号规定:使用小写字母x表示标量,粗体小写字母\[\boldsymbol{x} \]表示列向量,大写字母X表示矩阵。

首先思考一下标量函数对矩阵(向量)求导的定义,假设函数为f,求其对矩阵X的导数,可以记为
$$\frac{\partial f}{\partial X} = \left[\frac{\partial f }{\partial X_{ij}}\right]$$
可以发现我们要得到的其实是一个标量函数对矩阵X里的所有元素逐个求导然后把这些求导的结果根据与X里元素的位置关系排成与X同样形状的矩阵这么一个东西。当然我们可以把矩阵squeeze一下搞成一堆分离的变量逐个求,但是这样就与使用矩阵的初衷相抵触了,本来使用矩阵就是为了运算的方便整洁,那要拆开变成分散的变量还用矩阵干什么,所以有必要研究下从矩阵这个整体的角度出发的求导方法。

回想一下高等数学中多元函数的微分,可以写成
$$df = \sum_{i=1}^n \frac{\partial f}{\partial x_i}dx_i $$
换个写法把求和转变成向量内积的形式的话就是
$$df = \frac{\partial f}{\partial \boldsymbol{x}}^T d\boldsymbol{x}$$

按照之前的定义,矩阵的导数可以写成
$$df = \sum_{i=1}^m \sum_{j=1}^n \frac{\partial f}{\partial X_{ij}}dX_{ij}$$
那么同样的仿照上一段用矩阵表示多元函数微分的方式,比如内积表示这个式子的话,可以写成
$$df = \text{tr}\left(\frac{\partial f}{\partial X}^T dX\right)$$
其中tr表示矩阵的迹(仿真对角线元素之和),满足对尺寸相同的矩阵A,B,\[\text{tr}(A^TB) = \sum_{i,j}A_{ij}B_{ij}\],即\[\text{tr}(A^TB)\]是矩阵A,B的内积。

然后来考察一下基本的运算规则。 继续阅读“机器学习中的数学 –标量函数对矩阵求导的方法”

python小项目——实现校园一卡通图片信息识别

讲道理90%的工作都是在做图像处理。。。。opencv各种操作。

一完工赶紧专心复习emmmm

代码在我的github

大致步骤:
首先必要的库

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pytesseract
from PIL import Image
import os
from PyQt5 import QtCore, QtGui, QtWidgets, Qt
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

① 预处理(灰度,直方图均衡,滤波)

def stechCr(img):
    dst = cv2.equalizeHist(img)
    if debug:
        cv2.imshow('dst',dst)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    return dst
gray = cv2.fastNlMeansDenoisingColored(img, None, 10, 3, 3, 3)
gray=cv2.cvtColor(gray,cv2.COLOR_BGR2GRAY)
img,gray=makepic(gray)

② 提取ROI,主要用opencv的findContours找到背景下最大的轮廓,也就是卡面本身。
继续阅读“python小项目——实现校园一卡通图片信息识别”

设置远程登陆服务器 jupyter notebook

在尝试了各种操蛋的手机端python ide之后忽然意识到可以在服务器上装jupyter然后手机浏览器打开emmmm
当然电脑端也能用啦,只不过我这台小鸡性能太垃圾所以意义不大

主要参考https://bitmingw.com/2017/07/09/run-jupyter-notebook-server/

不过他的文章中有一点问题就是,设置可以远程访问的时候有一步设置

c.NotebookApp.ip = '*'

,但是其实有时候是不行的(我也不知道为什么),如果不行就改成

c.NotebookApp.ip = '0.0.0.0'

另外,这是我用来跑ss的小鸡所以没有https的操作,直接跳过(反正我也懒得弄

基本上的步骤就是

①在服务器上装jupyter(废话

②生成配置文件 命令:

jupyter notebook --generate-config

③生成密钥 ,见下图

④修改配置文件

c.NotebookApp.ip='0.0.0.0'               # 就是设置所有ip皆可访问
c.NotebookApp.password = u'sha:ce...'     # 刚才复制的那个hash密钥
c.NotebookApp.open_browser = False       # 禁止自动打开浏览器
c.NotebookApp.port =8888                 #随便指定一个端口

⑤启动jupyter notebook应用,nohup 设置为断开ssh后继续运行的方式

# 启动 notebook 服务
nohup jupyter notebook > /dev/null  2>&1 &

如果想终止 notebook 应用,请找到含有 jupyter-notebook 的进程,并用 kill杀掉它。

⑥本地浏览器地址栏输入服务器ip:8888 就可以看到登录界面了,输入密码即可