个人知识盲点1

2018-09-23  本文已影响0人  edwin1993

数据库事务
数据库索引类型
数据库索引的特点
B树和B+树
闭包问题
python装饰器问题
==和equals的详细区别
过拟合中L0,L1,L2的区别,为什么可以防止过拟合
集成学习与偏差方差

数据库中事务的特性

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

事务的特性:


数据库索引类型

常见数据库索引分四类,以Mysql为例:

它与前面的普通索引类似,不同的就是:MySQL数据库索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。

索引的特点

优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1.索引需要占用数据表以外的物理存储空间
2.创建索引和维护索引要花费一定的时间
3.当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。


B树和B+树

M=4 阶的B树

只有叶子节点存储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就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。

在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等

过拟合中L0,L1,L2的区别,为什么可以防止过拟合

参考:https://www.jianshu.com/p/475d2c3197d2

监督学习的过程可以概括为:最小化误差的同时规则化参数。最小化误差是为了让模型拟合训练数据,规则化参数是为了防止过拟合。
参数过多会导致模型复杂度上升,产生过拟合,即训练误差很小,但测试误差很大。

范数规则化有两个作用:
1)保证模型尽可能的简单,避免过拟合。
2)约束模型特性,加入一些先验知识,例如稀疏、低秩​等。

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

集成学习与偏差方差

参考:https://blog.csdn.net/xmu_jupiter/article/details/47314927

集成学习主要分为两类:

平均方法通常比其任何一个基分类器效果好因为尝试去降低模型的方差,而提升方法尝试去降低模型的偏差。

平均的方法采用多个分类器集体表决,就算其中一个分类器偏差较大,整体不会受其影响,偏差较小;然后,集体表决意味着模型泛化能力比较强,其分类能力相对于其中的每一个单一分类器是稳定的,所以相当于降低了方差。

提升的方法通过构造一系列的弱分类器对相同的训练数据集的重要性区别对待达到对训练数据的精确拟合,因此是降低了偏差。

上一篇 下一篇

猜你喜欢

热点阅读