面试梳理
线性回归算法的基本原理
概念: 线性回归模型试图学得一个通过特征的线性组合来进行预测的函数.如果特征和结果都满足线性, 即不大于一次方, 系数确定之后, 那么模型就得以确定.许多功能更为强大的非线性模型可在线性模型的基础上,通过引入层级结构或高维映射而得.
实现: 1. 最小二乘法
选择未知参数, 使得理论值与观测值之差的平方和(也就是方差)最小. 适用于模型方程存在解析解的情况.
实现: 2. 梯度下降法
如果一个函数不存在解析解, 只能通过数值解(迭代式的)去逼近真实解. 梯度下降法比最小二乘法适用性更强.
直观解释: 比如我们在一座大山上, 不知道怎么下山, 于是决定走一步算一步, 每走一步的时候, 求解当前的梯度(函数下降最快的地方), 沿着梯度的负方向, 也就是当前最陡峭的位置往下走一步, 然后继续求解当前位置的梯度. 这样一步一步地往下走下去.
结论: 梯度下降法不一定能找到全局最优解, 有可能是一个局部最优解. 但如果损失函数(就是还没有求得相关系数的回归模型)是一个凸函数, 那么梯度下降法得到的解就一定是全局最优解.
Hbase利用ES建立二级索引
Hbase中有个组件叫comprocessor(协处理器), 当客户端去访问表中的数据时, 会先经过协处理器. 协处理器中有回掉方法: 当你调取数据时, 会先经过协处理器, 然后再返回给客户端.
二级索引: 查询Hbase表中数据, 可以通过rowkey直接查询, 或者通过scanner扫描数据,再进行行键或列值过滤, 如果查询的维度比较复杂, 以上两种查询方式满足不了要求, 则需要建立二级索引.
利用es建立二级索引: 利用协处理器把需要查询的表, 列族, 列, 以及rowkey封装存到es中, 当客户端查询数据时, 先到es中根据列值找到rowkey, 再通过rowkey在hbase表中进行毫秒级查询.
CAS算法的原理
在没有线程被阻塞的情况下实现变量的同步.
CAS是一种乐观锁技术, 当多个线程尝试使用CAS同时更新同一个变量时, 只有其中一个线程能更新变量的值, 其他线程失败, 当失败的线程并不会被挂起, 而是被告知此次竞争失败, 并可以再次尝试.
优点: 无锁, 提高程序的性能, 避免了线程之间的切换所带来的消耗,
缺点: 循环比较, 消耗cpu资源; 只能保证一个共享变量的操作; 有可能出现ABA问题.
ABA问题: CSA算法的一个重要前提是需要取出内存中某时刻的值, 并在当前时刻比较并交换, 那么这个时间差会导致数据的变化. 比如一个线程one从内存中取出A, 这时候线程two也从内存中取出A, 并且two线程进行cas操作将A变成B, 然后又将B变成A. 这个时候线程one进行CAS操作, 发现值仍然是A, 然后one线程CAS操作成功.这就导致了ABA问题.
NIO同步非阻塞IO, avro序列化机制, avro调用rpc框架的原理
NIO: NIO中除了select方法是同步的, 其余的都是非阻塞方法(connect, accept, read,write), 所以叫同步非阻塞. NIO是基于缓冲和通道的, 所以可以定位数据. 传统的IO是单向的, 而NIO中的通道是双向的, NIO中有个组件叫选择器selector, 每个客户端连接需要到选择器中注册连接, 并告知选择器将要进行什么操作, 然后, 服务端要在循环遍历选择器中的所有连接, 如果这个连接是read,就执行read的方法, 如果是write, 就执行写的方法.
优点: 可以用少量线程去处理大量的客户端连接
缺点: 不能处理大量数据.
avro序列化机制: 根据模式文件来序列化, 这个模式文件用json格式表示. 利用avro的插件可生成对应的类, 这个类可利用avro的API序列化和反序列化.
avro调用rpc框架: RPC设计的目的在于可以让调用者像以本地的方式调用远程服务, 具体的实现方式是调用接口的方式来调用, 如果我们用java语言, 则底层通过jdk动态代理方式生成接口的代理类, 代理类中封装了与远程服务通信的细节.一旦确定了消息的数据结构, 下一步考虑的是序列化与行序列化, 这里使用avro来进行序列化操作. 序列化好后, 要进行通信了, RPC框架的底层是基于NIO来通信的.
总结: 一个确定好数据结构的数据, 首先要进行avro序列化, 然后通过NIO进行通信.
2PC和Paxos算法
2PC: 二阶段提交算法, 类似与投票, 选举两个过程. 比如,我要发起一个提交的请求, 参与者接受请求之后,向组织者发送一个回执, 组织者如果收到所有参与者的回执,则提交成功, 如果有一个回执没有收到, 则提交不成功.
优点: 原理简单, 实现方便
缺点: 同步阻塞, 单点问题, 太过保守
Paxos算法: 类似与2PC, 但是引入了过半性的原理(少数服从多数), 并且支持节点角色之间的轮换
zookeeper底层采用的就是Paxos算法.
纠删码技术
对于分布式环境下, 数据存储的可靠性保证有两种方式:
1. 副本冗余机制
2. 纠删码
纠删码: 通过在原始数据中加入新的校验数据, 使得各个部分的数据产生关联. 在一定范围内的数据出错的情况下, 可以通过纠删码进行数据的恢复.
逻辑回归
逻辑回归中有个重要的函数, sigmod, 它可以将变量映射到0和1之间, 我们可以将其视为类1的后验概率估计, 就是说我们用这个函数算出来的结果来当作这个点属于类别1的概率, 如果这个值大于等于0.5, 我们就归为类别1; 如果小于0.5, 我们就归为类别0.
然后计算这个函数的损失函数, 再用梯度下降法计算出参数, 从而得出这个逻辑回归模型.
案例: 比如交通事故, 特征量是一个人的年龄, 视力情况, 驾车教育, 因变量是去年是否发生过事故.
相似度的计算
利用夹角余弦: 即将物品或用户作为坐标上的点与特定的被计算目标进行夹角计算. 相当于两条射线和分别从坐标原点触发, 引出一定角度, 如果两个目标较为相似, 则夹角比较小, 使用余弦计算的相似度计算值就比较大.
协同过滤
利用大量已有的用户偏好来估计用户对其未接触的物品的喜好程度. 其内在思想就是相似度的定义.
基于用户的方法中: 如果两个用户表现出相似的爱好, 那么就认为他们的兴趣类似. 要对他们中的一个用户推荐一个未知物品, 便可选取若干与其类似的用户并根据他们的喜好计算出对各个物品的综合得分, 再根据此得分来为当前用户推荐商品.
总结: 如果其他用户也偏好这些物品, 那么这些物品就是值得被推荐的
基于物品的方法中: 根据现有用户对物品的喜好程度, 来计算物品之间的某种相似度. 如果某个用户接触了一个商品, 那么系统会找出和这个商品相似度相似的商品, 然后把这些商品推荐给用户.
ALS
在机器学习中, ALS特指使用交替二乘法求解的一个协同过滤算法.
我们在实现推荐系统的时候, 当要处理的那些数据是由用户自身所提供的偏好数据时, 这些数据可以转化成以用户为行, 物品为列的二维稀疏矩阵.这个稀疏矩阵中大量的未知元是我们想推断的,可以通过ALS算法计算得出.
交替最小二乘法: 这个稀疏矩阵拆解为两个因子矩阵(用户因子矩阵和物品因子矩阵). 在MLlib的ALS算法中,首先对用户因子矩阵或者物品因子矩阵随机化生成, 在每一次迭代时, 固定住这个因子矩阵,然后用这个固定的因子矩阵和稀疏矩阵中的已知数据去更新另一个矩阵, 然后利用被求取的矩阵对象去随机化矩阵. 最后两个对象相互迭代计算, 直到模型收敛.