个人知识盲点1
数据库事务
数据库索引类型
数据库索引的特点
B树和B+树
闭包问题
python装饰器问题
==和equals的详细区别
过拟合中L0,L1,L2的区别,为什么可以防止过拟合
集成学习与偏差方差
数据库中事务的特性
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
事务的特性:
- 原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 - 一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 - 隔离性(Isolation)
一个事务的执行不能被其他事务干扰。 - 持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
数据库索引类型
常见数据库索引分四类,以Mysql为例:
-
普通索引
这是最基本的MySQL数据库索引,它没有任何限制。 -
唯一索引
它与前面的普通索引类似,不同的就是:MySQL数据库索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
- 主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。
- 聚集索引(也叫聚簇索引):
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
索引的特点
优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1.索引需要占用数据表以外的物理存储空间
2.创建索引和维护索引要花费一定的时间
3.当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
B树和B+树
- B树
B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。特点如下:
根节点至少有两个子节点
每个节点有M-1个key,并且以升序排列
位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
其它节点至少有M/2个子节点

- B+树
B+树是对B树的一种变形树,它与B树的差异在于:
有k个子结点的结点必然有k个关键码;
非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。

只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针。
- 区别
B树
每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。

B+树
只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针。

后来,在B+树上增加了顺序访问指针,也就是每个叶子节点增加一个指向相邻叶子节点的指针,这样一棵树成了数据库系统实现索引的首选数据结构。 因为它内节点不存储data,这样一个节点就可以存储更多的key。
闭包问题
闭包就是能够读取其他函数内部变量的函数。
函数可以嵌套定义,即在一个函数内部可以定义另一个函数,有了嵌套函数这种结构,便会产生闭包问题。如:
def ExFunc(n):
sum=n
def InsFunc():
return sum+1
return InsFunc
>>> myFunc=ExFunc(10)
>>> myFunc()
11
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
python装饰器问题
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
- 普通装饰器
def deco(fun):
print("-----------")
startTime = datetime.datetime.now()
fun()
endTime = datetime.datetime.now()
duringTime = (endTime - startTime)
print(duringTime)
print("-----------")
#deco函数就是最原始的装饰器,它的参数是一个函数,然后返回值也是一个函数。
@deco
def func():
print("hello here")
time.sleep(1)
print("hello after sleep(1)")
func
'''
-----------
hello here
hello after sleep(1)
0:00:01.028704
-----------
'''
- 带参数装饰器:
#带参数的装饰器
def deco2(fun):
def wrapper(*args,**kwargs):
print("deco2")
print(args)
return fun(*args,**kwargs)
return wrapper
@deco2
def func2(a,b):
print("this is func2")
func2(2,4)
'''
deco2
(2, 4)
this is func2
'''
- 多个装饰器的执行顺序
多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。
def dec1(func):
print("1111")
def one():
print("2222")
func()
print("3333")
return one
def dec2(func):
print("aaaa")
def two():
print("bbbb")
func()
print("cccc")
return two
@dec1
@dec2
def test():
print("test test")
test()
'''
aaaa
1111
2222
bbbb
test test
cccc
3333
'''
==和equals的详细区别
- ==
“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。
==就是用来比较值是否相等。
在Java中游8种基本数据类型:
浮点型:float(4 byte), double(8 byte)
整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte)
布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值"true"和"false")
对于这8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。
对于非基本数据类型的变量,比如String就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。
- equals
在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。
String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等
过拟合中L0,L1,L2的区别,为什么可以防止过拟合
参考:https://www.jianshu.com/p/475d2c3197d2
监督学习的过程可以概括为:最小化误差的同时规则化参数。最小化误差是为了让模型拟合训练数据,规则化参数是为了防止过拟合。
参数过多会导致模型复杂度上升,产生过拟合,即训练误差很小,但测试误差很大。
范数规则化有两个作用:
1)保证模型尽可能的简单,避免过拟合。
2)约束模型特性,加入一些先验知识,例如稀疏、低秩等。
- L0
L0是指向量中非0的元素的个数。如果我们用L0范数来规则化一个参数矩阵W的话,就是希望W的大部分元素都是0。

- L1
L1范数是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)
L1正则化之所以可以防止过拟合,是因为L1范数就是各个参数的绝对值相加得到的,参数值大小和模型复杂度是成正比的。因此复杂的模型,其L1范数就大,最终导致损失函数就大,说明这个模型就不够好。

- L2
也叫“岭回归”(Ridge Regression),也叫它“权值衰减weight decay”
但与L1范数不一样的是,它不会是每个元素为0,而只是接近于0。

集成学习与偏差方差
参考:https://blog.csdn.net/xmu_jupiter/article/details/47314927

集成学习主要分为两类:
-
平均方法:例如随机森林, Bagging methods。在平均方法中,系统分别去建立多个基分类器,分类器之间没有任何联系。然后在分类或者回归阶段,各个分类器根据测试数据给出自己的答案,然后系统根据各个分类器给出的结果去综合出最后的结果,比如可以使投票的形式。
-
提升方法:例如梯度提升决策树GBDT,AdaBoost。在提升方法中,系统模型在训练过程中会先后建立一系列分类器,这些分类器单个可能是弱分类器,但是组合起来就成为一个强分类器。
平均方法通常比其任何一个基分类器效果好因为尝试去降低模型的方差,而提升方法尝试去降低模型的偏差。
平均的方法采用多个分类器集体表决,就算其中一个分类器偏差较大,整体不会受其影响,偏差较小;然后,集体表决意味着模型泛化能力比较强,其分类能力相对于其中的每一个单一分类器是稳定的,所以相当于降低了方差。
提升的方法通过构造一系列的弱分类器对相同的训练数据集的重要性区别对待达到对训练数据的精确拟合,因此是降低了偏差。