正则语法日知录1

摘录3则正则高级语法,非常实用,推荐之~

(?=pattern) 正向先行断言 
代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。 
例如对”a regular expression”这个字符串,要想匹配regular中的re,
但不能匹配expression中的re,可以用”re(?=gular)”,该表达式限定了re右边的位置,
这个位置之后是gular,但并不消耗gular这些字符,将表达式改为”re(?=gular).”,
将会匹配reg,元字符.匹配了g,括号这一砣匹配了e和g之间的位置。

(?!pattern) 负向先行断言 
代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。 
例如对”regex represents regular expression”这个字符串,要想匹配除regex
和regular之外的re,可以用”re(?!g)”,该表达式限定了re右边的位置,
这个位置后面不是字符g。负向和正向的区别,就在于该位置之后的字符
能否匹配括号中的表达式。

(?<=pattern) 正向后行断言 
代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配pattern。 
例如对”regex represents regular expression”这个字符串,有4个单词,
要想匹配单词内部的re,但不匹配单词开头的re,可以用”(?<=\w)re”,
单词内部的re,在re前面应该是一个单词字符。之所以叫后行断言,
是因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个
扫描字符串中的字符,并判断是否与表达式符合,当在表达式中遇到该断言时,
正则表达式引擎需要往字符串前端检测已扫描过的字符,相对于扫描方向是向后的。
正则语法日知录1

数据分析的基本技能

从人力市场搜罗一下,大概可以得到一下基本技能关键词:

SQL、python
可视化、统计、建模
指标、增长

那么,对于一个数据分析同学,这些技能基础要求是什么?

SQL
首先,增删改查的技能是不够,join语法是sql技能的起点。作为一门函数式语言,往往实现跟逻辑相关,而不是实现相关。
SQL至少掌握以下知识点:
1、大表join可能存在的问题
2、日期处理、字符处理的相关方法
3、hive sql、mysql sql的简单区别
4、聚合函数关于null的处理方式

python
脚本语言是数据的基础,python至少掌握以下知识点:
1、基本语法,做到看得懂
2、字符处理,列表处理,做到能用、能查
3、pandas、numpy,做到数据清洗和统计
4、可视化,python作为可视化承载,跟pandas结合,可以得到更详细的数据

可视化
我们一般知道很多图表,也基本能用饼图、曲线图、散点图、直方图、盒形图等等。但是,“可视化”可能不只是知道这些图表。
“可视化” 更重要的是 传达的观点跟图形的匹配程度。至少掌握以下关系的图形表达:
1、构成
2、关联
3、对比
4、层级

指标
“指标”其实是业务相关,数据分析工作首先需要摸清业务模式、用户来源、数据埋点、数据存储方式。
如果只知道技能,不知道业务,是无法设计指标的,也无法开展工作。所以谈“指标”,我们谈什么?
1、整体app 或 大盘指标,比如:新增用户、日活用户、累计用户、次日留存用户、7天留存用户
2、运营指标:路径转化、CTR、漏斗分析
3、主要人群:人口属性、标签

统计
统计主要指统计推断,从企业运营活动运营,从统计上给出是否“靠谱”的决断。你可以用统计的方法,也可以看趋势拍脑袋。
统计主要使用:
1、假设检验
2、异常分析

建模
一般建模=机器学习,当你需要挖掘更多的信息,给出指导性意见,至少掌握几个基本的机器学习方法:
1、逻辑回归
2、决策树
3、朴素贝叶斯
4、随机森林
5、xgboost

增长
“增长”其实业务目标,跟经验相关,做“增长”也是做用户运营,主要有:
1、用户分群分析-分群
2、活动系统搭建-触达
3、活动规划-策略

只有给 用户推荐合适的策略,才能达到增长的目标。

数据分析的基本技能

付费用户特征挖掘的主要流程

假设你手上有一份全局用户数据和一份付费用户数据,需要挖掘出付费用户的主要特征,可以参照以下流程:

一、数据治理
从不同来源的数据,首先要保证数据的准确性,所有需要进行必要的清洗和转换,可能涉及的内容有:

1、缺失值填充
2、冗余特征去除
3、异常行过滤
4、类别特征onehot编码
5、组合特征拆解
6、特征标准化(z-score\max-min等)

二、特征降维
一般拿到的数据列(特征)比较多,大多数特征相关性比较大,提供的信息比较类型,所以进行必要的特征降维是有意义的,一般采用PCA进行降维。

采用PCA降维涉及一个关键问题,从高维空间降低到多少维合适?

一般采用的降维数量衡量方法,可以不指定维度,最后根据降维结果,计算每个维度的可解析比率(特征信息覆盖程度),如果top 50的维度已经涵盖了80%的信息,采用50作为维度信息即可。

设定降维维度之后,得到的PCA结果,可作为后续聚类输入。

三、聚类分析
根据PCA的结果,我们可以采用kmeans进行聚类分析,由于需要聚类的数量不确定,我们可以尝试不同的聚类数量,递增聚类数量,对应每个聚类打印出SSE信息。由于聚类数量递增过程,SSE递减,到达某个聚类数量,SSE递减变得缓慢,可以得到拐点,即为最佳聚类数量(EIBOW 方法)。

四、业务分析
采用全局用户进行一~三的过程,我们可以得到全局用户的PCA模型、聚类模型,该模型直接应用于付费用户(需要进行必要的清洗、转换)。最后,我们可以打印这两组用户的聚类直方图。通过比较直方图,可以直观的知道 付费用户跟全局用户的差异类别,通过差异类型,反推PCA变量,再从PCA变量inverse transform到原始变量,通过业务背景,挖掘分析,即可得到付费用户的主要特征,进而进行运营推广。

付费用户特征挖掘的主要流程

back propagation算法原理简述

back propagation - 即反向传播,因为error function是关于输出层的函数,error function对隐藏层系数求偏导涉及输出层求导,所以,本质上,反向传播算法的推导,是链式求导的推导过程。所以我们先看看链式求导(复合求导)。

假设:
h = f(u) = f(w,x)
y = g(u') = g(w',h)

那么:
dy/dw' = dg/du' * du/dw'

其中,我们假设h为隐藏层,y为输出层(简化描述,假设就1个输入层、1个隐层、1个输出层)
在整个推导过程,我们的目的是求得w、w',即网络参数。

隐藏层系数:w
输出层系数:w'

假设我们采用MSE作为loss function:
E = 1/2 *sum( (label - y)^2 )

1、输出层
输出层的输入为隐藏层h输出u',对任意输出层的输入ui'进行求导:
dE/dui' = dE/dy * dy/dui' = (y-label) * dy/dui' 记为 EI'
由于y一般为sigmoid function,y为训练过程输出值(依赖隐藏层、输入层等),label为目标值

所以:
EI' = (y-label) * y * (1-y)

对任意的输出层的系数wi' 求导,复合求导,先求y的相关系数h,然后h关于wi'求导
dE/dwi' = dE/dui' * dui'/dwi' = EI' * dui'/dwi'

由于:
u' = sum(h * w')
所以:
dE/dwi' = dE/dui' * dui'/dwi' = EI' * hi

2、隐藏层
h为隐藏层的输出,参照以上流程,对任意hi求导,u'是关于h的函数,根据复合求导规则:
dE/dhi = dE/du' * du'/dhi = EI' * wi'

可以看到隐藏的求导结果依赖了输出层的求导结果,也即,体现了反向传播的内在含义。

继续对隐藏层的任意系数求导:wi
dE/dwi = dE/dhi * dhi/dui * dui/dwi = EI' * wi' * dhi/dui * xi

dhi/dui 取决于隐藏层采用什么类型的目标函数,假设还是sigmod function,则:
dE/dwi = EI' * wi' * hi * (1-hi) * xi 记为 EI

可见,隐藏层的参数更新依赖于 输出层的EI',初始化随机撒点,得到y,根据随机梯度下降算法更新wi、wi',即可求得wi、wi'系数。

参考:arXiv:1411.2738

back propagation算法原理简述

SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number问题

最近尝试使用crf++ 进行NER训练,在mac环境下,采用brew安装

brew install crf++
出现以下错误:
SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number

解决方案:
在公司代理环境下,配置的https代理是没必要的,只需要 http代理即可,相关说明:

Uses proxy env variable httpproxy == 'https://proxy.in.tum.de:8080'
^^^^^
The https:// is wrong, it should be http://. The proxy itself should be accessed by HTTP and not HTTPS even though the target URL is HTTPS. The proxy will nevertheless properly handle HTTPS connection and keep the end-to-end encryption. See HTTP CONNECT method for details how this is done.

https://stackoverflow.com/questions/50840101/curl-35-error1408f10bssl-routinesssl3-get-recordwrong-version-number

But
mac实验,terminal中使用pip安装python程序,https proxy设置还是必要的,所以肯定是哪里设置有问题,对于https,其实可以这么设置:
https_proxy='http://proxy.in.tum.de:8080'

SSL routines:CONNECT_CR_SRVR_HELLO:wrong version number问题