目录
正在加载目录...

DRW 26 Quant OA 面经|Codility 两道题 80 分钟,比想象中简单

DRW 26 Quant OA 做完了,Codility 平台,80 分钟两道 task。说实话比我预想的简单,做了一会儿就交卷了——两道都是统计和 sklearn 的基本功题,没有算法竞赛那套,趁热把两道题的题面和思路记下来。

OA 形式

平台是 Codility,80 分钟,两道 task,Python 环境。第二道题需要下载 zip 数据集,在本地或环境里跑,题目会给明确的参数要求。两道题的共同特点是:题面把要求写得非常细,你照着做就行——难点不在思路,在于按题目字面要求把返回格式和参数配置准确对上。

Task 1:判断随机变量是否独立

题意

给一个 distr_table,里面是两个随机变量 X 和 Y 的联合概率分布,格式类似:

| X | Y | pr   |
| 0 | 1 | 0.30 |
| 0 | 2 | 0.25 |
| 1 | 1 | 0.15 |
| 1 | 2 | 0.30 |

第三列的概率加起来等于 1。举例来说,P(X=0 ∧ Y=1) = 0.3,P(Y=1) = 0.3 + 0.15 = 0.45。

要求写一个 check_independence 方法,对给定的 distr_table 返回一个长度为 3 的字典:第一个键 are_independent 是布尔值,表示 X 和 Y 是否独立;另外两个是协方差和相关系数。

独立的定义:对 X 的每个可能取值 x 和 Y 的每个可能取值 y,都满足 P(X=x ∧ Y=y) = P(X=x) × P(Y=y)。

DRW 26 Quant OA 面经|Codility 两道题 80 分钟,比想象中简单

思路

纯按定义做,没有技巧。

先从联合分布算出边缘分布——把表按 X 分组求和得到 P(X),按 Y 分组求和得到 P(Y)。然后遍历每一对 (x, y),检查联合概率是否约等于 P(x) × P(y)——注意用浮点容差比较,别直接用等号,这是最容易挂的地方。所有对都满足才返回 True。

协方差按题目给的公式算:Cov(X,Y) = E[XY] − E[X]E[Y],其中 E[XY] 是遍历所有 (x,y) 求 x×y×p(x,y) 的和。相关系数就是协方差除以两个标准差的乘积,标准差从各自的边缘分布算方差再开根。

Task 2:文档聚类

题意

数据集在 data 文件夹里,是一个字典,包含三个键:id(文档 id)、vectors(doc2vec 算出的 100 维文档向量)、group(文档所属组,0 到 9 的整数)。

要求写一个 cluster_articles 函数,参数是 data(和上面结构相同的字典),用 sklearn 的 kmeans 对文档向量做聚类,参数明确指定:n_clusters = 10、random_state = 2、tol = 0.05、max_iter = 50,其余参数保持默认。返回一个 dict,包含聚类信息。

DRW 26 Quant OA 面经|Codility 两道题 80 分钟,比想象中简单

思路

也是照着做,没有发挥空间:

直接用 sklearn 的 KMeans,参数严格按题目给的填——random_state = 2 这类参数一个都不能改,改了结果对不上就挂。

聚类完之后统计各簇的样本数,用 numpy 的 bincount 一行搞定。

PCA 降维那部分用 sklearn 的 PCA,按要求的维度做。

聚类质量指标用 sklearn.metrics 里的函数,拿聚类标签和真实的 group 标签做对比——这类任务常用的是 adjusted_rand_score 或 normalized_mutual_info_score,题目要哪个就调哪个。

整题就是调包的活,关键是参数和返回格式逐字对齐题面。

写在最后

北美八月开始各家 OA 陆续发了,我这段时间刷了不少(TikTok、高盛、Google、Amazon、摩根大通这些)。量化这条线的题池在 InterviewShow 有比较全的收录,DRW 这种统计加 sklearn 混合的题型也有分类。刷多了会发现各家题池重合度不低,摸清套路比死磕单题有用得多,有需要的可以去看看。

END