Scala语言是出了名的语法诡异,功能强大-_-,他的Iterator也是如此,还提供了亲民心的size/length方法,但是,但是,但是慎用!!

事情是这样的

今天在做这个:进行采样,在mapPartitions中操作,会传来一个Iterator迭代器,里面存着原始数据,我需要做的大概是先统计迭代器中的数量N(使用size方法来做),然后计算出一个需要采样的量n,然后遍历(直接for来做)这个迭代器,按自己的业务采样n个记录!

清晰明了的一个程序,这尼玛最终采样的变量一直是空,一直是空,一直是空。
起初还以为是概率那块算错了,导致采不出来,但是单独把程序剥离出来debuge发现这个for压根没数据,但是明明这个迭代器的里面的size是有值的啊,奇了怪了。。。

Read More

python相当方便,有问题可以直接查Doc,但是Doc略有繁琐,所以在词记下常用的一些技巧以及bug解决方案^_^

判断字符串的一些东西

当然下面的判断完全可以自己使用正则表达式来些,但是有一句话是杀鸡焉用牛刀,下面的api使用起来就会非常便捷

s为字符串

  1. s.isalnum() 所有字符都是数字或者字母
  2. s.isalpha() 所有字符都是字母
  3. s.isdigit() 所有字符都是数字
  4. s.islower() 所有字符都是小写
  5. s.isupper() 所有字符都是大写
  6. s.istitle() 所有单词都是首字母大写,像标题
  7. s.isspace() 所有字符都是空白字符、\t\n\r

自带的排序函数

python中有两种排序方式:

  1. list.sort(func=None, key=None, reverse=False):这种排序会改变list自身的数据
  2. sorted(list,func=None, key=None, reverse=False):这种会重新生成一个新的list

最简单的栗子:

1
2
3
list=[1,3,4,2,4,7]
list.sort()
print list

会输出

[1, 2, 3, 4, 4, 7]

反向排序

1
2
3
list=[1,3,4,2,4,7]
list.sort(reverse=True)
print list

会输出

[7, 4, 4, 3, 2, 1]

对指定关键字进行排序:

list=[('a',100),('b',10),('c',50),('d',1000),('e',3)]
list.sort(key=lambda x:x[1])
print list

可以看到结果:

[('e', 3), ('b', 10), ('c', 50), ('a', 100), ('d', 1000)]

若不指定,貌似是按第一个关键词排序

还有两种方式均可以完成指定关键词方式:

1
list.sort(lambda x,y:cmp(x[1],y[1]))
1
2
import operator
list.sort(key=operator.itemgetter(1))

按多关键字排序

1
2
3
list=[('a',100),('b',10),('c',100),('d',1000),('e',100)]
list.sort(key=lambda x:(x[1],x[0]))
print list

1
2
3
4
5
import operator

list=[('a',100),('b',10),('c',100),('d',1000),('e',100)]
list.sort(key=operator.itemgetter(1,0))
print list
[('b', 10), ('a', 100), ('c', 100), ('e', 100), ('d', 1000)]

sorted传参一样,只是会返回一个新的实例而已

异常处理

语法结构

1
2
3
4
5
6
try:
block
except [Exception as e]:
do...
finally:
do...

for Example:

1
2
3
4
5
6
7
try:
1/0
except Exception as e:
print 'err'
raise e
finally:
print 'end'

动态载入库

有时候需要载入的库是动态的,类似Java的反射

const_en.py

1
name="xiaoming"

const_ch.py

1
2
3
#! -*- coding=utf-8 -*-

name="小明"

test.py

1
2
3
4
5
6
7
8
#! -*- coding=utf-8 -*-
import sys

const = __import__('const_en')
print const.name

const = __import__('const_ch')
print const.name

可以看到输出结果:

xiaoming
小明

参数中*和**的使用

Python函数的入参列表中经常会看到*和**,他们其实并不是代表指针或者引擎,其中
*表示传递任意个无名字参数,放置在一个元组中,比如

1
2
3
4
5
def array_para_test(a,b,*c):
print a,b
print c

array_para_test(1,2,3,4,5)

它的最终输出将会是

1 2
(3, 4, 5)

**表示任意个有名字的参数,用于存放在字典中进行访问,比如

1
2
3
4
5
def dict_para_test(a,b,**c):
print a,b
print c

dict_para_test(1,2,name="tome",age=23)

他的最终输出是

1 2
{'age': 23, 'name': 'tome'}

下面应该回持续更新

Model Select problem

在机器学习的世界里面有非常多的模型(基石这个课暂时只讲了Perceptron Learning AlgorithmLinear Regression,Logistic Regression),各个模型也会有自己不同的特点,有各自长处,也有各自的短处,并且除模型之外,还有其他的附属选择,比如Regularization的类型,或者具体参数的值,比如Gradient Descent里面的步长等,我们知道,现在机器学习的目的就是得到最小化的Eout(也就是测试误差啦),那么现在给你一批数据,然后会出现上述那么多的选择,如果做才能得到最小的Eout呢?

也就是我们要找到一个最好的模型Hm,使得Eout(gm)最小。

Read More

What is Overfitting

假设现在我们使用一个二次函数随机产生几个点,并且加入非常少量的噪声,然后使用一个四次函数来进行拟合
将得到如下的结果

可以发现4次函数可以完全拟合含有噪声的2次函数产生的点,也就是拟合出来的Ein=0,但是此时如果使用新的2次函数的点用这个4次的拟合函数来进行预测的话,可以发现Eout会很高,
这种低EinEout就是叫做泛化能力差(BAD generalization),也是往往我们在做训练预测时不希望看到的。

Read More

Multiclass-Classification

Perceptron Learning Algorithm,Logistic Regression这些算法的最初出现都是基于2分类的(Binary Classification),但是生活中会出很多多分类的问题出现(比如选择题:四选一,视觉的识别,手写体的识别之类的)



那么我们如何才能使用这些二分类的模型来完成多分类的需求呢?

Read More

Logistic Regression

前两篇文章中的模型Perceptron Learning AlgorithmLinear Regression可以解决的问题是判断一个患者是否会心脏病,但是实际生活中里面里面可能给出的报告的是患者患心脏病的一个概率:

这样的话从模型的角度来说更希望的是得到一个发生在患心脏病的概率f(x)=P(+1|x)∈[0,1],
这个概率值越大,患心脏病的概率越大,反之则越小

Read More

这个总结最初是写在本地的MacDown中的,他的markdown语法解析与hexo的略微有点差异,懒得改了-_-,忍着点看..
对排版看不下去了,将本文的公式使用Latex重写了^_^ .on 2016-04-15

朴素贝叶斯

参考[1]

事件AB同时发生的概率为在A发生的情况下发生B或者在B发生的情况下发生A
$$P(A \cap B) = P(A)*P(B|A) = P(B)*P(A|B)$$
所以有:
$$P(A|B)=\frac{P(B|A)*P(A)}{P(B)}$$

对于给出的待分类项,求解在此项出现的条件下各个目标类别出现的概率,哪个最大,就认为此待分类项属于哪个类别

工作原理

  1. 假设现在有样本$x=(a_1,a_2,a_3,…a_n)$这个待分类项(并认为$x$里面的特征独立)
  2. 再假设现在有分类目标$Y=\{y_1,y_2,y_3,y_4..y_n\}$
  3. 那么$max(P(y_1|x),P(y_2|x),P(y_3|x)..P(y_n|x))$就是最终的分类类别
  4. 而$P(y_i|x)=\frac{p(x|y_i)*P(yi)}{P(x)}$
  5. 因为$x$对于每个分类目标来说都一样,所以就是求$max(P(x|y_i)*p(y_i))$
  6. $P(x|y_i)*p(y_i)=p(y_i)*\prod_i(P(a_i|y_i))$
  7. 而具体的$p(a_i|y_i)$和$p(y_i)$都是能从训练样本中统计出来
    $p(a_i|y_i)$表示该类别下该特征出现的概率
    $p(y_i)$表示全部类别中这个这个类别出现的概率
  8. 好的,就是这么工作的^_^

Read More

有监督学习和无监督学习的区别

  • 有监督学习:对具有标记的训练样本进行学习,以尽可能对训练样本集外的数据进行分类预测。(LR,SVM,BP,RF,GBRT)
  • 无监督学习:对未标记的样本进行训练学习,比发现这些样本中的结构知识。(KMeans,DL)

正则化

正则化是针对过拟合而提出的,以为在求解模型最优的是一般优化最小的经验风险,现在在该经验风险上加入模型复杂度这一项(正则化项是模型参数向量的范数),并使用一个rate比率来权衡模型复杂度与以往经验风险的权重,如果模型复杂度越高,结构化的经验风险会越大,现在的目标就变为了结构经验风险的最优化,可以防止模型训练过度复杂,有效的降低过拟合的风险。

奥卡姆剃刀原理,能够很好的解释已知数据并且十分简单才是最好的模型。

Read More