数据分析面试题——技术类

1. 给你一个无序数组,怎么才能合理采样?
无序数组是相对有序数组而言的,无序数组并不等于随机,我们要做的是将无序数组洗牌,得到随机排列。
对于无序数组,n个元素能产生n!种排序。如果洗牌算法能产生n!种不同的结果,并且这些结果产生的概率相等,那么这个洗牌算法是正确的。
方法:for i in range(len(n)): swap(arr[i], arr[random(i,n)])
这段代码是对随机确定数组第一位的值,然后递归对剩余的数组进行相同的过程,可以产生n!中等可能的排序情况。
https://blog.youkuaiyun.com/rtian001/article/details/50348999

2. 常用的Python库有哪些?
numpy:矩阵运算
sklearn:常用机器学习和数据挖掘工具库
scipy:基于numpy做高效的数学计算,如积分、线性代数、稀疏矩阵等
pandas:将数据用表的形式进行操作
matplotlib:数据可视化工具
seaborn:数据可视化工具
keras/tensorflow/theano:深度学习工具包
NLTK:自然语言处理工具包
beautifulsoap:网页文档解析工具

3. 行存储和列存储的区别。(列式数据库,更符合人类阅读习惯)
(1)行存储:传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在。传统数据库的存储方式,同一张表内的数据放在一起,插入更新很快。缺点是每次查询即使只涉及几列,也要把所有数据读取. 对此,行式数据库给出的优化方案是加“索引”,在OLTP( 联机事务处理)类型的应用中,通过索引机制或给表分区等手段,可以简化查询操作步骤,并提升查询效率。

  • 适用场景:
    1、适合随机的增删改查操作;
    2、需要在行中选取所有属性的查询操作;
    3、需要频繁插入或更新的操作,其操作与索引和行的大小更为相关。

(2)列存储:列式存储(Column-based)是相对于行式存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列为基础逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。OLAP(联机分析处理)等情况下,将数据按照列存储会更高效,每一列都可以成为索引,投影很高效。缺点是查询是选择完成时,需要对选择的列进行重新组装。
在这里插入图片描述

  • 适用场景:
    1、查询过程中,可针对各列的运算并发执行(SMP),最后在内存中聚合完整记录集,最大可能降低查询响应时间;
    2、可在数据列中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描;
    3、因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。

4. K-Means算法原理及改进,遇到异常值怎么办?评估算法的指标有哪些?

  • k-means原理:
    在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。
    改进:
    a. kmeans++:初始随机点选择尽可能远,避免陷入局部解。方法是n+1个中心点选择时,对于离前n个点选择到的概率更大
    b. mini batch kmeans:每次只用一个子集做重入类并找到类心(提高训练速度)
    c. ISODATA:对于难以确定k的时候,使用该方法。思路是当类下的样本小时,剔除;类下样本数量多时,拆分
    d. kernel kmeans:kmeans用欧氏距离计算相似度,也可以使用kernel映射到高维空间再聚类
  • 遇到异常值:
    a. 有条件的话使用密度聚类或者一些软聚类的方式先聚类,剔除异常值。不过本来用kmeans就是为了快,这么做有些南辕北辙了
    b. 局部异常因子LOF:如果点p的密度明显小于其邻域点的密度,那么点p可能是异常值
    c. 多元高斯分布异常点检测
    d. 使用PCA或自动编码机进行异常点检测:使用降维后的维度作为新的特征空间,其降维结果可以认为剔除了异常值的影响(因为过程是保留使投影后方差最大的投影方向)
    e. isolation forest:基本思路是建立树模型,一个节点所在的树深度越低,说明将其从样本空间划分出去越容易,因此越可能是异常值。是一种无监督的方法,随机选择n个sumsampe,随机选择一个特征一个值。iTree能有效检测异常的假设是:异常点一般都是非常稀有的,在iTree中会很快被划分到叶子节点,因此可以用叶子节点到根节点的路径h(x)长度来判断一条记录x是否是异常点;
    f. winsorize:对于简单的,可以对单一维度做上下截取
    异常值检测的6个算法:https://blog.youkuaiyun.com/smileyan9/category_10026084.html
  • 评估聚类算法的指标:
    a. 外部法(基于有标注):Jaccard系数、纯度
    b. 内部法(无标注):内平方和WSS和外平方和BSS
    c. 此外还要考虑到算法的时间空间复杂度、聚类稳定性等
    数据集 D = { x 1 , x 2 , . . , x m } D=\lbrace x_1,x_2,..,x_m \rbrace D={ x1,x2,..,xm},假定通过聚类给出的簇划分为 C = { C 1 , C 2 , . . , C k } C=\lbrace C_1,C_2,..,C_k \rbrace C={ C1,C2,..,Ck},参考模型给出的划分簇 C ∗ = { C 1 ∗ , C 2 ∗ , . . , C s ∗ } C^*=\lbrace C_1^*,C_2^*,..,C_s^* \rbrace C={ C1,C2,..,Cs},令 λ , λ ∗ \lambda,\lambda^* λ,λ分别表示 C , C ∗ C,C^* C,C对应簇的标记向量。我们将样本两两配对考虑。
    a = ∣ S S ∣ , S S = ( x i , x j ) ∣ λ i = λ j , λ i ∗ = λ j ∗ , i < j a=|SS|,SS={(x_i,x_j)|\lambda_i=\lambda_j,\lambda_i^*=\lambda_j^*,i<j} a=SS,SS=(xi,xj)λi=λj,λi=λj,i<j
    b = ∣ S D ∣ , S D = ( x i , x j ) ∣ λ i = λ j , λ i ∗ ≠ λ j ∗ , i < j b=|SD|,SD={(x_i,x_j)|\lambda_i=\lambda_j,\lambda_i^*\neq\lambda_j^*,i<j} b=SD,SD=(xi,xj)λi=λj,λi=λj,i<j
    c = ∣ D S ∣ , D S = ( x i , x j ) ∣ λ i ≠ λ j , λ i ∗ = λ j ∗ , i < j c=|DS|,DS={(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda_i^*=\lambda_j^*,i<j}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值