杂项

主要收集一些在平时遇到的但是还未形成体系的内容。

1 java相关

Class类中的getCanonicalName(), getName(), getSimpleName()

  1. getCanonicalName() 是获取所传类从java语言规范定义的格式输出。 //getCanonicalName()=com.pinzhi.test.dao.DaoEntity
  2. getName() 是返回实体类型名称 //getName()=com.pinzhi.test.dao.DaoEntity
  3. getSimpleName() 返回从源代码中返回实例的名称。//getSimpleName()=DaoEntity

2 linux相关

问题1 :虚拟机环境下Ubuntu登录后只显示桌面背景

解决方案:按alt+ctrl+F1进入命令行模式,使用sudo apt-get install ubuntu-desktop重新安装桌面

3 Python相关

yield与yield from 关键字的性质

  为了探究两个关键字的性质,使用print的方式测试了他们的一些性质。代码如下:

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
#yield_from.py
#定义两个函数,htest()&itest()
#在主方法中调用itest(),itest()通过yield from调用htest()
def htest():
print('htest run...')
i = 0
key = 0
while i < 4:
n = yield key
if n == 4:
p = 100
else:
p = n
key = p
print('h[',i,']:',key)
i += 1

def itest():
print('itest() start')
h = htest()
k = 0
h.send(None)
while True:
d = yield k
print('d=',d)
print('yield from htest()')
val1 = yield from htest()
print('itest1:', val1)
val2 = yield from htest()
print('itest2:', val2)
e = yield k
print('e=',e)
try:
print('th:',h.send(e))
except StopIteration as e:
print('h error!!!')
print('itest() end')

if __name__ == '__main__':
t = itest()
t.send(None)
j = 0
while j < 12:
j += 1
try:
t.send(j)
except StopIteration as e:
print('error!!!')

  运行结果如下:
test_yield_from
  由代码可以看出两个关键字有如下特点:

  1. 对于一个coroutine函数,首先要用send()方法传入一个None,开启这个函数
  2. coroutine函数传入参数的个数,由函数内的循环次数决定(即如果为无限循环时,可能会导致另一个coroutine函数无法接收参数),传入的参数个数超过循环次数则会抛出’StopIteration‘异常
  3. coroutine函数内通过 a = yield ba = yield from b()的方式接受传入的值,若是用变量接收,变量可为任意变量,但一定要是已定义的变量,接收变量后,可通过 b = xxxreturn xxx设定外部函数的返回值;若是使用yield from的方式,则要求后面的函数是coroutine函数。
  4. 参数传入是按顺序传入的。可以将yield from看做是一个数组,比如先用yield传值,后面接上一个yield from,则先将一个值传给yield,再将后面长度为yield from数组的数传入该函数中
  5. 使用yield from 方法时,若是直接传输给一个函数即yield from xxx(),每次传输都会重新开始循环;
  6. 若是使用在循环外h =coroutine() h.send(None)开启coroutine函数,在循环中用yield h接受传入的值,则每次运行都会从继续上一次的状态开始

python中的文件操作

有以下语句:

1
2
with open(filepath,'xt') as f:
f.write('Hello\n')

理解为:x模式是Python3中对open()函数的拓展,用来代替W模式对一个不存在文件系统的文件操作。xt 模式下,若是filepath中的文件已存在,会抛出FileExistsError。

翻转list

有以下语句:

1
2
x = [1,2,3,4,5,6]
x_trans = [x[::-1] for val in x]

理解为:对于一个list,使用索引取值时,可以加入第三个参数,即取值的步长(默认为1),值为-1表示逆序取值

np.newaxis

 功能:np.newaxis是用来给数组a增加维度的
 格式:a[np.newaxis和:的组合],如a[:,np.newaxis],a[np.newaxis, np.newaxis, :]
 详解:np.newaxis在[]中第几位,a.shape的第几维就变成1,a的原来的维度依次往后排。

1
2
3
4
5
6
7
8
9
# 示例
a.shape=(a ,b, c)

a[:, np.newaxis].shape= (a, 1, b, c)
a[:, np.newaxis, np.newaxis].shape= (a, 1, 1, b, c)
a[np.newaxis, :].shape= (1, a, b, c)
a[np.newaxis, np.newaxis, :].shape= (1, 1, a, b, c)
a[np.newaxis, :, np.newaxis].shape= (1, a, 1, b, c)
a[np.newaxis, :, np.newaxis, :].shape= (1, a, 1, b, c)

4 机器学习相关



《time-series-of-price-anomaly-detection》

一篇关于异常检测的好文章,使用python实现了不同方法在异常检测上的应用

相关算法:
孤立森林算法,过程大概为,对不同维度随机划分区间(直至区间内只剩一个点)构造多棵树,根据目标点在多棵树中的平均高度判断是否异常点
oneClassSvm,求出包裹样本的最小超球面,不在球面内的样本都认为不是想要的类


基本概念

  • 输入空间/输出空间: 监督学习中,属入和输出所有可能的取值集合称为输入空间和输出空间。通常输出空间远小于输入空间

  • 特征空间:每一条样本被成作是一个实例,通常由特征向量表示,所有特征向量存在的空间称为特征空间。特征空间有时候与输入空间相同,有时候不同(例如word embbeding),不同的情况是输入空间通过某种映射生成了特征空间。


k-means:k-均值

算法实现过程

  • step1. 随机选取k个对象作为初始的k个簇的质心;

  • step2. 剩余对象使用距离公式(默认为欧式距离)分别对质心求得距离,分配点到距离最近的簇

  • step3. 求得各簇的均值,作为新的质心

  • step4.重复step2,3,直到目标函数最小化为止


k-meoids:k-中心点

算法实现过程

  • step1. 随机选取k个对象作为初始的k个簇的质心;

  • step2. 剩余对象使用距离公式分别对质心求得距离,分配点到距离最近的簇

  • step3. 随机选取某一簇的非中心点作为新的质心,重复step2,计算每个点与新质心和旧质心的距离变化(正/负/零)并求出总变化S,若S<0,则使用新质心

  • step4.重复step3,直到目标函数最小化为止


GMM,高斯混合模型(EM方法)

  高斯混合模型(GMM),是将一个事物分解为若干基于高斯概率密度函数形成的模型。其基本公式如下:

算法实现过程

  • step1. 给定高斯概率公式,假设数据由k组高斯分布数据混合而成
  • step2. 随机指定两组高斯分布的参数(均值,方差)
  • step3. 使用两条概率公式对所有数据点进行划分
  • step4.分别求得划分结果的均值和方差,作为新一轮EM的初始参数
  • step5.重复步骤2-4,直到参数不再变化

参考文献:
 [1]混合高斯模型(GMM)推导及实现
 [2]EM算法


ID3

  ID3算法是决策树方法中最具代表性的算法,以信息熵作为目标评价函数。其基础理论为信息熵理论,相关的公式如下所示:

  公式(1)为信息量的计算公式,其中,P(Y)是事件发生的概率。公式表示了一件事发生的概率越小,它所蕴含的信息量越大。
  公式(2)为信息熵的计算公式,表达了Y事件发生的不确定度,就是所有可能发生的事件的信息量的期望。
  公式(3)为条件熵的计算公式,表示在给X给定的条件下,Y的条件概率分布的熵对X的数学期望。
  公式(4)为信息增益公式。当我们用另一个变量X对原变量Y分类后,原变量Y的不确定性就会减小了(即熵值减小)。而熵就是不确定性,不确定程度减少了多少其实就是信息增益。

算法实现过程(树构建)

  • step1. 分别求得各个特征与目标结果的条件熵,信息增益最大的列为最优特征列;

  • step2. 以最优特征列为根节点,列的值作为划分依据,对数据集进行划分,在各分支取得数据子集(值等于分支的值,并去掉该最优特征列);

  • step3. 分别以数据子集为基础,重复step1,2。直到特征列为1或分支下目标类别概率为1;

参考文献:
 [1]决策树之系列一ID3原理与代码实现)


C4.5

  C4.5算法也是决策树算法的一种,是ID3算法的一种改进算法。算法中,与ID3的最大区别在于C4.5提出了一个新的特征选择标准:

  算法步骤同ID3算法过程。

参考文献:
 [1]数据挖掘领域十大经典算法之—C4.5算法(超详细附代码)


感知机

  感知机原理+代码可在查考文献中查看。

算法实现过程

参考文献:
 [1]机器学习——15分钟透彻理解感知机


Fisher线性分类器

  判别分析问题,即:根据历史上划分类别的有关资料和某种最优准则,确定一种判别方法,判定一个新的样本归属哪一类。Fisher线性分类器是一种线性判别函数。

算法计算步骤


拉格朗日乘子法

  拉格朗日乘子法主要解决的问题是:在约束条件下取得目标函数的最优解(最值)问题。

参考文献:
 [1]深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件


似然比率方法

CUSUM方法

  CUSUM方法的理论基础是序贯分析原理中的序贯概率比检验,这是一种基本的序贯检验法。采用了类似滑动窗口的方式,对变化点进行检测。
  其基本思路为:使用一个计数器统计前后数据之间的变化,当数据的均值、方差等发生变化时,统计量会不断累计,为异常事件的发生设定一个阈值,若超过阈值则认定序列的状态发生变化。

参考文献:
 [1]CUSUM算法
 [2]CUSUM算法在变点检测中的应用


激活函数


5 tensorflow相关

API

理解tf.squeeze

  • squeeze(input, axis=None, name=None, squeeze_dims=None)
  • 该函数返回一个张量,用来三处维度为1 点维度
  • 如:tf.squeeze(inputs,[2,4]) # 删掉2维和4维

global_step

  • 主要在滑动平均,学习率变化等场景下使用

tf.summary

  • 够保存训练过程以及参数分布图并在tensorboard显示
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
tf.summary.scalar

# 用来显示标量信息,其格式为:
tf.summary.scalar(tags, values, collections=None, name=None)

#例如:tf.summary.scalar('mean', mean)
#一般在画loss,accuary时会用到这个函数。
#########
tf.summary.histogram

#用来显示直方图信息,其格式为:
tf.summary.histogram(tags, values, collections=None, name=None)
#例如: tf.summary.histogram('histogram', var)
#一般用来显示训练过程中变量的分布情况
#########
tf.summary.distribution
#分布图,一般用于显示weights分布
#########
tf.summary.text
#可以将文本类型的数据转换为tensor写入summary中:
#例如:
text = """/a/b/c\\_d/f\\_g\\_h\\_2017""" summary_op0 = tf.summary.text('text', tf.convert_to_tensor(text))
#########
tf.summary.image
# 输出带图像的probuf,汇总数据的图像的的形式如下:
#' tag /image/0', ' tag /image/1'...,如:input/image/0等。
#格式:
tf.summary.image(tag, tensor, max_images=3, collections=None, name=Non
#########
tf.summary.audio
# 展示训练过程中记录的音频
#########
tf.summary.merge_all
# merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。如果没有特殊要求,一般用这一句就可一显示训练时的各种信息了。
#格式:tf.summaries.merge_all(key='summaries')
#########
tf.summary.FileWriter

#指定一个文件用来保存图。
#格式:tf.summary.FileWritter(path,sess.graph)
#可以调用其add_summary()方法将训练过程数据保存在filewriter指定的文件中

6 面试准备推荐阅读目录

数据结构

Java Set集合详解及Set与List的区别

进程与线程

进程间的五种通信方式

数据库

什么是最左匹配原则?
MySQL索引背后的数据结构及算法原理
MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

To be continue…

感谢你的阅读!