news 2026/4/3 5:44:55

数据科学家面试中我寻找的数学

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据科学家面试中我寻找的数学

原文:towardsdatascience.com/mathematics-i-look-for-in-data-scientist-interviews-7c7cb1aaebe5

作为过去几年在亚马逊参与招聘数据科学家和应用科学家的某人,无论是作为招聘经理、面试官还是面试者,我逐渐意识到,尽管大多数候选人熟悉最新的机器学习模型,但他们往往缺乏对数学、统计学和概率基础知识的扎实理解。这种科学知识基础广度的差距可能会限制他们有效地定义正确的假设以解决问题、收集正确的样本类型或解释他们科学工作的结果的能力。这就是我决定创建这篇帖子来解释数据科学家最常见的基础主题的原因。好消息是,即使对这些主题有一般的了解,也能使我们与其他候选人区分开来。这些数学技能是理解我们作为数据科学家每天遇到的问题的有力工具。通过构建这些肌肉并在一段时间内锻炼它们,我们将在整个职业生涯中受益。

我将这些基础数学主题分解为以下四个类别(这些类别并不总是相互排斥的):

  1. 统计学

  2. 微积分

  3. 线性代数

  4. 概率

我将在本文中分别介绍每个主题,然后通过一些 Python 示例来加深理解。鉴于本文将涵盖的主题范围广泛,我可能无法对某些主题进行深入探讨,而将引用其他深入探讨的帖子。

让我们开始吧!


1. 统计学

统计学是我们看到的新员工改进机会最多的领域。统计学使我们能够对数据进行推断,识别和量化各种变量之间的关系,并验证假设。我将涵盖统计学领域的三个主要方面,包括描述性统计、推断统计和抽样,并附上一些示例。例如,在数据科学面试中,我们可能会遇到需要找到数据中现有模式的情况,这需要描述性统计的基础。或者,在寻找问题区域属性的问题中,我们可以收集并依赖一个代表性的样本,这是推断统计的一部分。

让我们分别来看每一个。

1.1. 描述性统计

描述性统计帮助我们总结和描述(正如其名所示)数据集的主要特征。一些常见的度量包括平均值、中位数和标准差。让我们来看一个简单的例子:

# import librariesimportnumpyasnpimportpandasaspd
# create a datasetdata={'Values':[10,12,15,20,22,25,30,35,40,50]}
# create a dataframe of the datasetdf=pd.DataFrame(data)
# calculate descriptive statisticsmean=df['Values'].mean()median=df['Values'].median()std_dev=df['Values'].std()
print(f"Mean:{mean}")print(f"Median:{median}")print(f"Standard Deviation:{std_dev}")

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0665a123c6e5c4595f50fe08fbe19b01.png

如前所述,代码片段计算了平均值、中位数和标准差等描述性统计量,这些统计量用于总结数据,以便更好地理解它。

描述性分析中的一种流行方法被称为“单变量分析”,它涉及分析单个变量以总结其主要特征,如平均值、中位数、模型、范围、标准差等。我有一个关于这个主题的深入教程,所以在这里我不会涉及它,但你可以自由地查看下面的链接:

单变量分析 – 简介和实现

1.2. 推断统计

推断统计使我们能够通过对该总体(即所有数据)的较小样本进行推断。在大多数数据科学面试中,这通常是你会直接面对统计问题的地方(尽管你仍然需要间接依赖你对描述性统计学的知识)。例如,询问你对特定“假设”有多“自信”的问题与此部分相关。推断通常通过置信区间和假设检验等概念进行。这个领域可以相当广泛,所以我将包括一个例子,然后包括链接到其他深入探讨推断统计相关主题的帖子。

在下面的例子中,我们将计算平均值及其 95%置信区间。

# import librariesimportnumpyasnpimportscipy.statsasstats
# generate sample datanp.random.seed(0)data=np.random.normal(loc=20,scale=5,size=100)# mean=20, std_dev=5# calculate confidence interval for the meanconfidence_level=0.95mean=np.mean(data)sem=stats.sem(data)# standard error of the meanconfidence_interval=stats.t.interval(confidence_level,len(data)-1,loc=mean,scale=sem)# print resultsprint(f"Mean:{mean}")print(f"95% Confidence Interval:{confidence_interval}")

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7b90e2c74e2916ed4a7b3d917e2e83b3.png

结果表明,我们生成的数据集的平均值大约为 20.30。95%的置信区间意味着我们有 95%的信心认为真实总体的平均值位于 19.29 和 21.30 之间。我们假设我们的数据集是从更大的“总体”中抽取的“样本”。由于我们无法计算实际总体的平均值,我们依赖推断统计来告诉我们,基于这个小的样本,置信区间提供了一个可能包含实际总体平均值的范围。

在推断统计中,一种强大且流行的方法论被称为“多元分析”,它包括分析多个变量以同时理解它们之间关系的技术。我有一个关于这个主题的单独深入教程,所以在这里我不会涉及它,但我会在下面提供参考链接:

多元分析 – 超越一次分析一个变量

正如上面例子中看到的,采样是统计学中的一个关键关注领域,所以我们将在下一节讨论它。

1.3. 采样

抽样是统计学和数据科学的基础技术——我无法强调这个话题的重要性。在我的经验中,一些不太成功的候选人只是草草地浏览了他们的面试练习中的抽样部分,即使我们作为面试官试图引导他们关注抽样部分,他们也会说“我们只是收集一个随机样本”。虽然随机样本在某些时候可能是正确的做法,但它并不总是正确的解决方案。收集正确的样本可能是成功和失败项目之间的区别,因此科学团队非常重视它。

抽样用于从更大的“总体”中选择一个代表性的子集,称为“样本”。主要思想是,由于我们通常没有资源来评估整个总体,我们收集代表性的样本,并根据收集到的样本对总体的特征进行观察——而且效果非常好!

可用的抽样方法有很多,但让我们在这里介绍一些最常见的方法:

  • 简单随机样本或 SRS:这可能是每个人在听到抽样时首先想到的方法。这基本上意味着我们从总体中随机抽取一个样本,并认为它是代表性的。这意味着总体中的每个成员都有同等的机会被选中。有些情况下,这种方法并不理想。例如,假设我们有一个由个人组成的总体,其中 90%的人年龄在 50 岁以上,只有 10%的人年龄小于 50 岁。如果我们随机抽取 100 个样本,最终随机抽取了 95 个 50 岁以上的样本,这意味着我们的样本现在暗示有 95%的总体年龄超过 50 岁,但我们知道这不是真的。有一些抽样方法可以处理这类总体,我们将在下一部分讨论。

  • 分层样本:这意味着根据特定的特征将总体划分为不同的子群体——类似于我们上面的例子。因此,从每个子群体中分别抽取样本,以确保每个子群体都得到充分的代表。这当然要求我们了解现有的子群体。

  • 系统抽样:这是指选择一个随机起点,然后选择总体中每隔第 n 个成员。这种方法对于具有最小变化的大型总体来说效率很高。

如果你对抽样有更深入的了解感兴趣,我有一篇专门关于抽样的文章,你可以进一步阅读:

抽样——数据科学中的无名英雄

让我们一起来看一个简单的随机抽样示例:

# import librariesimportnumpyasnp
# creating a population of 1000 valuespopulation=np.arange(1,1001)
# select a random sample of 10 valuessample=np.random.choice(population,size=10,replace=False)print("Random Sample:")print(sample)

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ad209e3cc88f1969929fa5e791c6f12a.png

如代码所示,随机选择了一组 10 个值,因此从总体中选择哪些值没有规律可循,这使得它成为一个好的随机样本。

我们接下来将介绍微积分!


2. 微积分

微积分的概念是机器学习模型在训练过程中使用的各种优化策略中的主要主题之一。具体来说,正是通过微积分,我们可以开始理解输入变量的变化如何影响输出变量——有了这个知识,我们开发了各种训练和优化策略。

在开始考虑机器学习之前,微积分可能不是数据科学面试中的热门话题。机器学习模型本质上基于最小化或最大化一个给定的目标函数,这是一个优化任务。优化依赖于基础算法,如梯度下降,它本身基于导数。在今天的数据科学面试中,我们肯定会问到机器学习,这让我们回到了微积分的知识。

让我们看看两个最重要的主题:导数和梯度下降。

2.1. 导数

我知道不是每个人都对学习导数有美好的回忆,但它们对于更好地理解机器学习的训练和优化至关重要。导数表示函数相对于其变量的变化率——有人可能会说,如果你理解这个非常基本的概念,你就可以从头开始创建神经网络的反向传播,但我们现在有点超前了。在机器学习中,导数用于确定成本函数的斜率,这有助于我们找到最优模型。让我们看看 Python 中的实现。

# import librariesimportsympyassp
# define the variable x and function f(x)x=sp.Symbol('x')f=x**2+2*x+1print(f"f(x)={f}n")# calculate the derivativederivative=sp.diff(f,x)print("Derivative of f(x):")print(derivative)

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dc303a0f5940e98f9ed6f852c2c599dd.png

根据我对导数的记忆,结果看起来是正确的。

2.2. 梯度下降

梯度下降,你可能已经在神经网络的环境中听说过,是一种迭代优化算法,用于最小化目标函数(这将是模型训练的目标)。这个想法相当简单,我在这个定义中进一步简化了它,但通过计算导数(或梯度),我们可以朝着减少误差的方向迈出步伐。如果我们迈出足够多的步伐,最终我们将收敛到最优解。

为了更好地理解它,我们可以在 Python 中将其可视化。让我们回到之前的例子f(x) = x² + 2*x + 1,目标是使用梯度下降找到最小值。

# import librariesimportnumpyasnpimportmatplotlib.pyplotasplt
# define function and its derivativedeff(x):returnx**2+2*x+1defdf(x):return2*x+2# gradient descent parametersx=5# initial guess (or sometimes called a seed)learning_rate=0.05n_iterations=50# perform gradient descentx_values=[x]for_inrange(n_iterations):gradient=df(x)x=x-learning_rate*gradient x_values.append(x)# plot the function and descent pathx_range=np.linspace(-6,4,100)y_range=f(x_range)plt.plot(x_range,y_range,label='f(x) = x² + 2x + 1')plt.scatter(x_values,[f(i)foriinx_values],color='red')plt.title('Gradient Descent Visualization')plt.xlabel('x')plt.ylabel('f(x)')plt.legend()plt.show()

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8be1a210f3ff8b83ee6167fcbeb085a1.png

梯度下降的可视化

这是一个简单的函数,所以我们知道最小值会在x = -1,但我们假设我们没有这个信息,所以从x = 5开始。然后通过梯度下降的过程,以0.05的学习率,经过50次迭代,过程最终从x = 5移动,越来越接近x = -1的最小值。令人印象深刻!

接下来,让我们继续学习线性代数。


3. 线性代数

线性代数是处理向量、矩阵及其之间运算的数学分支。这些主题可能看起来很基础,但它们是许多机器学习模型(如神经网络)的真正基础,而神经网络是目前数据科学角色中最受欢迎的领域之一。我们在数据科学面试中遇到的许多机器学习模型和算法,如强化学习,都是使用向量、矩阵及其运算实现的,这些内容我们将在本节中介绍。

让我们简要地定义这些概念,然后看看一些例子。

3.1. 向量和矩阵

这些用于表示数据集或在更高级的上下文中表示嵌入。当涉及到矩阵和机器学习模型的实现时,行通常对应于单个数据点,而列通常表示特征。让我们看一个例子。

# import librariesimportnumpyasnp# define a vectorvector=np.array([1,2,3])print("Vector:")print(f'{vector}n')# define a matrixmatrix=np.array([[1,2,3],[4,5,6],[7,8,9]])print("Matrix:")print(matrix)

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/844b740f2bf5fa050e91c7ceb3768395.png

你可以看到向量在一行中,而矩阵有三行三列

3.2. 矩阵运算

现在我们已经知道了如何定义矩阵,是时候开始使用诸如乘法(用于组合矩阵或转换它们)、转置(翻转矩阵过其对角线以交换行和列)和求逆(找到一个矩阵,当与原始矩阵相乘时,得到单位矩阵,主对角线上的元素为 1,其他地方为 0)等运算来操作它们了。我们将在下面的例子中看到这些:

# import librariesimportnumpyasnp# create matricesA=np.array([[1,2],[3,4]])B=np.array([[5,6],[7,8]])print("Matrix A:")print(A)print()print("Matrix B:")print(B)print()# multiplicationC=np.dot(A,B)print("Matrix C (Multiplication Result):")print(C)print()# transpositionA_transpose=np.transpose(A)print("Transpose of Matrix A:")print(A_transpose)print()# inversionA_inverse=np.linalg.inv(A)print("Inverse of Matrix A:")print(A_inverse)print()# verify inversionD=np.dot(A,A_inverse)print("Multiplication of A and its inverse:")print(D)

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f985b983c2f4d7832dbe6cd9eb4ae97a.png

如我们所见,矩阵 C 是矩阵 A 和 B 的乘积结果。然后我们看到如何通过转置矩阵 A 将矩阵翻转过其对角线(注意 2 和 3 的位置发生了变化),最后我们看到当我们乘以矩阵 A 和它的逆矩阵时,我们得到单位矩阵,有一些舍入误差。

3.3. 特征值和特征向量

特征值是数字(或标量),它们指示向量在线性变换中缩放(或拉伸)的程度,而不改变其方向。另一方面,特征向量是在应用线性变换时方向保持不变的向量。如果你没有完全理解这一点,不要担心,因为它们的应用比纯概念更重要。这些在降维练习中非常有用,例如主成分分析或 PCA,这是在数据集或机器学习模型中识别最重要的特征所使用的许多技术之一。我有一个关于这个主题的完整教程,所以这里不会深入细节,但我将提供一个示例供参考。以下是 PCA 教程:

主成分分析——动手教程

# import librariesimportnumpyasnp# define a matrixA=np.array([[3,1],[1,3]])# calculate eigenvalues and eigenvectorseigenvalues,eigenvectors=np.linalg.eig(A)print("Eigenvalues:")print(eigenvalues)print()print("Eigenvectors:")print(eigenvectors)

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fb66b0f47c552427bcf497f639eeb150.png

最后,我们将介绍概率。


4. 概率

让我们面对现实——企业处理不确定性,并雇佣我们作为科学家来帮助他们通过预测和预报来更好地准备应对这种不确定的未来。因此,在各个面试中,对处理不确定性和预测的问题有很大重视——概率提供了理解不确定性的基础。

这无论是在传统意义上,比如在股市或库存管理中进行时间序列预测,还是在更近期的语境中,如大型语言模型(LLMs),其中每个标记都是基于过去的标记以路径依赖的方式预测的,概率都帮助数据科学家理解不确定性、模型随机性,并最终做出预测。对于本节,我选择了两个主要主题来讨论——让我们开始吧。

4.1. 概率分布

概率分布,如正态分布、二项分布、均匀分布等,描述了数据点的分布情况。如果我们看到数据的分布,我们就可以对数据及其行为做出更好的预测。如果你要学习一个分布,先学习“正态”分布。让我们首先生成一个正态分布,然后我们可以更详细地讨论其特征。

# import librariesimportnumpyasnpimportmatplotlib.pyplotasplt# generate a normal distributionmean=0std_dev=1samples=np.random.normal(mean,std_dev,1000)# plot histogramplt.hist(samples,bins=30,density=True)plt.title('Normal Distribution')plt.xlabel('Value')plt.ylabel('Frequency')plt.show()

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0c293ae8b8c246dabea13b87221c6d42.png

正态分布的可视化

上述通用的外观就是我们认为是正态分布,它有几个重要的特征:

  1. 对称性:分布在均值周围是对称的(在上面的例子中是 0)——这意味着均值的左侧看起来与均值的右侧对称

  2. 均值、中位数、众数相等:在正态分布中,均值、中位数和众数都相等,并且位于分布的中心。均值是平均值,中位数是在数据集按值排序(升序或降序)时的中间值,众数是数据集中出现频率最高的值。

  3. 68, 95, 99.7 规则(又称经验规则):这是一个重要且有用的规则。它意味着大约 68% 的数据落在均值的一个标准差范围内,95% 的数据落在两个标准差范围内,99.7% 的数据落在三个标准差范围内!我将在下面的图表中展示这一点。

# import librariesimportnumpyasnpimportmatplotlib.pyplotasplt# generating a normal distributionmean=0std_dev=1samples=np.random.normal(mean,std_dev,1000)# defining standard deviation rangesx=np.linspace(mean-4*std_dev,mean+4*std_dev,1000)y=(1/(std_dev*np.sqrt(2*np.pi)))*np.exp(-0.5*((x-mean)/std_dev)**2)plt.plot(x,y,color='black')# adding horizontal lines for the 68-95-99.7 ruleplt.axvline(mean-std_dev,color='blue',linestyle='--',linewidth=1,label='68% of data (±1 SD)')plt.axvline(mean+std_dev,color='blue',linestyle='--',linewidth=1)plt.axvline(mean-2*std_dev,color='green',linestyle='--',linewidth=1,label='95% of data (±2 SD)')plt.axvline(mean+2*std_dev,color='green',linestyle='--',linewidth=1)plt.axvline(mean-3*std_dev,color='red',linestyle='--',linewidth=1,label='99.7% of data (±3 SD)')plt.axvline(mean+3*std_dev,color='red',linestyle='--',linewidth=1)# plotplt.title('68-95-99.7 Rule')plt.xlabel('Value')plt.ylabel('Density')plt.legend(loc='upper right')plt.show()

结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/aa547df030aaad3f7a317a8a17207795.png

正态分布的 68–95–99.7 规则

上述内容展示了当我们远离均值时,分布中覆盖的数据越来越多,对应于 1 个标准差为 68%,2 个标准差为 95%,3 个标准差为 99.7%。

接下来我们将讨论条件概率。

4.2. 贝叶斯定理

这个定理是概率论中最重要且最被低估的理论之一。这个想法非常简单——它提供了一种根据新的证据更新假设概率的方法。让我们考虑一个例子。假设我今天下午 6 点要和名叫约翰的堂兄见面。那么你认为约翰开特斯拉去那里的概率是多少?你可以开始做出假设,然后得出一个概率。现在假设我会给你一个提示,这在贝叶斯定理的文献中被称为“证据”,即约翰今年 75 岁。如果我告诉你我的堂兄约翰只有 15 岁,还在上高中呢?每个陈述如何改变你的答案?正如你所看到的,我们将根据提供给我们的新“证据”调整概率。贝叶斯定理如下形式化这种概率思维:

P(A|B) = (P(B|A) * P(A)) / P(B)

  • P(A|B):在 B 为真的条件下事件 A 发生的概率(后验)。

  • P(B|A):在 A 为真的条件下事件 B 发生的概率。

  • P(A):事件 A 发生的概率(先验)。

  • P(B):事件 B 发生的概率(证据)。

我在下面的文章中深入探讨了贝叶斯优化在机器学习问题超参数优化中的应用,所以这里不再赘述。

使用贝叶斯优化进行超参数优化——简介和分步实现…


结论

在这篇帖子中,我们讨论了统计学、微积分、线性代数和概率在数据科学家日常工作中重要性。这四个领域是数学中数据科学家可以建立优秀基础的四个领域,这将在其职业生涯中带来回报。在每一个领域,我们都探讨了其中一些最重要和最常用的概念,然后一起看了例子。


感谢阅读!

如果你觉得这篇帖子有帮助,请在 Medium 上关注我并订阅,以接收我的最新帖子!

(除非另有说明,所有图片均由作者提供。)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/3 10:06:52

FLUX.1-dev开箱体验:永不爆显存的AI绘图神器

FLUX.1-dev开箱体验:永不爆显存的AI绘图神器 在RTX 4090D成为主流创作卡的当下,一个反常识的现象正在发生:显存越大,越不敢轻易点下“生成”按钮。不是因为模型跑不起来,而是怕它中途崩掉——那句刺眼的 CUDA out of …

作者头像 李华
网站建设 2026/3/27 21:18:48

如何用1个工具搞定10个平台直播?多平台直播推流效率提升指南

如何用1个工具搞定10个平台直播?多平台直播推流效率提升指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 多平台直播推流已成为内容创作者扩大影响力的必备技能&#xff…

作者头像 李华
网站建设 2026/4/3 5:00:03

3步解锁游戏资源:从入门到精通的XNB文件处理完全指南

3步解锁游戏资源:从入门到精通的XNB文件处理完全指南 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli 概念解析:揭开XNB文件处理的神秘面…

作者头像 李华
网站建设 2026/3/31 1:36:20

DCT-Net人像卡通化入门必看:零基础上传照片秒出卡通图

DCT-Net人像卡通化入门必看:零基础上传照片秒出卡通图 1. 为什么你该试试这个卡通化工具? 你有没有过这样的想法:随手拍的一张自拍照,要是能立刻变成漫画主角、游戏头像或者社交平台的个性封面,该多酷?不…

作者头像 李华