一、手写堆栈(空间复杂度为O(n))
二、讲述一下python的(GIL锁)
- python中可以通过多进程、多线程和多协程来实现多任务,在多线程的实现过程中,为了避免出现资源竞争问题,可以使用互斥锁来使线程同步(按顺序)执行。 其实Python的CPython(C语言实现的)解释器上有一把GIL锁,也就是说Python的程序是处于一个解释器锁的环境中的。
- GIL:也成全局解释器锁,python的多线程称为“伪多线程”,逃不过GIL解释器锁,GIL的存在,python在同一时刻只有一个线程会执行
- 线程是CPU调度和分派的基本单位,python中的多线程由于GIL锁的存在无法使用多核CPU
- python的多线程不适合计算密集型的程序,适合IO密集型程序
- 改善:更新python解释器版本、计算密集型的程序用多进程替代(增强硬件)
三、讲述一下线性回归和逻辑回归的联系
- 二者都是广义的线性模型
- 线性回归预测的连续值,而逻辑回归给出的“是”和“否”的回答
- 逻辑回归的模型是非线性模型,sigmoid模型,本质上又是一个线性回归模型,因为除去sigmoid映射函数关系,其它步骤,算法都是线性回归,逻辑回归可以轻松处理0/1分类问题
- 线性回归是以高斯分布为误差分析模型,逻辑回归采用的是伯努利分布分析误差
- 线性回归,目的是预测,函数是拟合函数,参数计算是最小二乘。逻辑回归,目的是分类,函数是预测函数,参数计算最大似然估计
四、逻辑回归的原理
- 假设函数服从伯努利分布,通过极大化似然函数,运用梯度下降来求解参数,达到二分类目的
- 对数几率函数:sigmoid函数
- 极大似然法进行参数估计
- 逻辑回归的损失函数
- 梯度下降法
五、GBDT的原理
- 回归算法选择的损失函数一般为均方差(最小二乘)或者绝对值误差
- 预测值=均值+残差
- 步骤
1.初始化残差,构成弱学习器1。(预测特征所对应得特征值求平均值)
2.计算残差(实际值 - 弱学习器1)。
3.寻找回归树的最佳划分点(阈值)。遍历每个特征的每个特征值作为阈值,通过阈值将数据二分,分别计算方差,找到使方差最小的特征值为最佳二分阈值
4.将二分后的残差值更新为实际值,计算实际值平均值 作为残差。构成弱学习器2。
5.合并强学习器。(弱学习器1 + 弱学习器2)
6.满足条件迭代停止
六、使用过sql-lab数据库没?
七、jieba库分词的原理
- 中文文本分词的第三方库
- 利用一个中文词库,确定汉字之间的关联概率,通过计算汉字间的概率,汉字词概率大的组成词组,形成分词结果,还可以添加自定义的词组
- 子代dict.txt的词典
- 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况构成的有向无环图(DAG)
- 未登录词,采用汉字成词能力的HMM模型,使用Viterbi算法