数据分析整理

算法题整理(待更新,不全面)

1. 分类与回归的区别

回归:输入变量与输出变量均为连续变量的预测问题(预测结果为某一值,该值有无限种可能);
分类:输出变量为有限个离散变量的预测问题(预测结果范围只有几个值或多个值);

2. 归一化和标准化的区别

归一化:将训练集中某一列数值特征xi(设第i列)的值缩放到0-1之间 x i m i n ( x i ) m a x ( x i ) m i n ( x i ) \frac{xi-min(xi)}{max(xi)-min(xi)}
标准化:将某一列值缩放成均值为0,方差为1( x i x ˉ ρ ( x ) \frac{xi-\bar{x}}{\rho(x)}
好处:① 提升模型精度;② 提升收敛速度;
问题1:
问:逻辑回归必须归一吗?
答:看是否用正则,用正则则需要;
问:Why?
答:加上正则后,损失函数除了度量预测与真实差距,还要度量参数值k是否足够小(y=kx);若不同特征数值范围不一样,有的0-0.1,有的100-10000,那么特征对应的参数大小级别也不一样;在L1正则时,只是将参数的绝对值相加,导致L1只会对级别大的参数有作用;
问题2:
问:标准化对逻辑回归的好处?
答:标准化后,得出的参数值大小可反映出不同特征对样本label的贡献度,方便对特征进行筛选;
注:应将测试集拆分,不要在整个数据集上标准化;

3. 神经网络

  1. 反向传播的思想:
    计算输出与标签之间的损失值,然后计算其相当于每个神经元的梯度,根据梯度方向更新权值;
    (1)将训练集输入到ANN输入层,经过隐藏层达到输出层并输出结果(前向);
    (2)计算ANN估计值与实际值之间的误差,并将误差反向传播,直至传入至输入层;
    (3)反向传播过程中,根据误差调整各种参数的值,不断迭代,直至收敛;
  2. CNN:
    (1)提出:全连接结构会引起参数数量的膨胀,易过拟合且局部最优;
    (2)多层的目的:一层卷积学到的特征往往为局部,层数越高,学习到的特征越全局化;
    (3)局部感知(又称局部感知野):滑动窗口(33,55,…),像素较远相关性弱,局部像素关联密切;
    参数共享:同一卷积核在图像中共享(可滑动);存在问题:提取特征不充分,可增加卷积核;
    池化采样层:max-pooling(average-pooling)压缩数据和参数数量,减少过拟合且为了保持某种不变性(旋转,平移,伸缩等);
    ① max-pooling:尽量保存边缘,提取出特征差异最大的值;
    ② average-pooling:进行模糊处理,全局信息都有贡献,更多的保留图像背景信息;
    (4)卷积后图像大小公式:
    输入:W*W
    Filter:F
    步长:S
    填充Padding:P
    公式:N= W F + 2 P S \frac{W-F+2P}{S} +1
    (5)激活函数:
    主流:加完Relu后加BN,尽可能保证每一层网络输入具有相同分布
    问题1:为何引入非线性激活函数?
    答:可逼近任意函数,例如sigmoid,tanh
    问题2:引入Relu原因?
    答:① 采用sigmoid函数,计算量大(指数),S(x)= 1 1 + e ( x ) \frac{1}{1+e^(-x)} ;
    Relu相对计算量小,f(x)=max(0,x);
    ② sigmoid反向传播易出现梯度消失情况(sigmoid趋于饱和时);
    ③ Relu使一部分神经元输出为0,造成网络稀疏性,减少了参数的相互依存关系,缓解了过拟合;
    ④ 分类层sigmoid原因:
    1)sigmoid可以把实数域光滑的映射到[0,1]空间,函数值可解释为属于正类的概率;2)sigmoid函数单调可导,导数形式简单;
    ⑤ 深度网络产生梯度消失原因,如何解决?
    原因:1)消失原因:将sigmoid作为中间层损失函数;
    2)爆炸原因:深层网络权值初始化值太大;
    解决:1)预训练+微调(无监督逐层预训练/DBN网络):先局部最优,再全局最优;
    2)梯度剪切(设置一个梯度剪切阈值,更新梯度,若梯度超过这个阈值,则限制此范围)
    (6)防止过拟合:L1,L2正则化,dropout(随机删除一些神经元),数据增强,划分数据集;

4. SQL

  1. 内外连接的区别:
    inner join ( left join / right join) / outer join
    inner join : A 和 B 获得的是A和B的交集(intersect),即韦恩图(venn diagram) 相交的部分.
    outer join : A和B获得的是A和B的并集(union), 即韦恩图(venn diagram)的所有部分.
    left join(左联接) : 返回包括左表中的所有记录和右表中联结字段相等的记录
    right join(右联接): 返回包括右表中的所有记录和左表中联结字段相等的记录
    inner join(等值连接): 只返回两个表中联结字段相等的行
  2. 增删改查基础语句:
    :在last_update后面新增加一列名字为create_date, 类型为datetime, NOT NULL,默认值为’0000 00:00:00’;
alter table actor add create_date datetime not null default '0000-00-00 00:00:00'

:删除emp_no重复的记录,只保留最小的id对应的记录;

delete from titles_test where id not in (select min(id) from titles_test group by emp_no)

更新:将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01;

update titles_test set to_date=null,from_date='2001-01-01' where to_date='9999-01-01'
  1. 其他:
    触发器:构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中;
create trigger audit_log after insert on employees_test
begin
     insert into audit values(new.id,new.name);
end;

修改表名:将titles_test表名修改为titles_2017;

alter table titles_test rename to titles_2017

所有表生成sql:针对库中的所有表生成select count(*)对应的SQL语句;

SELECT "select count(*) from " || name || ";" 
FROM sqlite_master WHERE type = 'table'

字符串查找:查找字符串’10,A,B’ 中逗号’,'出现的次数cnt;
replace(字符串,“需要替换的子串”,“用于替换子串的字符串”)

select length('10,A,B')-length(replace('10,A,B',',','')) as cnt

字符串截取:查询按照first_name最后两个字母,按照升序进行排列;
substr(字符串,起始位置,长度)

select first_name from employees 
order by substr(first_name, length(first_name)-1)

连接:按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees;
group_concat(X,Y):X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号;

select dept_no, group_concat(emp_no) employees from dept_emp group by dept_no
发布了2 篇原创文章 · 获赞 0 · 访问量 8

猜你喜欢

转载自blog.csdn.net/fengfeng_zhou/article/details/105603930