算法题整理(待更新,不全面)
1. 分类与回归的区别
回归:输入变量与输出变量均为连续变量的预测问题(预测结果为某一值,该值有无限种可能);
分类:输出变量为有限个离散变量的预测问题(预测结果范围只有几个值或多个值);
2. 归一化和标准化的区别
归一化:将训练集中某一列数值特征xi(设第i列)的值缩放到0-1之间
标准化:将某一列值缩放成均值为0,方差为1(
)
好处:① 提升模型精度;② 提升收敛速度;
问题1:
问:逻辑回归必须归一吗?
答:看是否用正则,用正则则需要;
问:Why?
答:加上正则后,损失函数除了度量预测与真实差距,还要度量参数值k是否足够小(y=kx);若不同特征数值范围不一样,有的0-0.1,有的100-10000,那么特征对应的参数大小级别也不一样;在L1正则时,只是将参数的绝对值相加,导致L1只会对级别大的参数有作用;
问题2:
问:标准化对逻辑回归的好处?
答:标准化后,得出的参数值大小可反映出不同特征对样本label的贡献度,方便对特征进行筛选;
注:应将测试集拆分,不要在整个数据集上标准化;
3. 神经网络
- 反向传播的思想:
计算输出与标签之间的损失值,然后计算其相当于每个神经元的梯度,根据梯度方向更新权值;
(1)将训练集输入到ANN输入层,经过隐藏层达到输出层并输出结果(前向);
(2)计算ANN估计值与实际值之间的误差,并将误差反向传播,直至传入至输入层;
(3)反向传播过程中,根据误差调整各种参数的值,不断迭代,直至收敛; - CNN:
(1)提出:全连接结构会引起参数数量的膨胀,易过拟合且局部最优;
(2)多层的目的:一层卷积学到的特征往往为局部,层数越高,学习到的特征越全局化;
(3)局部感知(又称局部感知野):滑动窗口(33,55,…),像素较远相关性弱,局部像素关联密切;
参数共享:同一卷积核在图像中共享(可滑动);存在问题:提取特征不充分,可增加卷积核;
池化采样层:max-pooling(average-pooling)压缩数据和参数数量,减少过拟合且为了保持某种不变性(旋转,平移,伸缩等);
① max-pooling:尽量保存边缘,提取出特征差异最大的值;
② average-pooling:进行模糊处理,全局信息都有贡献,更多的保留图像背景信息;
(4)卷积后图像大小公式:
输入:W*W
Filter:F
步长:S
填充Padding:P
公式:N= +1
(5)激活函数:
主流:加完Relu后加BN,尽可能保证每一层网络输入具有相同分布
问题1:为何引入非线性激活函数?
答:可逼近任意函数,例如sigmoid,tanh
问题2:引入Relu原因?
答:① 采用sigmoid函数,计算量大(指数),S(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
- 内外连接的区别:
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(等值连接): 只返回两个表中联结字段相等的行 - 增删改查基础语句:
增:在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'
- 其他:
触发器:构造一个触发器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