量子机器学习 101
如果你认为 ML 很有趣,那么 Q ML 来了!
在量子机器学习(QML)领域已经做了很多工作,这个博客只是给你一个简短的 10 分钟介绍 QML 的世界。因此,这本书对你来说应该只是一个有趣的读物,而我计划写一个关于 QML 的更系统更深入的系列教程。
经典计算机是通用的,因为它们可以实现任何逻辑运算,而量子计算机是通用的,因为一组量子位上的任何量子态都可以转换成任何其他量子态。量子(电路)计算可行性的许多良好的早期希望来自索洛维-基塔耶夫定理,在非常广泛的条件下(神经元/门&普适函数/状态近似的有限性)可以等同于深度学习的普适近似定理。
伊辛模型和哈密顿量
简单来说,伊辛模型是一种表示体系内相变和相互作用的数学模型【1】【2】。这种系统在任一点的能量由该点的各自的哈密顿量(方程式)给出。
比如说在图 1 中。下面,我们有一个 4X4(点阵)矩阵系统。每个单元处于两种可能状态之一(比如+1,-1)。假设每个单元只有四个相邻(上、左、右、下)单元,如果存在的话。
所以 6 的相邻单元格是 3,5,7 和 10。
图 1 。随机系统(同一系统的两种不同表示)
现在每个细胞都拥有一些能量,这是由于它与邻居的相互作用,还有一些是由于它自己的状态。每个系统都想达到(过渡到)最低能量状态。
Eq1 。哈密顿函数
所以 Eq1。以上是这种系统在任一点的能量方程
- M :表示上述任一点的系统/矩阵
- < i,j > :所有对代表相邻单元格 I,j
- J i,j :表示相邻细胞间的相互作用能量系数
- Mi :表示每个单元格的值{+1,-1}
- **嗨:**代表每个的能量系数
- μ :表示每个电池的总(外)能量系数
现在,虽然上面的等式甚至对于简单的物理磁体(它最初是为其提出的)来说不够准确,但是它很好地模拟了由于每个粒子的状态、它与其他粒子的相互作用以及每个粒子上的任何外部因素而产生的系统能量。
图 2 开始状态(左)过渡状态(中)结束状态(右)
图二。上面显示了这样一个系统(200X200)从初始状态(左)到最终状态(右)的转变。
量子 ML 的方法
虽然总结量子最大似然的所有可能的方法对我来说是不可能的,主要是因为我对我读过的一些算法的理解有限,但是因为一般来说任何量子优化/最小化算法都可以有一个等价的 QML 用例。
在下面提供的 3 种方法中,我们将只关注第一种模型,在本博客后面的讨论中,其他两种方法放在这里只是为了给出 QML 算法的更大的图像
量子电路/门模型
- 将经典问题映射到量子算法。
- 相应的量子算法然后被转换成量子电路
- 量子电路然后在量子处理器上运行
绝热量子计算[暂时忽略]
- H1 代表一个系统的能量纯粹由于单个细胞&而不是相互作用(即 Jij = 0)。
(注意:这里的基态/最小能态是所有比特的叠加)如果你不知道什么是量子比特的叠加,现在忽略这一点 - H2 代表我们系统的一般能量状态,如上面等式 1 给出的
- 现在随着时间的推移(每一步),我们想要从 H1 的基态转移到 H2 的基态
- 在任何时候,系统的状态将是 H1 对 H2 的凸组合,t ∈ [0,1]
H (t) = (1-t) * H1 + t * H2 - 注意,这个问题不容易解决,也很难解决,因为我们不知道在所有状态之间移动的正确转换速度(类似于在梯度下降中选择学习速率)
量子退火**【简化绝热量子计算】**
- 这是绝热量子计算的更可行/实用的版本,其中我们不是找到我们的目标系统的基态,而是开始在每次跃迁中找到许多不同的低能态(基于不同的跃迁速度)。我们希望能量最低的状态是目标系统的基态
如果您想了解更多相关信息,请查看以下链接:
基本上,以上所有方法不知何故都会变成,我们得到一个等价的量子电路&通过一个量子处理单元(QPU)结合我们的标准 CPU 来解决它。
在这篇博客中,我们将假设我们被神奇地给予了一个量子电路来解决我们的问题&我们想在一个有编程接口的 QPU 上解决它。
让我们编码
现在,我们将尝试构建一个简单的回归暨分类问题,在下面的笔记本中提供,但在这里我们将一点一点地打破它。
[## AbhishekAshokDubey/量子计算-101
permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/AbhishekAshokDubey/quantum-computing-101/blob/master/qml-101/tfq_ml_101.ipynb)
同样,我们已经假设了问题的电路,主要由最后的 MNIST 问题电路驱动,如法尔希等人 &所建议的,也被谷歌 TFQ MNIST 的例子所使用。
在开始之前,我们需要在 tensorflow (TF)上安装 tensorflow-quantum (TFQ)和 Cirq。
- tensorflow-quantum :作为任何底层 QPU 的编程语言(接口)。(很像 GPU 的 CUDA)
- Cirq :作为定义量子电路的编程语言
tensorflow & pip install -q **tensorflow**==2.1.0
pip install -q **tensorflow-quantum**
pip install -q **cirq**
让我们导入所有我们需要的包
**import** **numpy** **as** **np**
**import** **sympy**
*# For Quantum ML*
**import** **cirq**
**import** **tensorflow** **as** **tf**
**import** **tensorflow_quantum** **as** **tfq**
*# For Visualization*
%matplotlib inline
**import** **matplotlib.pyplot** **as** **plt**
**from** **cirq.contrib.svg** **import** SVGCircuit
让我们为我们的问题制作一个虚拟玩具数据
**def** get_data(l):
data = np.random.randint(0,1,(l,2))
label = np.ones(l)
data[0::2,0]=1
data[1::2,1]=1
label[0::2] = -1
p = np.random.permutation(l)
**return** data[p], label[p]
x_train, y_train = get_data(5000)
x_test, y_test = get_data(200)print(pd.DataFrame(np.concatenate((x_train, np.reshape(y_train, (-1,1))), axis=1) , columns=["x1", "x2", "y"]))
生成的数据如下所示,上面打印语句的输出。基本上 x1 =1 → y = -1,x2 =1 → y = +1。不要问我为什么,但这看起来像是解决简单问题的方法:)
x1 x2 y
0 1.0 0.0 -1.0
1 1.0 0.0 -1.0
2 1.0 0.0 -1.0
3 *0.0 1.0 1.0*
4 1.0 0.0 -1.0
... ... ... ...
4995 1.0 0.0 -1.0
4996 *0.0 1.0 1.0*
4997 1.0 0.0 -1.0
4998 1.0 0.0 -1.0
4999 1.0 0.0 -1.0
关于量子数据的一个有趣的事实是,它不能被存储&它只能作为量子电路本身产生/提供。多检查几个
因此,我们上面生成每个数据点都应该被转换成等效的量子电路。所以基本上对于 0 位我们什么都不做,但是我们通过一个 1 位虽然不是门。下面是一个简单的函数来做同样的事情,将 0/1 上的数据转换成等效电路
**def** convert_to_circuit(x):
qubits = cirq.GridQubit.rect(1, 2)
circuit = cirq.Circuit()
**for** i, val **in** enumerate(x):
**if** val:
circuit.append(cirq.X(qubits[i]))
**return** circuit
所以,让我们得到经典数据集中每个数据点的等效量子数据(电路)。
x_train_circ = [convert_to_circuit(x) **for** x **in** x_train]
x_test_circ = [convert_to_circuit(x) **for** x **in** x_test]
为了将上面用 CIRQ 生成的电路/数据点传递到 TFQ,我们需要将每个电路/数据点转换成 TFQ 张量。
x_train_tfcirc = tfq.convert_to_tensor(x_train_circ)
x_test_tfcirc = tfq.convert_to_tensor(x_test_circ)
现在我们已经准备好了我们的量子数据,我们现在需要的是解决我们问题的量子电路&一个解决它的方法:)
如上所述,让我们假设一个电路,即使它对于手头的问题不是最好的,但是我们相信如果一个类似的电路可以解决简化的 MNIST 二进制(3 对 6)数字分类,它应该很容易解决我们的问题
图三问题电路模型
这里(-1,-1)行/量子位是我们的最终输出类预测,而(0,0)和(1,0)量子位是我们的输入数据。
那么,让我们在 CIRQ 中构建上述电路。
input_qubits = cirq.GridQubit.rect(2, 1) *# 2x1 grid.*
readout = cirq.GridQubit(-1, -1) *# a qubit at [-1,-1]*
model_circuit = cirq.Circuit()
model_circuit.append(cirq.X(readout))
model_circuit.append(cirq.H(readout))
alpha1 = sympy.Symbol('a1')
model_circuit.append(cirq.XX(input_qubits[0], readout)**alpha1)
alpha2 = sympy.Symbol('a2')
model_circuit.append(cirq.XX(input_qubits[1], readout)**alpha2)
beta1 = sympy.Symbol('b1')
model_circuit.append(cirq.ZZ(input_qubits[0], readout)**beta1)
beta2 = sympy.Symbol('b2')
model_circuit.append(cirq.ZZ(input_qubits[1], readout)**beta2)
model_circuit.append(cirq.H(readout))
model_readout = cirq.Z(readout)SVGCircuit(model_circuit)
SVGCircuit(model_circuit)
代码/命令应该能够在嵌入式控制台上绘制电路图像。
从这里开始,事情会变得和经典的机器学习一样有意义
现在更像 Keras 序列神经网络模型,我们将建立一个模型来解决我们的问题电路。
*# Build the model.*
model = tf.keras.Sequential([
*# The input is the data-circuit, encoded as a tf.string*
tf.keras.layers.Input(shape=(), dtype=tf.string),
*# PQC layer returns the expected val of the readout gate @[-1,1]*
tfq.layers.PQC(model_circuit, model_readout),
])
最后,我们需要定义损失函数、优化器和指标来跟踪。
model.compile(
loss=tf.keras.losses.MeanSquaredError(),
optimizer=tf.keras.optimizers.Adam(),
metrics=[accuracy])
下面是我们目前构建的模型包含的内容(来自模型摘要)
图 4 。模型摘要
让我们用量子数据来训练我们的量子电路模型。
model_history = model.fit(
x_train_tfcirc, y_train,
batch_size=200,
epochs=5,
verbose=1,
validation_data=(x_test_tfcirc, y_test))
results = model.evaluate(x_test_tfcirc, y_test)
以下是您的训练和验证数据丢失(&准确性)将如何随着每个历元而变化。
图 5 。量子训练历史
希望一切顺利,试着从测试数据中预测值。
print(list(zip(model.predict(x_test_tfcirc).ravel()[:10], y_test[:10]))) [(-0.7765335, -1.0),
(0.77620333, 1.0),
(0.77620333, 1.0),
(0.77620333, 1.0),
(-0.7765335, -1.0),
(0.77620333, 1.0),
(-0.7765335, -1.0),
(0.77620333, 1.0),
(0.77620333, 1.0),
(0.77620333, 1.0)]
基于以上,你会认为我们已经解决了一个经典的分类问题,即回归问题,所以请继续改进它
提示:铰链丢失?
最后,一旦你理解了这一点,对你来说,编写你自己的简单的 MNIST 两类分类器就容易多了,而不需要参考谷歌的教程:)
如果您想知道量子处理单元如何与当前的处理单元结合使用,以及我们上面使用的所有东西在更大的画面中适合什么位置(?).
谷歌 TFQ 团队的以下架构将为你提供一些快速的提示。
张量流量子栈:https://youtu.be/-o9AhIz1uvo?t=1247
现在是时候从一个更小的玩具例子转移到一个更好的玩具例子了,试试下面。
[## 用量子神经网络在近期处理器上进行分类
我们介绍了一个量子神经网络,QNN,它可以代表标记数据,经典或量子,并训练…
arxiv.org](https://arxiv.org/abs/1802.06002) [## MNIST 分类|张量流量子
更高分辨率的输入和更强大的模型使 CNN 很容易解决这个问题。而一个经典的模型…
www.tensorflow.org](https://www.tensorflow.org/quantum/tutorials/mnist)
干杯&快乐学习!!!
giphy.com:https://gph.is/g/ap0YjGy
参考资料:
- 【https://www.youtube.com/watch?v=16ZfkPRVf2w
- https://github . com/AbhishekAshokDubey/quantum-computing-101/tree/master/qml-101
- https://www.tensorflow.org/quantum/tutorials/mnist
- https://www.youtube.com/watch?v=-o9AhIz1uvo
- https://medium . com/@ adubey 40/quantum-computing-101-1ed 742540 ba 2
量子机器学习——超越宣传
本帖是本书的一部分: 用 Python 动手做量子机器学习。
如果计算机科学中有两个术语被我描述为过度宣传和缺乏理解,我会说机器学习和量子计算。
也就是说,量子机器学习就是利用量子计算进行机器学习算法的计算。还能更糟吗?
关于这两种技术有很多奇闻轶事。它们始于理解我们人类自然语言的机器。它们终结于人工智能的出现,要么表现为终结者式的天启,要么表现为瓦力式的乌托邦。
作者弗兰克·齐克特的图片
不要上当炒作!
不带偏见地详细观察一项技术有助于不被天花乱坠的宣传和民间传说所迷惑。先说机器学习。
什么是机器学习?
“机器学习本质上是一个事物标签器”
——谷歌首席决策科学家凯西·科济尔科夫 来源——
通过机器学习,我们的目标是给尚未标记的东西贴上标签。主要有三种方法:分类、回归和分段。
在分类中,我们尝试预测一个实例的离散标签。给定输入和一组可能的标签,它是哪一个?这里有一张图片。它是一只猫还是一只狗?
作者弗兰克·齐克特的图片
回归是关于寻找一个函数来预测某个输入和依赖的连续输出值之间的关系。假设你知道你朋友的收入和有效税率,即使你不知道实际的计算,你能估计你的收入的税率吗?
作者弗兰克·齐克特的图片
分割是将群体划分为具有相似特征的群体的过程,这些群体因此可能表现出相似的行为。假设你生产一种昂贵的产品,比如游艇,以及一群潜在客户,你想把产品卖给谁?
作者弗兰克·齐克特的图片
什么是量子计算?
量子计算是一种不同形式的计算。它利用了量子物理的三个基本性质:叠加、干涉和纠缠。
叠加是指一个量子系统可以同时存在多个态的量子现象。
作者弗兰克·齐克特的图片
实际上,量子系统并不同时存在于多个状态中。它存在于一个状态 *0*
和一个状态 *1*
的复杂线性组合中。它是一种不同的组合,既不是“或”,也不是“和”。
量子干涉让我们可以将量子系统偏向想要的状态。这个想法是创造一种干涉模式,其中导致错误答案的路径破坏性地干涉并抵消,但是导致正确答案的路径相互加强。
作者弗兰克·齐克特的图片
纠缠是量子粒子之间极强的关联。即使相隔很远,纠缠的粒子仍然保持完美的关联。
作者弗兰克·齐克特的图片
你已经看过《终结者》了吗? 没有?
也许是瓦力? 又没有?
也许看看这些东西是如何工作的会有帮助。
机器学习是如何工作的?
有无数的机器学习算法。但是每一种算法都有三个组成部分:
- 表示描述了算法用来表示知识的内部架构。它可能由一组规则、实例、决策树、支持向量机、神经网络等组成。
- 评估是评估候选算法参数化的函数。例子包括准确性、预测和召回、平方误差、后验概率、成本、边际、熵等等。
- 优化描述了生成候选算法参数化的方式。这就是所谓的搜索过程。例如,组合优化、凸优化和约束优化。
机器学习的第一步是架构的开发,即表示。该架构指定了参数,这些参数的值保存了知识的表示。这一步确定解决方案对于解决某个问题的适合程度。参数越多并不总是越好。如果我们的问题可以用一个线性函数来解决,那么试图用一个包含数百万个参数的解来解决它很可能会失败。另一方面,参数很少的架构可能不足以解决自然语言理解等复杂问题。
作者弗兰克·齐克特的图片
一旦我们满足于用架构来表示知识,我们就用例子来训练我们的机器学习算法。根据参数的数量,我们需要大量的例子。该算法尝试预测每个示例的标签。我们使用评估函数来衡量算法的执行情况。
最后,优化器调整表示参数,以保证测量的评估有更好的性能。它甚至可能涉及到改变表示的体系结构。
学习不会一蹴而就。而是小步前进。为了获得良好的性能,根据问题的复杂程度,这个一般过程需要重复几次,直到机器能够在一个物体上贴上正确的标签。
量子计算机擅长哪些任务?
量子力学的世界不同于我们在日常生活中经历的物理学。那么量子计算的世界与经典(数字)计算有什么不同呢?
让量子计算如此强大的不是它的处理速度。其实挺慢的。让量子计算如此强大的也不是它的内存。事实上,它小得荒谬。我们谈论的是几个量子比特。
让量子计算如此强大的是它所实现的算法。这些算法表现出不同于经典算法的复杂性特征。
为了理解这意味着什么,让我们简单看一下复杂性理论。复杂性理论是对运行算法所需的计算工作的研究。
例如,加法的计算量是O(n)
。这意味着两个数相加的工作量随着数的大小(位数)线性增加。乘法的计算量是O(n^2)
。努力随着数量大小的平方而增加。
据说这些算法在多项式时间内是可解的。但是这些问题相对简单。解决因式分解问题(即寻找一个 n 位数的质因数)的最佳算法是O(e^n^(1/3))
。这意味着努力随着位数的增加而呈指数增长。
作者弗兰克·齐克特的图片
不要低估O(n^2)
和O(e^n^(1/3))
复杂性之间的差异。虽然你的智能手机能够在几秒钟内将 800 位数字相乘,但在超级计算机上,这种数字的因式分解需要大约 2000 年。
一个精明的量子算法(比如 Shor 的算法)可以用叠加法同时求出一个数所有可能的因子。它不是计算结果,而是使用干涉来组合所有可能的答案,从而得出正确的答案。该算法解决了一个复杂度为O((log n)^2 (log log n)(log log log n))
的因式分解问题。这是多项式复杂度!乘法也是。
量子计算是强大的,因为它承诺以降低的复杂性解决某些类型的数学计算。
你现在看的是终结者还是瓦力? 还没有?
量子机器学习的案例
量子机器学习是利用量子计算进行机器学习算法的计算。
我们已经知道,机器学习算法包含三个组成部分:表示、评估和优化。
当我们看到这种表示时,当前的机器学习算法,如 2020 年发表的生成式预训练变压器 3 (GPT-3)网络,浮现在脑海中。GPT 3 号产生了类似人类的文本。它有 1750 亿个参数。
IBM Q 量子计算机有 27 个量子位。尽管量子比特存储的信息比经典比特多得多(因为它既不是0
也不是1
),但量子计算机的表示能力还远远不能推进机器学习。
在评估过程中,机器学习算法试图预测一个事物的标签。传统上,这包括测量和转换数据点。例如,神经网络依赖于矩阵乘法。这些都是经典计算机擅长的任务。然而,如果您有 1750 亿个参数,那么计算结果预测需要相当多的矩阵乘法。
最后,算法需要以有意义的方式改进参数。问题是找到一组能产生更好性能的参数值。175 亿个参数,组合的数量是无穷的。
经典的机器学习采用启发式方法,利用问题的结构在合理的时间内收敛到足够的解决方案。尽管使用了甚至更先进的启发式方法,训练 GPT-3 将需要 355 年才能在单个 GPU(图形处理单元)上训练,并花费 460 万美元。只是为了感受一下在这种情况下合理是什么意思。
量子计算的主要特点是能够同时计算多个状态。量子优化算法可以结合所有可能的候选者,并产生那些有希望得到好结果的候选者。因此,量子计算在算法优化方面有望比经典计算机快出指数级。
但这并不意味着我们只关注优化。因为优化建立在运行评估的基础上。并且评估建立在表示的基础上。因此,挖掘量子计算的全部潜力来解决机器学习优化问题需要评估和表示来与量子优化器集成。
考虑到经典机器学习算法今天可以做什么,如果我们希望量子计算能够大幅降低训练这种算法的复杂性,那么炒作就变得可以理解了。因为我们离人工通用智能“只有”几个数量级的距离。
当然,构建人工智能需要的不仅仅是计算。它需要数据。它需要算法。这种算法的开发是量子机器学习中当前的挑战之一。
本帖是本书的一部分: 用 Python 动手做量子机器学习。
免费获取前三章点击这里。
量子机器学习:神经网络学习
分析梯度计算、Hadamard 测试等等
我的上一篇文章讨论了量子计算机上的贝叶斯网络(在这里阅读!),以及 k-means 聚类,我们进入量子机器学习这个怪异而奇妙的世界的第一步。
这一次,我们将深入兔子洞,看看如何在量子计算机上构建神经网络。
作者图片
如果你不了解神经网络,不要担心——我们从神经网络 101 开始。
什么是(经典)神经网络?
几乎每个人都听说过神经网络——它们被用来运行我们今天拥有的一些最酷的技术——自动驾驶汽车、语音助手,甚至是生成名人做可疑事情的超现实照片的软件。
它们与常规算法的不同之处在于,我们不需要写下一套规则,而是需要向网络提供我们希望它解决的问题的例子。
我们可以用 IRIS 数据集中的一些数据输入一个网络,这个数据集中包含了三种花的信息,它可能会猜出这是哪一种花:
作者图片
所以现在我们知道了神经网络是做什么的——但是它们是如何做到的呢?
重量、偏见和积木
神经网络由许多称为神经元的小单元组成,看起来像这样:
作者图片
大多数神经元接受多个数字输入(蓝色圆圈),并将每个数字输入乘以一个权重(wᵢs),该权重表示每个输入的重要性。权重的大小越大,相关的输入就越重要。
偏差被视为另一个权重,只是它所乘以的输入值始终为 1。当我们将所有加权输入相加,我们得到神经元的激活值,用上图中的紫色圆圈表示:
然后,激活值通过一个函数(蓝色矩形)传递,结果是神经元的输出:
我们可以通过改变神经元用来转换其激活值的函数来改变神经元的行为,例如,我们可以使用一个超级简单的转换,就像这样:
然而,在实践中,我们使用更复杂的函数,如 sigmoid 函数:
神经元有什么用?
他们可以根据他们收到的输入做出决定——例如,我们可以使用神经元来预测我们下次在意大利餐馆吃饭时是吃披萨还是意大利面,方法是向它提供三个问题的答案:
- 我喜欢这家餐馆的意大利面吗?
- 餐馆有香蒜沙司吗?
- 这家餐馆有三层奶酪比萨饼吗?
抛开可能的健康问题,让我们看看神经元可能是什么样的——我们可以用 0 代表 no,1 代表 yes 来编码输入,并通过将 0 和 1 分别映射到 pasta 和 pizza 来对输出进行同样的处理:
作者图片
让我们使用阶跃函数来转换神经元的激活值:
仅仅使用一个神经元,我们就可以捕捉多种决策行为:
- 如果我们喜欢餐馆里的意大利面,我们会选择点意大利面,除非香蒜沙司卖完了,他们会提供三层奶酪披萨。
- 如果我们不喜欢餐馆里的意大利面,我们会点一份比萨饼,除非有香蒜沙司,而三层奶酪比萨饼没有。
我们也可以用另一种方式来做事情——我们可以对神经元进行编程,使其对应于一组特定的偏好。
如果我们想做的只是预测我们下次外出时会吃什么,那么为一个神经元计算出一组权重和偏好可能会很容易,但如果我们不得不对一个完整规模的网络做同样的事情呢?
这可能需要一段时间。
幸运的是,我们可以创建算法来改变网络的参数——权重、偏差甚至结构,而不是猜测我们需要的权重值,这样它就可以学习我们想要解决的问题的解决方案。
向下到达顶端
理想情况下,网络的预测应该与我们提供给它的输入相关联的标签相同——因此,预测和实际输出之间的差异越小,网络学习的权重集就越好。
我们使用损失函数来量化这种差异,损失函数可以是我们想要的任何形式,就像这个,它被称为二次损失函数:
y(x) 是期望的输出,而 o(x,θ) 是当输入带有参数θ — 的数据 x 时网络的输出。由于损耗总是非负的,一旦它呈现接近于 0 的值,我们就知道网络已经学习了好的参数集。当然,还有其他可能出现的问题,比如过度拟合,但我们现在忽略这些。
使用损耗函数,我们可以计算出网络的最佳参数集:
因此,我们需要做的不是猜测权重,而是根据参数θ最小化 C ,这可以使用一种称为梯度下降的技术来实现:
我们在这里所做的是,如果我们增加θᵢ的值,看看损失是如何变化的,然后更新θᵢ,使损失减少一点点。η是一个很小的数字,它控制着我们每次更新θᵢ时要改变多少。
为什么我们需要η变小?我们可以调整它,使电流 x 的损耗在一次更新后接近于零——大多数情况下这不是一个好主意,因为虽然它会减少电流 x 的损耗,但它通常会导致我们提供给网络的所有其他数据样本的性能更差。
厉害!
现在我们已经有了基本的东西,让我们弄清楚如何建立一个量子神经网络。
进入量子宇宙
我们将建立的量子神经网络与我们迄今为止研究的经典网络的工作方式并不完全相同——我们没有使用具有权重和偏见的神经元,而是将输入数据编码成一串量子位,应用一系列量子门,并改变门参数以最小化损失函数:
作者图片
虽然这听起来很新鲜,但想法是一样的-更改参数集以最小化网络预测和输入标注之间的差异。
为了简单起见,我们将构建一个二元分类器——这意味着输入到网络的每个数据点都必须有一个 0 或 1 的关联标签。
它是如何工作的?
我们首先将一些数据 x 输入到网络,这些数据通过特征图传递,特征图是一种将输入数据转换成我们可以用来创建输入量子态的形式的功能:
我们使用的特征地图看起来几乎可以是任何东西——这里有一个二维向量 x ,并给出一个角度:
一旦 x 被编码成量子态,我们就应用一系列量子门:
网络输出,我们称之为π( x ,θ),是在|1〉状态下被测量的最后一个量子位的概率,加上一个经典添加的偏置项:
Zₙ ₋ ₁ 代表应用于最后一个量子位的 Z 门。
最后,我们获取与 x 相关联的输出和标签,并使用它们来计算样本上的损耗——我们将使用上面相同的二次损耗。我们为网络提供的整个数据集的成本就变成了:
网络 p 的预测可以从输出中获得:
现在我们需要做的就是弄清楚如何计算损失函数 l ( x ,θ)的梯度。虽然我们可以经典地做到这一点,但那会很无聊——我们需要的是一种在量子计算机上计算它们的方法。
计算梯度的新方法
让我们从关于参数θᵢ:的损失函数的微分开始
让我们扩展最后一项:
我们可以很快去掉常数项——在θᵢ = b 的情况下,我们知道梯度就是 1:
现在,使用乘积法则,我们可以进一步展开:
读起来可能有点痛苦,但多亏了厄米共轭(+),它有一个简洁的表示:
由于 U (θ)由多个门组成,每个门由不同的参数(或参数集)控制,因此求u**【uᵢ***【θᵢ】的偏导数只涉及对依赖于θᵢ:的门进行微分*
这就是我们为每个uᵢ选择的形式变得重要的地方。我们将对每个使用相同的形式,我们称之为 G 门——形式的选择是任意的,因此您可以使用您能想到的任何其他形式来代替:**
既然我们知道了每一个的样子,我们就可以找到它的派生物:****
幸运的是,我们可以用 G 门来表达这一点:
所以剩下的就是找出如何创建一个电路,给我们提供我们需要的内在产品形式:
获得与之成比例的可测量值的最简单方法是使用哈达玛测试——首先,我们准备输入量子态,并将一个辅助态推入叠加态:
现在将 Zₙ ₋ ₁B 应用到ψ上,条件是辅助处于 1 状态:
然后翻转安西拉,对 和 做同样的操作:
最后,将另一个哈达玛门应用到辅助设备上:
现在将辅助设备测量为 0 的概率是
所以如果我们用(θ)代替,并用****(θ)替换掉的一个副本,那么安西拉量子位的概率就会给我们梯度********
太好了!
我们找到了一种在量子计算机上分析计算梯度的方法——现在剩下的就是构建我们的量子神经网络了。
构建量子神经网络
让我们导入开始工作所需的所有模块:
现在让我们来看看我们的一些数据(你可以在这里得到正确的数据!)—这是 IRIS 数据集的处理版本,删除了一个类:
我们需要将特征(前四列)与标签分开:
现在让我们构建一个函数,它将为我们进行特征映射。
由于输入向量是归一化的和 4 维的,因此有一个超级简单的映射选项——使用 2 个量子位来保存编码数据,并使用一个将输入向量重新创建为量子态的映射。
为此,我们需要两个函数,一个用于从向量中提取角度:
另一个是把我们得到的角度转换成量子态:
这可能看起来有点令人困惑,但是理解它是如何工作的对于建造 QNN 来说并不重要——如果你喜欢,你可以在这里阅读它。
现在我们可以编写实现(θ)所需的函数了,这些函数将采取 RY 和 CX 门交替层叠的形式。**
为什么我们需要 CX 层?
如果我们不包括它们,我们将无法执行任何纠缠操作,这将限制我们的网络可以到达的希尔伯特空间内的区域——使用门,网络可以捕获量子位之间的相互作用,没有它们它将无法实现。
我们先从 G 门开始:
接下来,我们就做 CX 盖茨:
现在我们把它们放在一起得到 U (θ):
接下来,我们创建一个函数,它允许我们获得网络的输出,另一个函数将这些输出转换为类预测:
现在,我们可以构建一个在网络上执行正向传递的函数——向其提供一些数据,对其进行处理,并向我们提供网络输出:
之后,我们可以编写测量梯度所需的所有函数—首先,我们需要能够应用(θ)的受控版本:**
使用它,我们可以创建一个计算期望值的函数:
现在我们可以算出损失函数的梯度——我们最后做的乘法是考虑梯度中的 π ( x 【T43,θ】)-y(x)项:
一旦我们有了梯度,我们就可以使用梯度下降来更新网络参数,以及一种称为动量的技巧,这有助于加快训练时间:
现在,我们可以构建成本和准确度函数,这样我们就可以看到我们的网络如何响应训练:
最后,我们创建训练网络的函数,并将其命名为:
我们传递给 np.random.sample()方法的数字决定了参数集的大小——第一个数字(5)是我们想要的 G 层的数量。
这是我对一个五层网络进行十五次迭代训练后得到的输出:
看起来非常好——我们在验证集上达到了 100%的准确率,这意味着网络成功地推广到了看不见的例子!
包扎
所以我们建立了一个量子神经网络——太棒了!
有几种方法可以进一步降低损失——训练网络进行多次迭代,或者调整超参数,如批量大小和学习速率。
向前推进的一个很酷的方法是为(θ)尝试不同的门选择——你可能会找到一个更好的!**
你可以在这里抓取整个项目。如果您有任何问题,请在此留言或联系我们——我很乐意帮助您!
量子 MNIST
作者在 IBM Q 体验中生成的图像。
用量子计算模拟器对手写数字进行分类
我最近发表了一篇名为“ 130,780 点量子分类的文章,讨论了一个基本上使用 20 个数据量子位来表示整个数据集的电路。它实际上只重置和重新使用了 5 个模拟数据量子位,但它这样做了 4 次,因此需要 20 个数据量子位才能在真实的量子处理器上运行特定的电路。令我惊讶的是,两个 Twitter 用户对我如何编码数据集完全不感兴趣。
所以,我继续研究数据集,然后写了一篇名为“经典数据的超密集编码”的文章那一次,我讨论了一个不可用的两量子位版本的电路,但也讨论了一个可用的四量子位版本的电路。令我惊讶的是,同样的 Twitter 用户仍然不为所动。
当有人评论说数据集的大小与高度使用的 MNIST 数据集相比微不足道时,后者仍然相对较小,我决定 MNIST 数据集将是增加复杂性的下一个逻辑婴儿步骤。
介绍
MNIST 数据集是图像的集合。每张图片显示一个从 0 到 9 的一位数手写数字。一个经过训练的机器学习模型有望获得一组测试图像,并根据图像显示的数量正确地对每张图像进行分类。
MNIST 数据集是众所周知的,并且经过了良好的测试,所以如果你开始学习经典的机器学习,几乎可以保证你会使用它。
CSV 数据
我承认跳过了与 MNIST 合作的一个重要步骤,部分原因是代码已经可以在互联网上找到,部分原因是我致力于将 OpenQASM 专门用于这个项目。我没有先将图像转换成数值,而是下载了一个已经确定了数值的 CSV 文件。请注意我在本文末尾的致谢。
虽然 CSV 文件不包含所有的 MNIST 训练和测试数据,但它包含了足够的数据来执行这个分类实验。无论所用数据集的大小如何,算法都将保持不变。我们可以推测一个更大的数据集如何影响结果的准确性,但是任何这样的差异都可能被运行这个实验所需的维度减少量所抵消。
算法
大部分工作实际上是经典的预处理。我给自己设定了一个挑战——完全不使用 Python 外加在智能手机上准备和运行这个实验的额外挑战。如果您尝试使用 Python 来复制这个实验,我承认这应该容易得多。
- 对于 10 个类别(0 到 9)中的每一个,通过将每列的平均值除以 255 来计算每个像素的归一化平均值;通常这个计算稍微复杂一点,但是最小值是 0,所以我们可以删除 2 个减去 0 的实例
- 对于 10 个类别中的每一个,以卷积神经网络(CNN)启发的模式对归一化均值求和;我选择了一个 49 像素的 4x4 网格
- 将 160 个总和(16 个正方形 x 10 个类)除以 49,使其标准化
- 重新排列对角线模式中的值;仅出于编码目的,这将把我想要映射到每个量子位的向量彼此相邻,这样我就不必做太多的剪切和粘贴
最后一步是在量子位上混合数字的不同区域。这个想法是为了避免,例如,水平地映射量子位,用八个量子位中的四个来代表 0、3 和 8 的类似弯曲的顶部和底部。
CNN 启发
卷积神经网络(CNN)扫描图像的特征,如眼睛、鼻子和嘴巴的形状,以识别可能的人脸。我没有按行、列甚至对角线来浏览 MNIST 数据集,而是选择了一种受 CNN 启发的方块模式,希望这有助于辨别每个数字的不同特征。
作者创建的图像。
字母表示数据集中数值数据的列。
顺便说一下,这在 Python 中会容易得多。虽然我能够自动化其中的一部分,但我自己造成的 Python 限制导致这个实验的这一部分需要相当多的手动干预。
作者创建的图像。
基于之前给出的原因,新添加的颜色表明了这些块是如何映射到量子位的。例如,两个黄色块被映射到数据量子位 0,在电路上显示为 data[0]。
测试零点
在创建完整的电路之前,由于在智能手机上编写 OpenQASM 已经具有挑战性,我测试了一个零的图像和零的数据量子位。零测试电路在本文的最顶端。
作者在 IBM Q 体验中生成的图像。
结果表明,零有合理的概率被归类为零。然而,考虑到前面提到的 3 和 8 的相似性,我不能假设 92.261%会是与其他数字相比的最高结果,特别是。就此而言,由于所需的降维量,我无法假设所有的数字不会模糊在一起并测量相同的值。
完整的电路
使用 OpenQASM 子例程编写代码会容易得多,但他们过去收到过负面反馈,因为他们的电路只是显示出难以描述的块。相反,在下面,你可以看到许多 U3 门,弗雷德金门,复位门,加上一点点的哈达玛门和 x 测量。
作者在 IBM Q Experienc e 中生成的图像。
要放大,只需查看本文最上方的零测试电路。这里唯一增加的是屏障,使电路看起来更好,重置门,所以我可以重复使用 17 个量子位。IBM Q 量子计算模拟器只允许使用最多 32 个量子位,随着更多量子位的添加,运行时明显变慢,因此您可以通过重置和重用更少的量子位来提高性能。
结果
下面的直方图是将之前使用的相同图像 0 与所有 10 个数字 0 到 9 进行比较的结果。
作者在 IBM Q 体验中生成的图像。
直方图中只显示了顶部的结果,因此需要进行一些经典的后处理。
- 0–92.517%
- 1–91.15%
- 2–84.619%
- 3–84.741%
- 4–90.625%
- 5–90.491%
- 6–81.128%
- 7–86.633%
- 8–89.783%
- 9–90.027%
即使进行这个实验需要所有的维数减少,零的测试图像与零的数据最接近。顺便说一下,这条完整线路的运行时间是 4 分 45 秒。
结论
这个实验表明,使用量子计算模拟器对手写数字的图像进行准确分类实际上是可能的。虽然这种电路不能在 NISQ 处理器上运行——由于量子位连接和电路深度问题,即使你有足够的量子位来一次一位地进行比较——但这一结果有望在未来的量子处理器上得到实际应用。
未来的工作
如果我有 15,690 个容错量子位,我会喜欢运行这种算法的逐像素版本。在那之前,我只能等待这个实验的反馈,以确定接下来会有什么样的挑战。
这种算法在发表前面临的一个挑战是,在量子处理器上运行这种算法相对于传统的运行算法是否有任何实际优势。由于它甚至不能在量子处理器上运行,我们将看到这个论点走向何方。
承认
一如既往,感谢 IBM Q Experience 免费使用其量子计算模拟器,该模拟器生成了本文中的电路和直方图图像。感谢量子直觉 ( @explore_quantum )启发我尝试用 MNIST 数据集做量子分类。感谢http://yann.lecun.com/exdb/mnist/为机器学习社区提供了 MNIST 数据集这样的资源。还要特别感谢https://www.kaggle.com/oddrationale/mnist-in-csv#分享 CSV 格式的 MNIST 测试数据集。
量子并行性——量子计算机的魔力从何而来
量子计算机如何利用量子叠加来同时执行许多计算路径。
量子计算机是在 20 世纪 80 年代提出的。从那以后,物理学家一直在努力利用自然的力量来满足计算需求。物理上实现量子计算机没有单一的最佳方法;该领域被分割成几个相互竞争的方法,如离子阱,光学晶格,光子量子位,核磁共振等。但是这些不同的方法都致力于在硬件中实现相同的量子计算模型。只要我们正确地使用这个模型,我们就不需要关心它是如何在硬件中实现的。公平地说,量子计算也有不止一种模型,但是在本文中我们将只考虑标准的量子电路模型。
我们把这篇文章分成四个部分。在第一部分,我们将了解什么是单个量子位。然后,我们将会看到多重量子位元是如何被表现的。在第三部分,我们介绍作用于量子位的变换。最后,我们将所有这些放在一起,解释量子计算机如何能够并行执行多条计算路径。
单量子位
经典的计算机按位操作,每一位可以处于 0 或 1 的状态。量子计算机运行在量子位或*量子位上。*一个量子位不是以 0 或 1 的形式存在,而是以两者的叠加形式存在(还记得薛定谔的猫同时是死的和活的吗?).
让我们用数学来表示。量子位ψ的状态可以写成:
上面的符号被称为 braket 符号,但我们不会在这里讨论它。这个量子位以 0 和 1 两种形式存在,但是如果测量它,我们会得到或者 0 或者 1 而不是两者。我们得到 0 的概率由|α|给出,我们得到 1 的概率由|β|给出。一旦测量完成,量子位就失去了叠加态,继续以 0 或 1 的状态存在。由于许多原因,braket 符号非常有用,但是同样的方程也可以使用矩阵和向量方便地写成:
免责声明: 文章使用了技术上不完全正确的松散批注。例如,上述状态 0 和 1 应该写成基向量|0 >和|1 >。采用松散符号的原因是不幸的事实,即 medium 不允许在文本中使用数学符号,并且将每个实例转换成图像会使文章难以阅读。
多量子位
两个未纠缠的量子位的状态可以表示为它们各自状态的张量积。如果第一量子位具有振幅 a 和 b ,而第二量子位具有振幅 c 和 *d,*它们的组合状态可以写成:
一些两个量子位的状态不能分解成两个单个量子位的张量积。这样的量子比特被称为纠缠量子比特。纠缠在许多量子算法中扮演着重要的角色,尤其是在量子密码领域。经典物理学中没有量子纠缠的对应物。我们不会在这篇文章中回顾纠缠。
量子变换
如果我们不能用量子比特做任何事情,那就没有乐趣了。但是我们可以——在转变的帮助下。经典计算机借助于逻辑门如“非”、“与”、“或”、“与非”、“或非”、“异或”等对比特进行运算。同样,量子计算机使用量子门对量子位进行操作。由于量子力学的假设,所有在量子位元上执行的操作必须是线性且可逆的。因此,所有的量子门都必须是线性且可逆的。
“非”门是其中最简单的一种。它只是反转 0 和 1。
遍及量子计算的一个门是哈达玛门。它将一个仅作为 0 存在的量子位转换成 0 和 1 ie 的相等叠加。如果我们测量量子位,50%的概率会得到 0,50%的概率会得到 1。正如我们将看到的,这是许多量子算法的一个很好的起点。
量子并行性
现在,有了上述知识,让我们来揭开量子计算机是如何施展魔法的。我们将使用一个处理两位的简单示例来实现这一点。假设给你一个经典函数 f ,它取两位作为输入,返回一位作为输出。
为了在两位的所有四种排列上评估 f ,我们将需要调用 f 四次: f (0,0)、 f (0,1)、 f (1,0)、 f (1,1)。利用量子并行性,我们可以在对f的一次调用中评估所有四个输入。然而,请注意,我们的函数 f 是不可逆的,所有对量子位的操作都必须是可逆的。所以我们首先定义一个可逆版本的 f 如下:
带圆圈的加号表示 XOR 运算。量子预言机 U 接受两个输入 x 和 y 并输出两个值。首先是 x 本身。第二个是值: y XOR f(x) 。很容易看出,当 *y=0,*第二个输出等于 f(x) 。
我们将输入ϕ设置为四个两位输入 00、01、10、11 的相等叠加。为此,我们将两个量子位初始化为 0,并对它们应用哈达玛门。这表现为:
接下来,我们通过设置 y=0 将量子函数 U 应用于该状态。这给了我们:
如果我们分离出两个量子位,我们看到第二个输出量子位包含了我们感兴趣的所有四个结果的叠加。因此,我们使用目标函数的单一应用评估了四个输入。
或者更详细但仍然温和的量子计算介绍,请参见 https://arxiv.org/abs/2006.12025的评论论文
讨论
量子并行形成了许多量子算法的核心。然而,我们需要考虑一些重要的警告。虽然输出包含我们感兴趣的结果的叠加,但是我们不能直接读取它们。任何直接形式的测量都会给我们一个结果,其他三个结果都会丢失。因此,需要使用巧妙的技巧来读出我们感兴趣的最终答案,并且这些技巧在计算上可能不是微不足道的。第二,对于我们的例子,准备输入状态很简单,但是对于其他问题可能不是这样。使用量子并行性最终是否会比传统的替代方案更快取决于这些警告。
量子计算机已经在这里了,是我们开始认真对待量子的时候了。越多来自不同领域的人接受它,它就会越快成为现实。
如果你喜欢这篇文章,可以在 中 上查看我的其他作品,在LinkedIn或Twitter,查看我的 个人网页 ,或发邮件给我【viraj@berkeley.edu】
“量子至上”
奇点研究
去量子还是不去量子?
在这篇文章中,我们将非常冷静和平衡地看待“量子优势”的想法,以及与经典计算机相比,在不久的将来,我们可以从量子计算中获得什么样的性能。寻找量子计算未来应用的很大一部分将是比较量子方法和经过充分研究的经典方法,这些方法有几十年的经验证据支持。在许多情况下,有启发式经典算法开发的各种特殊情况下的问题,将优于量子方法。然而,也有量子方法优于经典方法的情况,决定哪些情况适合量子方法而不是经典方法是一个非常重要的问题。
此外,在某些情况下,当应用一种方法而不是另一种方法时,性能的微小改进可能不值得使用资源。也许这个问题用经典算法解决会更准确,但是量子算法可能更高效并且可能占用更少的资源。也许在另一个问题上,恰恰相反。在某些情况下,资源成本可能意味着牺牲准确性,而在其他情况下,准确性可能是最重要的,例如当涉及到人的生命和健康时。使用一种方法可能需要更多的资源来解决问题,但性能的改善可能意味着预测癌症风险的比率将提高几个百分点,这将挽救数千甚至数百万人的生命。
照片由 Michael Dziedzic 在 Unsplash
与其他方法一样,解决何时使用量子计算的问题是一个持续的问题,其答案会随着时间的推移而变化,这取决于可用的资源、提出的问题、可用的其他方法、准确性的重要性以及我们可用的资源的重要性。下面的文章从方法的有效性方面解决了这个问题:
关于定义量子霸权的重要性和意义的真正深度和复杂性的一个很好的简短播客,请参见麻省理工学院技术评论关于谷歌和 IBM“量子霸权”争执的文章。在谷歌发布了一个关于他们宣称的“量子霸权”的简短视频后,我们将在下面讨论这个“世仇”。
硬件限制
另一个考虑因素是硬件限制,这种限制在不久的将来可能不会出现。虽然一些电路算法可能优于当前的经典算法和模型,但是随着电路深度的增加,可以显示 QAOA 渐进地达到正确答案。电路深度是指可以应用的门操作次数,与算法的运行时间有关。由于退相干的限制存在于当前的硬件中,但是随着量子计算硬件的改进,以及随着使用不同材料和硬件几何和拓扑的更多量子计算方法的发现,这种限制可能在近期急剧增加。更高保真度的门操作和量子纠错将最终提供容错量子计算机,它可以无限长时间运行计算。在这种情况下,渐近最优的答案将优于经典的 Goemans-Williamson 方法。
在上面的论文中,显示了即使电路深度为 10,QAOA 方法也可以在某些类的问题上胜过 Goemans-Williamson 方法。因此,很明显,对量子方法的进一步研究是绝对必要的,以确定什么时候量子方法是必要的或有益的,什么时候它们不是……这是一个元优化问题。随着时间的推移,我们将发现自己面临越来越多的这种元优化问题,人类最大的问题将不是如何解决问题,而是如何最有效地解决问题,以及效率的定义是什么是合适的。换句话说,我们必须问这个问题,
"对于一些固定的环境,什么是正确的元目标函数?”
可验证性
即使在近期的问题中,也存在这样的情况,当前的量子计算机可以执行经典计算机无法执行的计算,无论我们的经典计算机有多好,它们永远无法执行这些计算。这就带来了可核查性的问题。举个例子,想想机器学习中的经典例子支持向量机。在非常低的维度上,比如说二维数据,支持向量机通常比其他方法表现得更好,这可以在 scikit-learn 的分类器比较中看到。然而,在高维数据中,比如大于 12 维的数据,支持向量机的性能要好得多。
在量子计算机中也可以观察到类似的现象,在经典计算机上可以执行的计算可能是一个案例一个案例地分析哪种方法在给定的问题上表现得更好,但是一旦我们进入经典计算机由于涉及到难以置信的高维希尔伯特空间而无法使用的领域,量子计算机将是必要的。然而,我们遇到了一个有趣的问题,使用经典计算机无法验证结果。有些问题和计算无法在经典计算机上运行,在这些情况下,无法将经典计算机与量子计算机进行比较。一旦谷歌声称“量子至上”在 2019 年末出现,我们就进入了量子计算机正在执行计算的领域,这些计算要么非常困难,要么无法使用经典计算机进行验证。
尽管 IBM 声称已经找到了一种方法,在他们的一台超级计算机上用大约 2.5 天的时间启发式地模拟计算,但谷歌使用的量子计算机花了大约 200 秒。这相当于增加了大约 1000 的时间资源。现在,想象一下在量子计算机上运行一个计算需要 10 天,这是训练机器学习模型时的典型情况。这相当于在经典计算机上进行一次计算,大约需要 30 年才能完成。随着量子计算技术的改进,计算时间的差距只会增加,除非发生令人震惊的事情,复杂性类别崩溃(例如 P=NP),和我们可以找到如何有效地将量子算法转化为经典算法。
彼得·肖尔为 QAOA 辩护
数学家 Peter Shor 在量子计算行业因其因数分解算法而闻名,该算法被吹捧为破解 RSA 公钥密码的一种方法,他做了一个关于 QAOA 算法的讲座。在他的演讲中,他为一般量子算法的可用性和适应性辩护。他的主张本质上是,(至少是一些)量子算法实际上可能更适用于更广泛的问题,也可能更容易被那些希望应用优化或机器学习方法来解决他们感兴趣的问题的非专家使用。显然,这一论点取决于要解决的问题、可用于该类问题的算法或机器学习选项、这些选项的简单性、它们是否以用户友好的格式在记录良好的代码中实现,以及理解如何有效使用这些方法的最小障碍。在 QAOA 的例子中,当然有很多实现都有很好的文档记录,但是有人可能会说 Goemans-Williamson max cut 算法也是如此。这个论点高度依赖于关于机器学习模型和优化技术的“用户友好的”和“适应性的”的含义。
在奇点研究,我们正致力于让普通人更容易获得量子计算,为非程序员和非数学家提供广泛的交互式 Jupyter 笔记本。我们希望这些想法和应用程序可以广泛测试、访问和使用。我们的目标是实现一般无法访问的研究论文中的应用程序和算法。我们正在使用 Python 和量子计算以及量子机器学习库和软件来创建用户友好的交互式笔记本。我们正试图以一种教育和信息的方式做到这一点,这样随着时间的推移,了解这项技术以及如何以一种有意义的方式使用它将变得更加容易。如果你有问题或者你想成为这个项目的一部分,去看看 Github 或者联系 thesingularity.research@gmail.com,考虑支持 Github 项目。如果你对量子计算如何帮助你感到好奇,我们很乐意咨询并帮助你开始!
量子数学——你准备好吃红色药丸了吗?
探索哈达玛门的美丽
在这篇文章之后,矩阵不再是从顶部落下的神秘符号,而是你会看到一个穿红色裙子的女人……
…至少关于哈达玛门。
本帖是本书的一部分: 用 Python 动手做量子机器学习 。
“你吃了蓝色药丸——故事结束了,你在床上醒来,相信你想相信的一切。你吃红色药丸——你呆在仙境,我让你看看兔子洞有多深。”
莫菲斯矩阵
作者弗兰克·齐克特的图片
量子位类似于电子自旋的概念。它处于叠加状态。电子的叠加态由上下态组成,而量子位的叠加态由|0⟩态和|1⟩.态组成
一个流行的叠加概念是系统同时处于不同的状态,除非你测量它。但是,当你看电子的时候,你会发现它不是向上就是向下。你看量子位,不是0
就是1
。另一个概念是,系统是真正随机的,对初始条件没有敏感的依赖性。但是叠加并不意味着和。也不是指或。它是不映射到经典概念的状态的组合。
这是你最后的机会。这之后,就没有回头路了。”
莫菲斯矩阵
叠加的基本模型由向量空间给出。向量空间是所有有效量子位状态向量以及你可以对它们执行的操作的集合。我们通过下面的等式知道了量子位状态向量:
在 Python 中,数组[alpha, beta]
表示这个向量。
alpha and beta are the probability amplitudes. They are not probabilities. They can be positive or negative. But their squares alpha**2 and beta**2 denote the probabilities.
当我们测量一个量子比特时,它会坍缩到可能的测量值中的任何一个。可能测量的数量决定了这个潜在向量空间的维度。一个量子位有两种可能的测量方式,0
或1
。因此,向量空间是二维的。这个向量空间中的所有向量都由两个数字组成。这些是概率振幅α和β。
当我们测量一个量子位时,我们观察它是0
还是1
。我们知道|0⟩说我们的量子比特在被观察时会产生值0
。|1⟩说我们的量子位在被观察时会产生值1
。总的来说,|ψ⟩=α|0⟩+β|1⟩说我们的量子位会以α2 的概率产生值0
,以β2 的概率产生值1
概率是一个单一的数字,称为标量。我们如何从一个量子位态获得这个标量呢?矢量乘法有一种方法可以产生标量。这叫内积。它是由一个列向量乘以一个行向量得到的。
在之前的帖子中,我们介绍了 Dirac 符号及其“ket”——表示列向量的构造。举个例子,
现在,我们介绍“胸罩”结构(⟨0|).胸罩是一个行向量,例如
内积定义为:
我们可以用内积来获得从一个量子比特态测量某个值的概率幅度。它的平方表示概率。
那么,从|0⟩测量出1
的概率有多大呢?让我们构建内积来找出答案:
而且测到0
的概率有多大?
这也适用于任意状态向量|ψ⟩=α|0⟩+β|1⟩.衡量1
的概率是:
而测得|ψ⟩为0
的概率是多少?
太好了!尽管这是非常数学化的,但它说明了我们如何从量子态中获得一个值。用状态向量乘以行向量。通俗地说,“bra-ket”⟨e|ψ⟩表示测量|ψ⟩为 e 的概率幅度,它的平方表示概率。
在上一篇帖子中,我们了解了矩阵乘法。我们知道,当我们将一个矩阵乘以一个向量时,结果是另一个向量:
我们看到 X 门量子算符改变了量子态的振幅。
X-gate 应用于|1⟩:的|0⟩结果
X-gate 应用于|0⟩:的|1⟩结果
在狄拉克符号中,像|a⟩⟨b|那样排列的胸衣和胸罩表示外部产品。外积可以理解为矩阵乘法:
因此,术语|a⟩⟨b|表示矩阵。我们可以用向量来表示矩阵:
通俗地说(仅针对特定的基本情况),“ket-bra”|a⟩⟨b|将你的|b⟩变成了|a⟩.
因此,X-gate 把|1⟩变成了|0⟩(因为|0⟩⟨1| ),把|0⟩变成了|1⟩(因为|1⟩⟨0|).
量子叠加态我们讲了很多。但是每当我们在这种状态下处理量子位时,我们用相应的概率振幅α和β来初始化量子位。但是,如果我们想把一个曾经测量过的量子位放回叠加态呢?
现在,我们有办法做到这一点。对此你怎么看?
根据我们的想法,这意味着我们把|0⟩变成|+⟩,把|1⟩变成|−⟩.
你记得|+⟩和|−⟩吗?我们在这里介绍他们。它们被定义为:
这些状态产生测量0
或1
的相同概率。它们位于水平轴。尽管这些状态有相同的概率,但它们是不同的。它们的概率幅度是不同的。如上所述,这个幅度可以是负的。
让我们来看看这个运算符。
这种操作器被称为哈达玛门或 H 门。它让我们远离基本状态向量|0⟩和|1⟩.它将量子位置于平衡的叠加状态。
简而言之,它有矩阵:
Why do we need to distinguish these two states?
量子计算机必须以高精度工作,因为量子算法建立在连续变化参数的精确操作之上。即使是由热量引起的噪音也会破坏计算。
这是有问题的,因为到目前为止我们能够制造的计算机本质上是昂贵的电加热器,其副作用是碰巧执行少量的计算。
我们的计算机以一种依赖于故意丢失某些信息的方式运行。当我们查看and
操作符时,如果两个输入值都是1
,我们会得到1
的输出。在所有其他情况下,我们得到一个0
。给定0
的输出,我们无法知道输入是什么。
作者弗兰克·齐克特的图片
在执行这种操作的过程中,计算机破坏性地覆盖它的输入。它通过将旧信息推到计算机的热环境中,以物理方式破坏旧信息。它变成熵,表现为热。
量子计算机在极低的温度下运行——低于 1 开尔文或-273°c,量子计算机必须非常节能。不是因为能源是一种宝贵的资源。而是因为任何能量损失都不可避免地使计算机过热。
事实上,进行计算而不丢失信息,因而不产生热量是可能的。这就是所谓的可逆计算。
通过使我们的 h-算符能够区分输入态|0⟩和|1⟩,它变得可逆,因此适合量子计算机。
活动中的哈达玛门
让我们看看 Hadamard 门的运行情况。
作者弗兰克·齐克特的图片
你应该注意到,在 Python [1, 0]
中,我们用状态|0⟩初始化我们的量子位。唯一的新东西是我们在位置0
(第 13 行)应用于量子位的哈达玛门。
我们可以看到,即使我们用状态|0⟩初始化了量子位,我们对0
和1
的测量概率都是 50%。
我们提到了哈达玛门的可逆性。事实上, Hadamard 门会自行反转。
作者弗兰克·齐克特的图片
在这段代码中,我们用|1⟩状态初始化量子位(第 9 行)。我们应用哈达玛门两次。结果是有 100%的机会测量到1
。这正是|1⟩州的含义。
Hadamard 门是一种基本的量子门。它在量子计算中无处不在。它将|0⟩的一个量子位转换成|+⟩,将|1⟩的一个量子位转换成|−⟩.它逆转了这些转变。
结论
这篇文章带你深入量子数学的兔子洞。我们探索了两种结构。首先,您可以使用“bra-ket”来获得某个度量的概率幅度。第二,你可以使用“ket-bra”来形成矩阵,并指定如何转换现有的量子位状态。
我们已经学了相当多的数学。令人惊讶的是,不需要混淆视听。事实上,我们在量子计算中使用的数学主要由线性代数组成。这一点也不难。不幸的是,许多关于这个话题的资源都假设你有数学学位。例如,他们没有解释什么是内积,以及你如何计算它。
我的经验告诉我,当我们使用它们时,解释基本的东西并不可耻。对于那些已经很熟悉的人来说,这是一个巩固知识的机会。但是对于不熟悉的人来说,根本就是理解学科的基础。
本帖是本书的一部分: 用 Python 动手做量子机器学习 。
在这里免费获得前三章。
在 Python 中查询和分析条带数据
MRR 和流失计算
来源:https://unsplash.com/photos/ZVprbBmT8QA
Stripe 是一家在线支付公司,提供用于处理支付和业务管理的软件和 API。我喜欢 Stripe 为不同的语言提供不同的 API,这让人们的生活变得轻松了许多。
我主要使用 Stripe Python API。要安装:
pip install --upgrade stripe
也可以做conda install stripe
。但是该库的最新版本似乎还没有在 Conda 上提供。我使用的版本是 Stripe 2.55.0。
接下来,您将需要一个 API 密钥来访问条带 API。转到 stripe.com—开发者— API 密钥,然后点击“+创建密钥”获取 API 密钥。
资料来源:stripe.com
stripe.api_key = YOUR_API_KEY
stripe.api_version = "2020-08-27"
然后,您可以定义条带 api_key,并且不要忘记定义 api_version。我使用的是最新版本。如果您使用不同版本的 API,某些功能/数据格式会有所不同。
获取条带数据
很好,现在一切都设置好了,我们可以开始查询条带数据了。这里我写了一个函数来获取数据。
- 条带 API 包含许多资源(数据集)。在这个函数中,我们可以传入资源的名称来获取相应的数据。例如,获取订阅数据的基本格式是
stripe.Subscription.list()
。我们在函数中使用了getattr
,以便将资源作为参数包含在函数中。 - 我们使用
list
API 批量获取资源。 - 每个 API 调用最多返回 100 个对象。这就是为什么我们使用
auto_page_iter()
来自动给列表结果分页。
有了这个函数,我们可以简单地调用函数来获取所有时间或定义的时间段的不同资源。例如:
- 客户数据:
stripe_get_data('Customer')
- 事件数据:
stripe_get_data('Event')
(仅返回过去 30 天的事件) - 发票数据:
stripe_get_data('Invoice')
- 余额交易数据:
stripe_get_data('BalanceTransaction')
- 订阅数据:
stripe_get_data('Subscription', start_date=datetime(2020,9,1), end_date=datetime(2020,10,1))
(如果没有指定,只返回“活动”和“过期”状态的订阅)。
其他资源可以在 Stripe API 文档中找到。您也可以使用这个函数查询其他资源。
条带计费分析仪表板
stripe Billing Analytics Dashboard 提供了您的帐户的汇总视图,其中提供了许多有用的信息,如 MRR、客户流失等。不幸的是,没有用于条带计费分析仪表板的 API(我实际上联系了支持人员并询问了这个问题)。所以,我不能把仪表板直接放到 Python 上。但是 Stripe 确实就他们如何计算这些指标提供了一些指导。我按照说明,计算了 MRR 和流失率。
资料来源:stripe.com/docs/dashboard
维护、修理和更换
每月经常性收入(MRR)可以被认为是您可以可靠地预期在经常性基础上收到的每月收入总额。这是 SAAS 企业要跟踪的最重要的指标之一,因为它提供了对增长和预测收入的前瞻性衡量…您可以通过对当时收取费用的所有订阅的每月标准化金额求和来计算大致的 MRR。
计算 MRR 的语法如下所示。
- 首先,我们需要获得所有的订阅数据。这里我设置
status="all"
来获取所有订阅数据,包括取消的订阅。我们也不能包含此参数来仅获得“活动”和“过期”状态,因为我们在此计算中不使用“已取消”状态。 - 然后我们得到关于订阅计划的信息,即金额和间隔(年度或月度计划)。
- 如果有人的计划有折扣,我们会得到有关折扣的信息。
- 接下来,我们通过标准化年度金额并应用折扣来计算标准化的月度计划金额。
- 最后,MRR 被计算为那些具有“活动”或“过期”状态的人的标准化每月计划金额的总和。
这个计算是基于条纹文章和一篇博客文章。结果值看起来与仪表板上显示的值略有不同。但是已经很近了。
流失率
流失率的计算方法是,将过去 30 天内流失的用户总数除以 30 天前的活跃用户数,再加上这 30 天内新增的用户数。
下面是计算流失率的代码。
- 首先,我们计算过去 30 天内的用户数量。我们可以使用事件数据,也可以使用订阅数据,查看在过去 30 天内谁取消了订阅。
- 其次,我们计算活动订阅或过期订阅的数量。
- 然后我们可以根据这两个数字计算出流失率。
该计算基于这篇文章中的描述。
现在您知道了如何查询条带数据并计算 MRR 和流失率。希望你喜欢这篇文章。谢谢!
参考
[## 条带 API 参考
Stripe API 的完整参考文档。包括我们的 Python 的代表性代码片段和示例…
stripe.com](https://stripe.com/docs/api)
https://support . stripe . com/questions/billing-analytics-dashboard
在 Python 中查询元数据库数据
元数据库 rest API 和 Python API
Metabase 是一个开源 BI 工具,您可以在其中存储数据、连接到外部数据源、查询和可视化数据。本文讨论当我们将数据存储在元数据库中时,我们如何在 Python 中查询数据并获得结果。本文的第一部分讨论了如何使用 Metabase rest API 来查询数据。第二部分尝试 Python API。让我们开始吧。
元数据库 rest API
获取会话令牌
要使用元数据库 rest API,我们首先需要获得一个会话令牌。在命令行中键入以下内容:
输出将是您的令牌。然后将这个令牌保存在 Python 脚本或 Jupyter 笔记本中。
token = "YOUR_TOKEN"
或者,您可以在 Python 脚本中运行以下内容来获取令牌:
查询卡片
有两种方法可以查询元数据库数据。第一个选项是从卡中查询数据,或者在 UI 上询问问题。在 UI 中,我们可以直接通过 UI 提出问题并查询数据:
来源:元数据库
一旦我们创建了问题,我们可以检查这个问题是否出现在api/card
中:
输出显示了一个字典列表,每个字典对应于用户通过 UI 提出的一个问题。然后我们可以用下面的代码找到卡的 ID 号并得到卡的结果。这基本上是用你在卡中定义的查询(问题)来查询数据库。
直接查询数据库
第二种选择是直接查询数据库,而不是首先定义卡并查询卡。
假设我们想从数据库1
中查询表users
,并输出 2020-10-15 之后创建的所有行。这里我们需要在 SQL 本地查询中定义这个查询。然后将查询添加到requests.post
函数中。由此产生的res.json()
是一本字典。读入数据和列。我们可以从res.json()['data']['row']
获取所有数据,然后从res.json()['data']['results_metadata']['columns']
获取列名。
现在您应该能够在df
中看到您的查询结果。
Python API
我还尝试了一个 Python API 元库。类似于我们上面提到的查询卡片部分,这里我们可以用下面的代码查询卡片 1:
from metabasepy import Client, MetabaseTableParsercli = Client(username=username, password=password, base_url=endpoint)cli.authenticate()query_response = cli.cards.query(card_id="1")data_table = MetabaseTableParser.get_table(metabase_response=query_response)df = pd.DataFrame(data_table.__dict__['rows'])
df
我感觉 Python API 不太灵活。但是当然欢迎你去尝试。
结论
在这里,我向您展示了三种从元数据库查询数据的方法:使用元数据库 rest API 从卡中查询,使用元数据库 rest API 通过用户定义的查询直接从数据库中查询,以及使用 Python API 元数据库从卡中查询。
我更喜欢使用 Metabase rest API 通过用户定义的查询直接从数据库中查询。使用这种方法,我们可以在 Python 脚本中包含所有的查询,并且我们确切地知道我们在查询什么。
在元数据库中还有许多其他可用的 API 调用,我们没有介绍。本文中的代码应该是您学习和探索其他 API 函数的良好起点。希望你喜欢它!谢谢!
参考
本指南应该有助于回答一些关于使用元数据库 REST API 的常见问题。如果您有任何问题,请随时提出…
github.com](https://github.com/metabase/metabase/wiki/Using-the-REST-API) [## 有可能通过 REST API 从元数据库 MBQL / SQL 查询中获取原始数据吗?
有没有一个元数据库 REST API 接受一个 MBQL/SQL 查询并返回原始数据?我可以通过…执行 MBQL 查询
stackoverflow.com](https://stackoverflow.com/questions/50620095/is-it-possible-to-get-raw-data-from-a-metabase-mbql-sql-query-via-the-rest-api)
查询您的 GitHub 帐户的统计数据
快速找出您提交和/或审核的拉动式请求的数量!
比方说,你想展示一下你今年提交了多少拉取请求,或者你审查了多少。在 GitHub 上手动计数会很困难…但是有一种更容易、更简单、更有效的方法。
先决条件
在 Python3 虚拟环境中,用pip
安装requests
:
生成访问令牌
在你的 GitHub 账户上,进入“设置”
作者图片
然后,“开发者设置”
作者图片
然后点击“个人访问令牌”,并点击“生成新令牌”
作者图片
向“用户:读取用户”提供访问权限,并生成:
作者图片
将您的令牌导出为环境变量
有许多关于如何做到这一点的博客帖子——为了与我下面提供的脚本一起工作,你应该将其命名为GITSTATS_TOKEN
。
查询 GitHub 统计数据
要获得您已经提交和审查的 pr 的数量,您可以运行下面的脚本(添加您自己的用户名和您感兴趣的存储库—在本例中,我查询我在pandas-dev/pandas
中提交和审查了多少 pr):
您的输出将如下所示:
Merged PRs: 45
Number of reviews: 100
您可以在这里尝试查询:https://developer.github.com/v4/explorer/
参见这里的获得一个带有源代码的存储库。
用 Python 查询 Microsoft Graph API
使用微软的 REST API 和 Python 请求库获取 Azure 上的 O365 数据
介绍
为了向用户提供丰富的数据驱动体验,您可能需要将定制的应用程序与您组织的数据集成在一起。Microsoft Graph 是一个 REST API,它提供了与 Office 365 中的数据进行交互的能力。在这篇文章中,我将展示如何使用 python 连接到你的 Azure Active Directory (Azure AD)。主要步骤是在 Azure 上设置一个企业应用程序,并编写代码来处理数据。
点击此处获取此服务
创建企业应用程序
使用全局管理员帐户登录到 Azure 。
在左侧窗格中,导航至>> Azure Active Directory > >企业应用> >+新应用> >添加您自己的应用(您正在开发的应用)> >+新注册
成功注册应用程序后,您将看到以下内容;
快照
在右边,用下面的模板添加一个重定向 URL
[https://login.microsoftonline.com/<DIRECTORY (tenant) ID>/oauth2/token](https://login.microsoftonline.com/0ce08dd4-2728-49fa-8e71-acb4a3c3d145/oauth2/token')
证书&秘密
创建一个客户端密码并记录下来。
API —权限
默认情况下,Microsoft Graph 用户。添加了读取权限。为了进行演示,我将查询 O365 Planner(相当于 Trello)数据。以下是许可授予2 号 MFA 的账户。更多信息见文档
获取数据
让我们深入研究 python 脚本;
*#import libraries*
import requests
import json
import pandas as pd
import pyodbc
创建在请求中使用的令牌数据字典
app_id = 'xxxxxx' #Application Id - on the azure app overview page
client_secret = 'xxxxx' #Use the redirect URL to create a token url
token_url = '[https://login.microsoftonline.com/<DIRECTORY (tenant) ID>/oauth2/token](https://login.microsoftonline.com/0ce08dd4-2728-49fa-8e71-acb4a3c3d145/oauth2/token')'token_data = {
‘grant_type’: ‘password’,
‘client_id’: app_id,
‘client_secret’: client_secret,
‘resource’: ‘[https://graph.microsoft.com'](https://graph.microsoft.com'),
‘scope’:’[https://graph.microsoft.com'](https://graph.microsoft.com'),
‘username’:’[john.doe@companyxxx.com](mailto:helpdesk@centum.co.ke)’, #Account with no 2MFA
‘password’:’Happy2020’,
}token_r = requests.post(token_url, data=token_data)
token = token_r.json().get(‘access_token’)
测试令牌
token_r.content
在 Office 365 Planner 上创建一个计划,并创建一个组字典,如下所示:
#groups list
group_ids = {‘plannergroup01’:’xxxx-xxx–xxx-xxxx–xx',’test’:’xxxx-xxx–xxx-xxxx–xx’}#define required lists
userId,displayName,mailAddress,plans_data,planId,PlanGrpOwnerId,PlanTitle,PlanCreatedBy,bucketId,bucketName,bucketPlanId,taskId,taskPlanId,taskBucketId,taskName,taskPercentComplete,taskStartDateTime,taskDueDateTime,taskCompleteDateTime,taskIdAssignment,taskUserIdAssignment = [],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]
用户查询:
# Use the token using microsoft graph endpoints
users_url = ‘[https://graph.microsoft.com/v1.0/users?$top=500'](https://graph.microsoft.com/v1.0/users?$top=500')
headers = {
‘Authorization’: ‘Bearer {}’.format(token)
}user_response_data = json.loads(requests.get(users_url, headers=headers).text)
# user_response_data[‘[@odata](http://twitter.com/odata).nextLink’]#initial user data
#get all users
for user in user_response_data[‘value’]:
userId.append(user[‘id’])
displayName.append(user[‘displayName’])
mailAddress.append(user[‘userPrincipalName’])
users_dict = {‘userId’:userId,’displayName’:displayName,’mailAddress’:mailAddress}
users_df = pd.DataFrame(data=users_dict)#additional user query for paging
while ‘[@odata](http://twitter.com/odata).nextLink’ in user_response_data:
user_response_data = json.loads(requests.get(users_url, headers=headers).text)
if ‘[@odata](http://twitter.com/odata).nextLink’ in user_response_data:
users_url = user_response_data[‘[@odata](http://twitter.com/odata).nextLink’]
for user in user_response_data[‘value’]:
userId.append(user[‘id’])
displayName.append(user[‘displayName’])
mailAddress.append(user[‘userPrincipalName’])users_dict = {‘userId’:userId,’displayName’:displayName,’mailAddress’:mailAddress}
users_df = pd.DataFrame(data=users_dict)
users_df.head()
计划员计划查询:
#get all plansfor key, value in group_ids.items():
plans_url = ‘[https://graph.microsoft.com/v1.0/groups/'+](https://graph.microsoft.com/v1.0/groups/'+) value +’/planner/plans?$top=500'
plans_response_data = json.loads(requests.get(plans_url, headers=headers).text)for plan in plans_response_data[‘value’]:
planId.append(plan[‘id’])
PlanGrpOwnerId.append(plan[‘owner’])
PlanTitle.append(plan[‘title’])
PlanCreatedBy.append(plan[‘createdBy’][‘user’][‘id’])
plans_dict = {‘planId’:planId,’PlanGrpOwnerId’:PlanGrpOwnerId,’PlanTitle’:PlanTitle,’PlanCreatedBy’:PlanCreatedBy}
plans_df = pd.DataFrame(data=plans_dict)
计划员时段查询:
#get all buckets
for plan_id in planId:
buckets_url = ‘[https://graph.microsoft.com/v1.0/planner/plans/'+](https://graph.microsoft.com/v1.0/planner/plans/'+) plan_id +’/buckets’
buckets_response_data = json.loads(requests.get(buckets_url, headers=headers).text)
for bucket in buckets_response_data[‘value’]:
bucketId.append(bucket[‘id’])
bucketName.append(bucket[‘name’])
bucketPlanId.append(bucket[‘planId’])
bucket_dict = {‘bucketId’:bucketId,’bucketName’:bucketName,’bucketPlanId’:bucketPlanId}
bucket_df = pd.DataFrame(data=bucket_dict)
计划员任务查询:
#get all tasksfor plan_id in planId:
tasks_url = ‘[https://graph.microsoft.com/v1.0/planner/plans/'+](https://graph.microsoft.com/v1.0/planner/plans/'+) plan_id +’/tasks’
tasks_response_data = json.loads(requests.get(tasks_url, headers=headers).text)
for task in tasks_response_data[‘value’]:
taskId.append(task[‘id’])
taskPlanId.append(task[‘planId’])
taskBucketId.append(task[‘bucketId’])
taskName.append(task[‘title’])
taskPercentComplete.append(str(task[‘percentComplete’]))
if task[‘startDateTime’] is not None:
taskStartDateTime.append(datetime.strptime(task[‘startDateTime’], ‘%Y-%m-%dT%H:%M:%SZ’))
else:
taskStartDateTime.append(0)
if task[‘dueDateTime’] is not None:
taskDueDateTime.append(datetime.strptime(task[‘dueDateTime’], ‘%Y-%m-%dT%H:%M:%SZ’))
else:
taskDueDateTime.append(0)
# if task[‘completedDateTime’] is not None:
# complete_time = task[‘completedDateTime’].replace(task[‘completedDateTime’].split(‘:’)[-1],’00Z’)
# taskCompleteDateTime.append(datetime.strptime(complete_time, ‘%Y-%m-%dT%H:%M:%S%z’))
# else:
# taskCompleteDateTime.append(str(0))
for assignment in task[‘assignments’]:
taskIdAssignment.append(task[‘id’])
taskUserIdAssignment.append(assignment)tasks_dict = {‘taskId’:taskId,’taskPlanId’:taskPlanId,’taskBucketId’:taskBucketId,’taskName’:taskName,’taskPercentComplete’:taskPercentComplete,’taskStartDateTime’:taskStartDateTime,’taskDueDateTime’:taskDueDateTime,’taskCompleteDateTime’:0}
task_df = pd.DataFrame(data=tasks_dict)
将用户数据插入数据库:
下面的函数可以对上面创建的所有数据框进行复制。就我而言,我使用的是 SQL Server 2017。
server = 'SERVERNAME\INSTANCEID,64346'
database = 'GRAPHAPI'
username = 'uname'
password = 'Happy2020'def insert_user_db(users_df,server,database,username,password):#Create a connection string
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
for index in range(users_df.shape[0]):
#insert into table
try:
insert_query = “INSERT INTO GRAPHAPI.dbo.[DIM_User] ([userId],[displayName],[mailAddress]) VALUES (?,?,?)”
cursor.execute(insert_query,users_df[‘userId’][index],users_df[‘displayName’][index],users_df[‘mailAddress’][index])except:cnxn.rollback()finally:cnxn.commit()
cnxn.close()#Call the function
insert_user_db(users_df,server,database,username,password)
结论
随着微软套件服务的广泛使用,对于图形 API 请求,还有许多其他应用场景。如此巨大的数据量为组织提供了商业智能,并使开发人员能够构建数据驱动的应用程序。
使用 Python 和熊猫下载像老板一样的 Tableau 交叉表
TABLEAU REST API: TABLEAU-API-LIB 教程
如何下载 Tableau 视图数据而不丢失原始的表结构
有时你只需要行和列。(照片由尼克·希利尔在 Unsplash 拍摄)
在的另一篇文章中,我们介绍了如何像老板一样查询 Tableau 视图数据,我收到了一个人的反馈,他们想往兔子洞的更深处滚。
这就引出了本文,在本文中,我们将演示如何在 Tableau 中下载表(交叉表)的视图数据,并重建该数据在 Tableau 中的形状。
本教程介绍了如何使用 Python tableau-api-lib 包,并且是如何像使用小桶一样使用 tableau 服务器的系列教程的一部分,让您能够控制 Tableau 服务器的 REST API。
这些教程假设您已经安装了 Python 3。如果您还没有 Python 3,这将帮助您入门:安装 Python 的指南。
搭建舞台
假设您在 Tableau 中有一个交叉表,出于某种原因您需要下载它。如果你用 Tableau REST API 做这件事,你会得到你想要的数据…只是不一定是你需要的格式。
主要问题是,当您下载视图数据时,您不会以“数据透视表”或交叉表的形式获得数据。您将拥有一个数据库格式的原始表,其中所有维度都显示为列。
让我们看看如何下载数据,并把它重新做成您想要的表格或交叉表。
下面快速浏览一下 Tableau 视图,我们将下载它的数据:
我们希望下载它并保留它的行/列结构。
步骤 1:确保你已经安装了 tableau-api-lib
即使你是这些教程的专家,帮自己一个忙,下载最新版本的库。
pip install --upgrade tableau-api-lib
不熟悉 Python 这个东西?别担心,你会很快明白的。遵循本入门教程。该教程将引导您使用 tableau-api-lib 连接到 Tableau 服务器。
步骤 2:进入 Tableau 服务器环境
使用下面的代码作为连接到您的服务器的模板。在接下来的步骤中,我们将使用一次性代码行来构建这个样板文件。在本文的最后,您会发现一个合并的代码块,为了方便起见,您可以复制/粘贴它。
from tableau_api_lib import TableauServerConnection
from tableau_api_lib.utils import queryingtableau_server_config = {
'my_env': {
'server': '[https://YourTableauServer.com'](https://tableaupoc.interworks.com%27/),
'api_version': '<YOUR_API_VERSION>',
'username': '<YOUR_USERNAME>',
'password': '<YOUR_PASSWORD>',
'site_name': '<YOUR_SITE_NAME>',
'site_url': '<YOUR_SITE_CONTENT_URL>'
}
}conn = TableauServerConnection(tableau_server_config, env='my_env')
conn.sign_in()
有趣的事实:你也可以使用个人访问令牌,假设你在 Tableau Server 2019.4 或更新版本上。如果你对访问令牌很感兴趣,可以看看我的文章,了解如何使用它们的细节。
第三步:找到你要找的机器人
我们想要查询一个视图,所以首先我们需要获取所需视图的 ID 值。
site_views_df = querying.get_views_dataframe(conn)
下面是我生成的数据帧的样子:
这是一个熊猫的数据框架,包含了我们所有观点的细节。
如果我们愿意,我们可以手动搜索并复制/粘贴相关的“id”值。但是,如果您在一个大的 Tableau 环境中工作,那么您可能会有许多同名的视图。
出于这个原因,让我们以正确的方式来做这件事,并在我们的“工作簿”列中打开细节,这样我们就可以根据工作簿名称进行过滤,以确保我们确实得到了我们正在寻找的 droid。
步骤 4:提取工作簿的详细信息,这样我们可以缩小范围
使用一个方便的 tableau-api-lib 函数,我们可以很容易地解开工作簿的细节。通过参考文章末尾提供的完整代码,可以看到这个函数是如何导入的。
site_views_detailed_df = flatten_dict_column(
site_views_df, keys=['name', 'id'], col_name='workbook')
现在,我们可以快速验证生成的数据帧是否包含工作簿的详细信息:
存在两个新列:“工作簿名称”和“工作簿标识”
现在,我们可以轻松地过滤我们关心的工作簿名称。在我的例子中,工作簿被命名为“query_view_as_crosstab ”,我想下载的视图被命名为“Visual C”。为了重申之前的观点,我们希望对工作簿进行过滤,因为视图名称在整个 Tableau 站点中很可能不是唯一的,但是在工作簿中它们总是唯一的。
relevant_views_df = site_views_detailed_df[site_views_detailed_df['workbook_name'] == 'query_view_as_crosstab']
第 5 步:查询视图数据
既然我们已经将我们的视图隔离到我们感兴趣的工作簿,让我们获得目标视图的视图 ID。
visual_c_id = relevant_views_df[relevant_views_df['name'] == 'Visual C']['id'].to_list()[0]
有了视图 ID,我们现在可以查询视图数据:
view_data_raw = querying.get_view_data_dataframe(conn, view_id=visual_c_id)
tableau-api-lib 查询函数’ get_view_data_dataframe()'返回一个 Pandas DataFrame,我的是这样的:
这是一个好的开始,但是我们需要透视这些数据,以便“子类别”定义我们的行,“订单日期年”定义我们的列,并且“销售”填充透视表的值。
步骤 6:旋转数据框以生成所需的表格
在我们执行旋转表的最后一步之前,让我们快速地对数据应用一个可选的改进:将奇怪命名的“订单日期年份”列重命名为“年份”。
view_data_raw.rename(columns={'Year of Order Date': 'Year'}, inplace=True)
啊,这样好多了。现在让我们结束这一切吧!
view_data_raw.pivot_table(values=['Sales'], index=['Sub-Category'], columns=['Year'])
在我们结束今天的工作之前,让我们快速剖析一下这最后一点代码。Pandas DataFrame 'pivot_table()'函数为我们提供了一种重新定义数据结构的简单方法。
“值”参数定义了什么将填充表格的值,而“索引”值定义了行,“列”定义了…列!
这是我们现在的样子:
现在我们有了一张和最初在 Tableau 中看到的一样的桌子。
这是一个总结!
合并代码
使用 GitHub gist 作为修改我们在本教程中介绍的步骤的起点,供您自己使用。
在“数据科学家”工作面试中要问的问题
这是一个双向过程,不要错过你的机会
不溅
工作面试是一个双向过程。鉴于当前市场上平均任期较短,数据科学工作尤其如此。面试不仅是回答问题,也是提问。
不管这是你唯一的面试机会,还是你手中的众多机会之一,在面试中提问可以帮助你做出更好的决定,可以帮助你给面试官留下更深刻的印象,从而抓住你的机会。如果你完全不提问,面试官往往会有一种你不太投入的印象,或者你对这份工作太绝望了。所以,你要时刻准备几个问题!
过去几年我一直在面试很多应聘者,我相信大多数人问的问题都不够多。以下是我可能建议的一系列问题。希望其中一些对你下次面试有用。
有一点要记住:这些问题都是你应该了解雇主的事情;但是有些问题你应该间接问。哪些问题属于这一类取决于你的面试官、公司和个人风格。常识和经验仍然很重要。
策略相关问题:
- 有没有针对数据科学、机器学习和高级分析的战略?
- 战略实施的高级路线图是什么?
- 数据科学团队的长期愿景(例如 3 年计划)是什么?
- 近期的短期计划是什么(例如 6-12 个月)?目前正在进行的主要计划是什么?
- 短期和长期计划是否与具体的美元价值和硬性的最终交付成果相关联或联系在一起?
- 数据科学团队的主要职责是什么?
- 数据科学团队目前面临的最大挑战是什么?
组织相关问题:
- 组织结构图上的团队结构是怎样的?在项目可交付性、绩效等方面是否有其他报告结构??
- 团队成员的背景一般是怎样的?比如学历,技术技能,行业经验或者相关?
- 公司内部有针对数据科学家的社区或行会吗?
- 数据科学家有什么职业发展路径吗?有人成功走过旅程吗?
- 有培训机会或预算吗?在团队中是如何运作的?
技术相关问题:
- 编码和技术开发的环境是什么?有没有可以使用的平台或者只有笔记本电脑?
- 在技术和工具方面有什么偏好或限制吗?获得我想使用但不包括在技术堆栈中的特定工具、包或库的过程是什么?
- 团队常用的语言和工具有哪些?熟练程度如何?
- 如果我有任何技术问题,可以向技术负责人或专家寻求建议,还是只向我的经理寻求建议?
数据相关问题:
- 有数据目录可以搜索吗,或者有元数据可以用于 ETL 吗?
- 通常用于构建和训练模型的数据在哪里?这些数据是位于孤岛中还是集中的数据平台/湖/仓库中?
- 结构上的团队(例如,数据工程、开发运维以及软件开发)在哪里?他们如何与数据科学家合作?
- 你能给我一个项目团队的例子吗,比如他们是谁,他们做什么,从项目开始到结束的过程是什么?
- 公司内部跨团队、跨部门的协作工作流程和文化是怎样的?
项目相关问题:
- 有没有已经投入生产的数据科学项目?
- 生命周期管理的操作和监控模型是什么?
- 是否有现有的数据治理框架可以遵循或参考?是否有任何分析建模治理流程和指南?
- 数据分析、商业智能或报告团队在哪里?数据科学团队和这些团队的边界或关系是什么?
- 数据科学团队提供什么服务或产品?未来有没有优化工作的计划?
团队合作相关问题:
- 数据科学团队与其他部门或团队合作的运营模式是什么?
- 项目是由业务专家发起或请求的,还是来自数据科学团队本身?
- 公司内部是否有数据科学团队需要关注或仅限于的特定业务领域?
- 在交付模式下,我将花费在项目上的平均时间百分比是多少?
- 如果我有一些商业发展机会的想法,我是否有时间将它理想化并证明其价值,以便将其推进到项目管道中?
- 数据科学团队成员之间如何分配项目?
以上这些问题仅供大家参考。有些问题在面试中已经被提到了。虽然我很想给你做一份小抄,但是不会有现成的小抄适合你去某个公司面试。你需要做好功课,迅速选择要问的问题。尽量不要问一个你可以通过谷歌搜索公司网站或一些文章来回答的问题。
“祝你在数据科学家的面试中好运,别忘了提问!”
这篇文章在 LinkedIn 帖子 上也有。
在数据科学面试中应该问的问题
询问关于人工智能阶梯的问题
如果你从未做过数据科学家,并试图进入该领域,可能很难判断一个机会是好是坏。这是一个问各种问题的指南,可以帮助你找到答案。
人工智能阶梯
罗布·托马斯(IBM 数据和沃森人工智能总经理)将采用人工智能的路径定义为人工智能阶梯,它包含 4 个不同的部分。如果要在一个组织中恰当地采用人工智能,梯子上的每一步都必须在下一步之前完成。这个阶梯代表了 AI 所依赖的信息架构。我相信你的问题应该围绕人工智能阶梯的每个部分,因为理解阶梯(以及公司在阶梯上的位置)对于理解你可能在公司做什么是至关重要的。这里有一个人工智能阶梯的概述和一些你可以问的非威胁性问题来衡量这一点。
https://www.ibm.com/downloads/cas/3QLWB4QK
收集
没有数据就没有数据科学!有趣的是,公司并不总是拥有大量简单且可访问的数据,但仍在寻求雇佣数据科学家。我认为他们沉浸在人工智能的兴奋中,忘记了基础是数据。要通过第一关,公司必须拥有易于访问的数据。
几年前,我申请了一家大宗商品交易公司的数据科学职位,当时我还年轻,对数据科学还不熟悉,我问了一个问题,一开口就觉得很愚蠢——“你们都有什么样的数据?”这实际上是一个非常好的问题。事实证明,这家大约有 40 人的公司处理的是保存在一个位置的许多 excel 文件,没有版本控制,没有编程,每个表格都需要根据其他表格的变化频繁更新。我不确定有多少公司是这样运作的,但我确信即使是最没有经验的人读到这里也会担心。这家公司确实存在与数据相关的问题,但这并不意味着他们现在需要一名数据科学家。我认为很大一部分问题是数据科学家被视为可以解决任何数据或技术问题的独角兽,但他们通常不是公司解决数据相关问题所需的第一人。毕竟,如果没有道路,你就不会想要一辆汽车。
对于一家希望更好地利用数据的公司来说,首要任务是建立一个集中的事实来源。你实际上应该问“真理是否有一个中心来源?”或者“有数据湖吗?”这将帮助您确定该公司是否拥有开始从事数据科学所需的数据。在我前面提到的商品交易公司的例子中,答案是否定的。即使有,你可能还是想问一些额外的问题来确定你不负责保证数据的存在。我建议也问“有数据库管理员吗?”回答其中一个问题会让你更好地了解公司希望你做什么。在某些情况下,这些问题是没有用的。如果你在谷歌面试,问他们“有数据库管理员吗?”你会得到一些有趣的表情。如果你问一家咨询公司这个问题,它也可能没有意义,因为这个答案因公司的特定客户而异。
组织
一旦明确了数据的存在和可访问性,接下来您需要询问的是数据质量和组织。人工智能依赖于大量干净的数据,询问关于数据组织的问题不仅可以帮助你确定公司是否准备好进行机器学习,还可以帮助你确定公司是否准备好进行基础分析。简单分析是最容易实现的,如果你不确定公司有足够干净的数据,那么你可能会陷入困境。虽然您可能必须完成许多涉及数据清理和组织的任务,但其中一些应该由其他人来处理。像“有数据管家吗?”将帮助您确定是否要执行大量与数据科学无关的数据相关任务,如治理、保护和法规遵从性。
分析
这是你应该完全参与的人工智能阶梯的一步。它有有趣的 ML 内容,可能最初会引起你对数据科学的兴趣。在这一部分,我会问你将建立什么样的模型,我会让你的主题知识发光。你对公司业务的兴奋和好奇在这里很重要。虽然我建议你问的其他问题是为了让你了解公司,但你在这里问的问题实际上是为了让公司了解你。如果你能问一些有趣的问题,或者对公司的流程有新的想法,你就是最棒的。不幸的是,这是我在这一部分能给你的最具体的建议,因为最佳问题因公司而异。
鼓舞
最后,在现有的过程和软件中注入你的工作是很重要的,没有注入的步骤,你的工作将永远不会被使用,或者只是停留在报告中。为了确定你可能参与其中,我会问“有机器学习工程师吗?”机器学习工程师协助你的模型生产化。如果没有人做这件事,那么这通常是数据科学家的责任。这对你的工作来说可能是也可能不是一件有趣的事情,但是它绝对需要你额外的技能。另一个问题是“你如何将模型投入生产?”或者“模型是如何部署的?”最后,在这一部分,我建议问“如何监控模型?”在许多情况下,受监控和可解释的人工智能不仅在信任方面,而且在法律合规性方面都至关重要。
结论
总的来说,你可能已经注意到询问公司的其他数据工作是一个好主意。从“数据团队中还有哪些职位”开始是一个好问题,但如果你没有得到一个直截了当的答案,我会深入问一些更具体的问题,以帮助你找出该公司在人工智能阶梯上的位置。一家公司在阶梯上的位置和其他与数据相关的角色为你提供了最好的线索,让你知道你需要什么样的技能以及你将做什么。记住面试应该是双向的——你给一家公司留下多少印象,它就应该给你多少印象。
在数据科学面试中你应该问他们的问题。
如何减少获得数据科学工作时的意外…
使用关键字“数据科学采访”在 Medium 上进行快速搜索,可以找到数百篇 Medium 文章,帮助引导读者了解涵盖的概念,甚至是特斯拉、沃尔玛、Twitter、苹果、AWS 等具体公司的采访。
W 更多的文章是关于你作为受访者如何确定公司的数据科学环境、期望,以及你是否能在这家公司成长以避免噩梦般的工作。
不是每个人都会在像亚马逊这样的大公司找到数据科学的工作,你可能不得不在一些数据科学刚刚起步的公司工作,但你应该对你在那里工作期间的预期有一个很好的想法,并避免任何令人讨厌的意外。
仅通过 3 个主题,你应该能够辨别这是一份噩梦般的工作,还是你将在数据科学家的职业道路上获得支持。有些人最不希望的事情就是开始一份工作,然后离开几个月。同样,这并不意味着每份工作都很容易,你的工作应该对你有挑战性,但是是以一种好的方式。如果你喜欢真正艰难的挑战,包括改变一些公司的遗留系统/流程和官僚作风,这很好,但至少你知道自己将面临什么。
主题一:数据
我首先问的一些问题是关于数据的。作为一名数据科学家,你显然需要争论、探索、转换数据,并为你的模型提供数据。
- **您的数据是如何存储的?您的数据有多大?**如果你的数据都在一个数据湖中,你需要创建表格,现在你要知道你也是数据库专家,而不是数据科学家。确保您进入的至少是一个已经设置好的数据库。有时,公司可能正在从数据库中迁移数据,这需要一些时间。在我工作的一家初创公司,他们在不到 3 个月的时间内将全部数据从 Redshift 迁移到 Snowflake,而我工作的一家大型国际公司需要一年多的时间。
- 它多久更新一次,高层次的更新如何?我需要管理数据管道吗?(如果处理大量数据,他们应该有一名数据工程师,如果没有,你应该身兼两职)。除了您之外,应该有其他人来确保数据库得到维护。
- **数据的数据来源有哪些?**您会惊讶于一些数据是如何更新的,甚至可能是通过 Excel 上传的。理想情况下,如果你有一个产品,它会通过一个 API 或者来自一个 web 应用程序的日志。我曾在一家公司工作,那里的数据有很多来源:调查表、短信数据、电子邮件数据、CRM、API、excel 上传。确保您对数据来源的深度和多样性有所了解。
主题二:你的经理。
这个主题非常重要,也将是较长段落的主题。经理真的是你在一家公司获得成功的大门,如果你有一个糟糕的经理,但却热爱这家公司,那就更难驾驭了。我读过一本名为定位:你的思想之战的书,主要是关于市场营销和品牌形象,然而;有一段谈到了经理们是如何真正成为公司品牌形象培育的一部分的。他们会给你一些符合你兴趣的项目,或者给你一个你不知道你会喜欢但最终会喜欢的项目,因为他们理解你。一个好的经理希望你成功。我有过四个经理,让我告诉你,这是一种非常不同的体验:一个经理看到了你的价值,希望你超越,即使这意味着有时比他们自己更突出;另一个经理看到了你的价值,感到害怕,并试图阻止你获得任何项目。然而,也要小心那些相信“雇用比你聪明的人”的经理,他们把这变成了让他们的直接下属做所有艰苦的工作,而经理只是袖手旁观。确保你的经理参与其中,希望你表现出色。没有什么比经理对自己在公司扮演的角色不感兴趣更糟糕的了。
- **你的主管的背景和头衔是什么?**理想情况下,你的主管应该和你说同一种语言,尽管你的头衔越高,比如说经理、总监、副总裁或首席数据官,有时你会向更懂业务的人汇报。初创公司时,我所在的首席数据官会自己从数据库中查询,也会使用 Python。管理层理解数据和策略,但他们可能不知道为什么你的支持向量模型比你的逻辑回归模型差。如果你是一名初级甚至有经验的数据科学家,你可能更希望你的主管能指导你。这也有助于当一个项目遇到障碍时,他们将迅速彻底地了解是什么导致了延迟,并可以将信息传达给上层管理人员。
- 他们以前管理过别人吗?注意,这不是人们天生就应该偏向的东西。我以前遇到过一个经理,他从来没有管理过,花时间阅读关于管理的书籍,真正关心我的成长和发展,没有微观管理,而我曾经向一个有大量管理经验的经理汇报过,但从来没有管理过分析人员,不知道如何最好地利用我的技能。然而,这两个人之前都没有管理过数据科学家,我之前说过,当你能和你的主管说同一种语言时,会容易得多,尤其是在入门级的职位上。
- **他们有多少直接下属,他们是谁?**我不知道是否有向每位经理汇报多少名直接下属的经验法则,但经理应该能够管理每位直接下属的每周考核。这也有助于了解其他下属是谁,从而了解你的经理需要应付的工作量有多大。一个管理人员指挥一群数据科学家或分析师,与管理一个由通信、运营、财务等主题专家组成的更广泛的团队是非常不同的。与管理分析师团队的经理相比,第二个经理将不得不在团队中进行更多的上下文切换。然而,第一个经理可能在每个部门都有一名分析师,他必须理解与每个部门相关的数据中的细微差别,但他们不必像第二个经理知道得那么多,因为分析师是每个部门的中间人,每个人都将共享类似的工具,例如 SQL 和 Python 或 r。
- **经理给团队带来了哪些直接影响?**任何一个上层管理头衔都会让你瞬间联想到会议。所以,有时很难看到直接的影响,除非你和那个人在一起开会。然而,管理一个技术团队,他们应该为你的团队产生/促进过程、项目、数据产品、模型、案例研究、网络研讨会等等。就像我之前提到的那本书一样,经理不仅是帮助你树立品牌形象的重要角色,也是代表你团队品牌形象的重要角色。他们可能自己不做分析,但他们应该帮助提供一个环境,在这个环境中,通过投资于正确的工具、人员和创建那些过程,可以执行前面提到的所有事情。
- 他们心目中的团队和你的路线图是什么?这与之前关于经理如何为团队生态系统做出贡献的问题相结合。然而,有时经理从零开始构建团队,并且仍然定义其中的一些过程;他们至少应该有一个最终目标的路线图。如果经理不能清晰地描述这个路线图,即使有很多东西需要维护,这也是一个巨大的危险信号。有时候,一个经理继承了遗留系统,并试图将它们优化或移植到一个新的世界,但是他或她的团队为什么关注 X,以及你的角色如何在其中发挥作用,都应该有一个清晰的路线图。这个问题会引出现在的障碍是什么,以及他们如何看待他们的团队为公司增加价值。
- 你职业生涯的路线图是什么?公司有年度或半年的评估吗?在我所在的一家公司,你的奖金与你的年度评估挂钩,我喜欢这一点,因为这将迫使你的经理认识到你的弱点和优势,并为此奖励你。这也有助于保持记录,使促销更加顺畅。与另一家公司相比,我在他们那里有六个月的试用期,之后就没有年度评估了。后者看起来更像是公司关心他们自己,而不是员工。不是每个公司都有明确的晋升计划,包括日期和期望(这是理想的),但应该有某种对职业发展的强调,无论是学费报销、职业发展课程、奖金、加薪等。
主题 3:协作/团队环境。
- 你们公司有代码审查吗?过程是怎样的?如果你与代码、管道、模型、分析等一起工作,绝对应该有一个代码审查。我有两种类型的经历,一种是代码评审被大量实现,另一种是我实现代码评审过程的公司。两家公司都有一个 Slack 频道,当代码被推向生产时,我们会收到警报。如果一家公司将代码从开发→阶段化→产品化,那么这是一个很好的迹象,表明他们知道他们在做什么。
- **我会使用哪些类型的工具?**有工具太多和工具太少的平衡。至少对于一个分析数据的团队来说,应该有一个数据库(Redshift,Postgres,Snowflake 等),一个面向非数据分析股东的可视化工具,也称为商业智能工具(Sisense,Looker,Domo 等)——这不同于数据人在探索性数据分析期间使用开源可视化数据,一个版本控制(Github,Gitlab),用于软件构建的容器(如 Docker),管道的数据管理(Airflow 或 Luigi),通信工具(email,Slack,Zoom,JIRA 等)。
- **我是否与多名数据科学家或分析师合作,还是只有我一个人?**这个问题非常重要,尤其是如果你是一名初级员工,因为你不仅希望你的上司和你说同样的语言,还希望有其他人可以让你学习。你可能会专注于不同的部门/利益相关者/项目,但事实上,拥有类似技能的其他人是令人欣慰的,特别是如果你的团队相信交叉培训,并留出时间来合作,分享项目成果,并一起回顾过去。
- **有主题专家吗?**这非常非常重要。我怎么强调都不为过。是的,作为一名数据科学家,您可以构建一个具有高准确性、高 AUC 分数或 F1 分数的模型,但它是否可用/可实施?重要的是,数据科学家要有尽可能多的数据背景,无论是他们的背景还是对主题专家的访问。在一天结束时,我们为公司或利益相关者建立模型。此外,就训练时间/金钱而言,一个复杂的模型可以被一个更简单、更容易解释的模型击败,比如逻辑回归,只是因为使用了一些伟大的特征工程。
- **文化和工作生活平衡是什么样的?**这个问题并不专门针对数据科学团队,但了解以下情况很重要:不仅是向同一位经理汇报的团队内部,而且您如何与您将共事的其他部门沟通?我曾在一家初创公司工作,在那里,我们会与来自不同团队的其他人安排两周一次的咖啡约会,而在一家公司工作,人们彼此不认识,除非他们在那里工作了近十年,不同部门之间没有社交,这有时肯定会妨碍公司,特别是如果你们都在为一个共同的具体目标工作。我相信一个好的数据科学团队已经做了一些社交活动,因为从流程中获取数据的上下文会有很大的帮助。
感谢您的宝贵时间!我希望这是有帮助的,如果你有任何想法请在下面讨论和/或想要联系,你可以在www.monicapuerto.com。
带 R 的排队模型
r 代表工业工程师
探索“排队”R 包
图片由 Hal Gatewood 拍摄,可在 Unsplash 获得
排队论:导论
排队论是对排队等候的数学研究。排队论和模拟一样,是最广泛使用的运筹学和管理科学技术。其主要目标是建立一个模型来预测队列长度和等待时间,以做出与资源管理和分配相关的有效业务决策,从而提供给定的服务。
排队系统的组成部分
排队系统由三部分组成:到达过程、服务机制和排队规则。
- 到达流程:描述客户如何到达系统,以及客户到达的分布
- 服务机制:由服务器数量、每个服务器是否有自己的队列或有一个队列为所有服务器提供服务以及客户服务时间的分布来表达
- 排队规则:指服务员完成当前顾客的服务后,从队列中选择下一个顾客的规则(如 FIFO :先进先出;后进先出:后进先出;基于优先级;随机选择)
排队模型符号
任何队列系统的两个主要输入是:
- λ(λ):每个时间段的平均到达人数(即平均到达率)
- ( 管理部门):每个时间段平均服务的客户数(即平均服务率)
对排队系统进行分类的标准符号系统是 A/B/c/k/m,其中:
- A 表示到达过程的概率分布
- B 表示服务流程的概率分布
- c 代表通道(服务器)的数量
- k 表示排队系统中允许的最大顾客数
- m 代表客户总数的最大值
A 和 B 的常见选项有:
- M 为泊松到达分布(即指数到达间隔分布)或指数服务时间分布
- D 为确定性或常量值
- Ek 为一阶的厄朗分布 k
- G 对于均值和方差已知的一般分布
当没有指定 k 和 m 时,假设它们是无穷大。
排队 R 包包含多个用于分析排队系统的函数。对于下面的例子,让我们考虑最简单的排队系统:M/M/1,泊松到达率为每分钟 3 个顾客,指数服务时间为每分钟 4 个顾客,只有一个服务员。我们来看看 R 代码!
M/M/1 结果
汇总输出术语
- RO(ρ):整体系统利用率
- P0 :所有服务器空闲的概率
- :长期平均排队顾客数
- 【Wq】:长期平均排队时间
- X :系统吞吐量
- L :系统长期平均客户数
- W :系统长期运行的平均时间
- 【Wqq】:排队模型中有队列时的长期平均排队时间
- Lqq :排队模型中有队列时的长期平均排队顾客数
既然我们已经用报告函数获得了最相关的性能度量,那么绘制到达和服务流程的分布将会很有意思。再来看看下面的 R 代码!
到达过程的泊松分布图
间隔时间的指数分布图
服务流程的指数分布图
总结想法
根据所研究系统的复杂性,建立数学模型来预测队列长度和等待时间可能是一项具有挑战性的任务。
与前面分析的例子一样, queueing R 包只需要几行代码就可以从多个排队系统中研究和获得结果。虽然有其他可用的模拟软件可能需要您购买许可证(例如竞技场、西米奥),但 R 代表了执行基本模拟研究的另一种有效工具。
—
如果你觉得这篇文章有用,欢迎在GitHub上下载我的个人代码。你也可以直接在 rsalaza4@binghamton.edu 给我发邮件,在LinkedIn上找到我。有兴趣了解工程领域的数据分析、数据科学和机器学习应用的更多信息吗?通过访问我的媒体 简介 来探索我以前的文章。感谢阅读。
——罗伯特
快速算法查找 101
看看其他一些常见的数据科学算法。
如果你想到数据科学,你的思维往往会转向神经网络,但实际上,数据科学家会想到大量其他算法,它们有自己的优势或劣势。
当然,这些提供了一些更常用的版本,在许多情况下,还有更复杂的版本来解决问题或增加功能。然而,为了保持这篇文章简短,我只包括了更基本的版本。
我不会涵盖神经网络,因为有数百篇关于它们的文章,但是如果你想要一个快速介绍,我可以推荐我的快速介绍文章。
由格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片
在我们开始之前,我最好先看一下我将在括号中使用的几个术语的标题,以及我使用它们时的含义:
- 监督学习—数据被标记
- 无监督学习-数据未标记
- 白盒方法——可以询问算法以帮助解释其决策过程的结果
- 黑盒方法——该算法采用输入变量并提供输出(或决策),但不容易解释它是如何做到这一点的
- 回归方法——使用输入提供一个连续的输出(例如 0.0 到 2.5)
- 分类方法——使用输入提供一个离散输出(例如“红色”、“黄色”、“蓝色”)
注意当谈论带标签的数据时,这意味着我们知道结果(即,一张照片是“狗”或“猫”),并且是我们试图让机器学习算法复制的结果。对于无监督的,相当于它在数据中寻找分组和区别,但它不知道答案(即,它将所有图片分组为不同的动物类型,但它不知道一个组是“猫”,另一个是“蛇”)。
照片由 Isaac Smith 在 Unsplash 上拍摄
1.线性回归
(监督学习、白盒方法、回归方法)
用于估计基于连续变量的真实值。它通过拟合数据点的最佳拟合线来建立自变量和因变量之间的关系。这条“最佳拟合”线被称为回归线,并表示为(对于一个自变量而言):
其中:
- y-因变量
- x —独立变量
- a-回归线斜率的系数
- b —回归线截距的系数
如果要使用多个独立变量,那么就要使用多元线性回归。也可以拟合多项式和曲线。
为了拟合回归线,可以使用不同的策略,但最常见的是:
- 最小平方-这是误差平方和最小的地方
- 最大似然-这是一种概率方法,对于给定的系数(相对于其他选择),看到观察结果的可能性最大
**作者注:**如果工具有限,在 Excel 中单一和多重线性回归都是可能的
2.逻辑回归
(监督学习、白盒方法、分类方法)
线性回归的分类版本。这采用离散变量(如“是”或“否”),而不是连续变量(如 0.0 到 1.0)。它通过将逻辑函数(也称为 Logit 函数)拟合到独立变量来对其是否属于某一类进行概率评估。因此,输出将在 0.0 和 1.0 之间,这可以解释为概率。
为了快速说明其工作原理,我们将使用两个分类问题(“事件发生”和“事件未发生”)和一个独立变量 x,则 Logit 函数σ看起来像:
其中:
- Logit 函数
- y —任何实际输入
如果我们假设 y 来自独立变量的线性组合,那么在这种情况下,它看起来像:
因此,Logit 函数将变为:
F(x)可以解释为这种情况下事件发生的概率。通常,然后利用临界值来确定事件被归类为“已经发生”的概率水平,一种方法是使用 ROC 曲线和混淆矩阵进行优化。
此示例是二元逻辑回归的一个示例,其中只有两个分类可用,但是,还有许多其他形式可以执行更多分类(多项式逻辑回归),并且也能够接受更多输入变量。也存在关心分类是否有序的形式。
**作者注:**可以在 Excel 中执行二元逻辑回归(有一个或多个自变量)。然而,预计这将是一项艰巨的调试工作!
一个决策树的例子,如果它的分裂规则被画出
3.决策图表
(监督学习、白盒方法、分类方法、回归方法)
该算法的工作方式是选择最能拆分数据的输入变量(与其他输入变量相比,错误选择最少),然后根据规则(例如“如果时间大于 5 小时”)拆分数据。然后,它依次获取每组拆分的数据,然后找到下一个变量(或再次使用同一个变量)来再次拆分数据。它会一直这样做,直到形成一个决策“树”,从而产生具有相同标签的同类数据集的输出。数据科学家能够制作和研究决策流程图。这使得它不仅有助于解释结果,而且有助于嵌入到不能容纳机器学习算法的设备中。
总的来说,该算法根据最重要的输入变量不断地将数据分割成 2 个或更多的同类数据集,以尽可能多地形成不同的组。这种分割可以通过各种方法来完成,例如:
- 基尼
- 信息增益
- 卡方检验
- 熵
- 更多
但是,你会问,使用这些方法之一,如何决定拆分是好的呢?通常,分割是通过度量的变化来衡量的。通常这可能是由于杂质,其中合并的分离样品的纯度比未分离的数据小得多,并且选择降低纯度最多的分离。如果你有兴趣的话,我这里有一篇关于它的更深入的文章。
该算法能够执行回归和分类分析。
**作者注:**由于其灵活性和研究决策如何达成的能力,这种算法(以及决策森林)往往是数据科学家最常用的算法之一。它经常给出令人惊讶的好结果,可以作为以后算法的基准。
4.随机森林
(监督学习、黑盒方法、分类方法、回归方法)
在决策树之后,值得一提的是随机森林。最简单地说,随机森林就是决策树的集合,其中每棵树根据给定的数据做出自己的决定,然后进行集体投票。获胜的决策将作为输出给出。就像决策树一样,它能够进行回归和分类。
“种植”和“培育”一片森林的基本方法是“装树袋”:
- 如果训练案例的数量为 N,则通过替换抽样获得大小为 N 的样本。每次为种植的每棵树构建该样本。
- 如果有 M 个输入变量,那么这些变量中的一个随机子集(m <
- This set of m input variables and the samples data points are used to grow each tree to its fullest extent without pruning (this is where weak decisions are removed or decisions that result in a low number of resulting samples in one group are deleted from the trees decision flowchart).
The results of this method is that not every tree will see the same input data and input variables which results in a reduction in the chances of over-fitting, but also improved model performance. The disadvantages is that many trees (100s to 1000s or more) are often required and takes a large computation time as a result. One advantage is that the optimal number of trees can be found by looking at the “out-of-bag-error”. This is where for each tree is it is given the input data that was not part of the original random sample that was used to create it. The result performance of each tree is then aggregated and by looking at the error against the number of trees “planted” there will often be a plateau where no further model improvement is gained by adding more trees.
**作者注:**在过去几年中,已经开展了一些工作来提高随机森林的可解释性。其中包括功能重要性和决策路径(查看每个功能的平均响应)。
5.支持向量机(SVM)
(监督学习、黑盒方法、分类方法、回归方法)
这种算法传统上用于分类问题,但也能够回归(在这些领域中使用越来越多)。该算法的目的是插入一个平坦的边界,将类分成各自的组。在最基本的层次上,如果在一个图形上,一个类的点在左下方,而另一个类的点在右上方,该算法将插入一条从左上到右下方的线。这条线是“决策边界”,新点的分类是根据这些点落在线的哪一侧进行的。对于不容易分离的数据,SVM 会增加数据的维数(每个要素都绘制为一个坐标),直到它可以插入一个平坦的超平面边界来分隔各个类。
通常会插入边界,以便最大化每类离线最近的点之间的距离(等距),并且所涉及的数学往往会给给出可解释的结果带来很大困难。将数据(这是核函数本质上所做的)映射到更高维度使用了“核技巧”,这是一种可以拟合边界的方法,而不必经历将所有数据转换成高阶维度中的坐标的全部昂贵的计算成本。此外,因为只有靠近决策边界的数据点(这些点被称为支持向量)被用于决定在哪里放置边界,所以不需要其他点。这可以使 SVM 在能够紧凑地存储和训练模型方面具有优势。
SVM 可以是一个非常强大的工具,已经在几个不同的领域使用。比如:
- 文本分类——在识别语言的同时,也根据主题对内容进行分类
- 基因研究——基因表达的分类
- 事件检测—检测罕见事件,如安全漏洞、引擎故障等。
**作者注意到:**可以执行无监督学习的 SVM 版本是可用的,并被称为“支持向量聚类”
作者注 2: 迄今为止,机器学习的一些最强大的成果来自 SVM 和神经网络(有时在类似的挑战中竞争)
照片由 Riho Kroll 在 Unsplash 上拍摄
6.朴素贝叶斯
(监督学习、白盒方法、分类方法)
该模型使用输入变量之间的独立性假设,并利用贝叶斯定理产生一种数据分类方法。
贝叶斯定理的基本方程是:
其中:
- P(A) —独立于事件 B 观察到事件 A 的概率
- P(B) —独立于事件 A 观察到事件 B 的概率
- P(A|B) —观察到事件 A 的概率给定事件 B 已经发生
- P(B|A) —假设事件 A 已经发生,观察到事件 B 的概率
注意:P(B) > 0 和 A & B 是事件
它具有强大的优势,因为它是可解释的,易于构建,快速训练,并且可以非常快速地做出决策。这对于非常大的数据集和某些行业(如试图量化风险的行业)非常有用。众所周知,它甚至优于复杂得多的模型和方法。
**作者注:**因为该算法假设输入变量是独立的,如果它们不是独立的,那么这会强烈影响最终的模型。
7.k-最近邻(KNN)
(监督学习、黑盒方法、分类方法、回归方法)
这被广泛用于执行分类,但是回归问题也是可能的。
使用的方法是分组的方法之一。通过在特征空间中绘制点,并且添加新的数据点,在空间上为其找到最近的 K 个邻居。这种分类在最近的邻居中是最常见的。
距离度量不必是纯欧几里得的(也使用了 Manhattan 和 Minkowski),但是为 K 选择正确的值可能是该模型的挑战之一。幸运的是,模型训练非常快,但是因为它们存储所有的数据,所以它们可能很大,并且为了获得结果,计算上可能非常昂贵,因为每次都必须找到 K 个最近的邻居。
**作者指出:**在使用该模型时,所有输入变量都要标准化,这一点很重要,否则该模型会受到某些变量的更大影响,而其他变量只受其值域的影响。
8.k 均值聚类
(无监督学习、盒子方法、分类方法)
这是一个无监督机器学习算法的例子。基本方法是:
- 所有数据点都绘制在特征空间中(类似于 KNN)
- 在特征空间内植入 k 个点(随机或由数据科学家选择)
- 然后,数据点围绕这些点形成聚类。他们成为最接近他们的点的成员
- 对于每个聚类,计算中心点
- 基于它们与这些聚类中心点的距离来重新确定数据点成员资格
- 步骤 4 和 5 被重新计算,直到中心点的移动低于设定的阈值。即收敛已经发生
从表面上看,这似乎与 KNN 相似,但它以不同的方式运作。它确实存在确定要放置的初始 K 点的数量的问题,但是可以对这些进行估计。
帮助优化 K 值的方法是对每个聚类将每个聚类数据点到聚类质心的平方差相加。当这些值相加后,我们就有了每个模型的集群解决方案。通过改变 K 的值并重新计算集群解决方案,我们可以看到该值应该随着 K 值的增加而减小,但是将会有一个点,在该点处增加 K 的增益减小。这为 k 的最佳值提供了指导。
**作者注:**混合良好的数据可能很难分开。考虑两个相连的螺旋,一个标准的 K-均值将不能分开这两个。然而,有不同的方法可以解决这个问题。
结束了…或者是?
我希望这个列表已经提供了关于一些常见的数据科学算法是如何工作的(至少在高层次上)以及它们的优缺点的信息。
当然,该领域一直在不断学习和发展,这不可能是一个详尽的列表,但了解这些将有助于你了解他人。
参考源材料:
快速脏数据可视化工具箱
我给有抱负的数据科学家和分析师的建议
用这个工具箱开始你的探索
来源: Unsplash
我们大多数人需要听音乐才能理解它有多美。但通常这就是我们展示统计数据的方式:我们只展示音符,不演奏音乐。—汉斯·罗斯林
数据可视化对于理解数据分析之美至关重要。通过数据可视化,我们的利益相关者了解我们分析的影响。这有助于他们集中注意力,做出明智的决定。
然而,尽管它很重要,我总是收到有抱负的数据科学家关于他们如何开始探索数据分析的问题。
简单,数据可视化。
快速脏数据可视化工具箱
由于存在适用于各种数据集类型的常见场景,我将重点演示这些代码片段,以便您可以轻松地即插即用。
每当我进行新的数据探索和深入研究时,这些代码片段都来自我在 Google 和 Visa 的个人工作经验——这是我快速和肮脏数据可视化的工具箱。
到本文结束时,您应该开始实现这些代码,并更快、更有效地可视化您的数据。不管您的数据有多干净,您都可以直接运行这些代码并提取见解。
如果您想在 Iris 数据集和 HR 保留数据上进一步试验这些工具,请随时访问 Colab 链接并运行它们。
编辑描述
colab.research.google.com](https://colab.research.google.com/drive/1_5JgUkvrJKZwYGoNrKjpqonu5IBJL0hN?authuser=1#scrollTo=evx30_CG-pA-)
就这样,让我们开始吧!
图书馆要求
我总是推荐 Matplotlib 和 Seaborn 来完成 80%以上的典型数据可视化。如果您使用 Colab,这些库已经为您预先安装好了。如果没有,请在您的包管理器上运行以下命令。
pip install matplotlib
pip install seaborn
圆形分格统计图表
饼图对于显示要素间的计数类分布非常有用。这对于研究目标变量类的分布和根据我们的先验知识进行健全性检查非常有用。
例如,如果我们分析 Iris 数据集中的三个类,我们期望每个类的计数相似。但是在 Gmail 垃圾邮件/垃圾邮件检测中,我们预计会出现偏斜的类别分布。垃圾邮件的数量应该少于火腿的数量。
当… 存在分类目标变量时,您应该使用此选项。
实施饼图
分布图
分布图显示连续的特征分布,以直观地检测异常值、偏斜度和峰度。
它不仅帮助您了解当前分布,还帮助您了解异常值或边缘情况(如负值)。这有助于您理解数据集并设计后续的数据清理和转换。
**当……**有 n 个连续特征时,你应该用这个。
分层箱线图
分层箱线图是另一种分布可视化工具,可以直观显示每个类别的不同分布,并快速找到关键模式。
在下面的可视化中,只需快速浏览一下,您就知道class ‘setosa’
在萼片 _ 长度、花瓣 _ 长度和花瓣 _ 宽度中的分布非常低。
这使您能够快速了解什么是重要的,并允许您对数据清理和转换工作进行优先级排序。
**当……**有 n 个连续特征和分类目标特征时,应使用此选项。
因子图
Factorplot 可视化每个类别的分类计数分布,并快速找到关键模式。这是一个全新的可视化工具,不需要定制。
当… 存在一个带有分类目标特征的分类特征时,应使用此选项。
热图
热图显示了 n 个连续特征之间的相关性。与 pd 结合。DataFrame.corr(),它可视化了哪些功能相互关联。
相关性分析的目标是让您了解哪些特征相互关联,哪些特征可能会妨碍洞察生成和模型学习。
在下面的例子中,最后数字 _ 项目与最后 _ 评估和平均 _ 每月 _ 小时高度相关。这是有道理的,因为你的项目越多,你需要工作的时间就越多。
如果您将这些特征转储到回归学习模型(GLM)中,而没有正确处理它们的相关性,回归将夸大这两个特征的重要性,这两个特征本质上发送相同的信号。
当… 有 n 个连续特征时,应使用此选项
配对图
Seaborn pairplot 在每个要素对中运行类分布。Pairplot 是一种直观显示多个要素之间分布的快速方法。
潜在的警告是,如果你有许多功能,它可能是嘈杂的。但是您可以使用诸如主成分分析(PCA)之类的特征选择技术来修复和过滤特征。
当… 目标变量有 n 个连续特征时,应使用此选项
Seaborn 配对图
箱线图和散点图
这种集成进一步促进了特征到特征的关系,以影响目标变量。基于您的假设(来自 pairplot 或您自己的观察),您可以选择这些特征并快速绘制。
在下面的示例中,您可以很快看到有 3 个决定员工离职的聚类:
- 平均每月工作时间长,满意度低→过度工作和不满足
- 平均月小时数低,满意度中等→表现不佳
- 高平均月小时数,高满意度→超额完成
即使没有聚类 ML 模型,散点图也为我们提供了关于员工辞职原因的见解和假设:
- 更好的工作生活平衡(过度工作和不满足)
- 工作中更好的挑战(后进生)
- 更好的职业机会(超额完成者)
当… 有两个连续特征和目标变量时,你应该使用这个。这应该与你的假设相匹配。
最后的想法
来源 Unsplash
我相信这些代码很容易在您的第一次数据探索中直接实现。这个可视化工具箱将为您提供一个良好的开端,让您在探索和可视化数据时变得更加自信。
一如既往,如有任何问题,请通过 Linkedin 联系我。如果时间允许,我很乐意回答你的问题。
索利·德奥·格洛丽亚
关于作者
Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 开展微服务架构、商业智能和分析管道项目的相关工作经验。
Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。
他一直积极咨询 SMU BI & Analytics Club,指导有抱负的数据科学家和工程师,并为企业开发产品开放他的专业知识。
最后,请通过LinkedIn,Medium或 Youtube 频道 联系文森特
用于分类问题的快速脏 ML 工具箱
我给有抱负的数据科学家和分析师的建议
用这个工具箱启动你的 ML
来源: Unsplash
就像 100 年前电力几乎改变了一切一样,今天我实际上很难想到一个我认为 AI(人工智能)在未来几年内不会改变的行业。”~ 吴恩达
机器学习始终是成为一名成功的数据科学家和分析师的重中之重。通过机器学习,我们学会了如何运行程序,将原始数据转化为见解和预测。
然而,当你开始分析某个案例时,你会从哪里开始呢?
在这篇文章中,我想写一篇关于 ML 工具箱的文章,让你开始在一个新的数据集中探索 ML。ML 是一个迭代的过程;大多数时候,你需要通过商业问题来细化你的 ML 操作。
我真诚地希望这篇文章能够成为您对任何数据集进行初步探索的起点。我还根据自己的经验和反复探索创建了数据可视化工具箱,帮助您启动数据项目。
用这个工具箱开始你的探索
towardsdatascience.com](/quick-and-dirty-data-visualization-toolbox-a2e24f201e29)
快速和肮脏的 ML 工具箱
这些是我在 Google 和 Visa 的数据探索中反复出现的代码片段——我的快速和肮脏的 ML 探索工具箱。
到本文结束时,您应该实现这些代码并运行 ML exploration 的初始迭代。你可以按照这些步骤,提取见解。
以下是初步探索的流程:
- 数据准备
- ML 培训
- ML 评估
- (奖金)多分类器实验
在这种情况下,我们将使用人力资源保留数据 t 来模拟典型的分类目标。
谁会离开你的公司
请随意访问这个 Colab 链接并运行它们。
编辑描述
colab.research.google.com](https://colab.research.google.com/drive/1HCvusxHM-m4TJBS7VK7dDkfVyCYg6weU?authuser=1#scrollTo=nRvAoF-7B_Sl)
就这样,让我们开始吧!
图书馆要求
导入 Matplotlib 和 Seaborn 来讲述故事
对于那些不了解 Seaborn 的人来说,我很惭愧没有早点告诉你们。在我看来,这是每个数据分析师和科学家都需要熟悉的最大宝藏之一!(不开玩笑!).
Seaborn 将允许您在几秒钟内创建惊人的图形和可视化。因此,作为有效的数据科学家/分析师,这是一个非常重要的工具,可以帮助你提高讲故事的技巧。
Seaborn 是基于matplotlib的 Python 数据可视化库。它提供了一个高层次的界面来绘制有吸引力的和信息丰富的统计图形。— Seaborn Pydata Org
导入 SkLearn for ML 工具包
Scikit Learn (SkLearn)是一个用于 python 的 ML 库。它具有模块化的功能,您需要这些功能来运行各种 ML 特性,如分类、聚类和回归。
SkLearn 使用 Python 科学库,如 NumPy 和 SciPy,并支持算法,如 SVM(支持向量机)、决策树和逻辑回归。
对于本教程,我们将重点讨论决策树和逻辑回归,因为它们提供了直观的可视化表示和简单的实现。大多数时候,他们已经足够“好”了。
我的建议
我总是推荐,SkLearn,Matplotlib 和 Seaborn 来完成> 80%的典型数据可视化。如果你使用 Colab,这些库都为你准备好了。如果没有,请在您的包管理器上运行以下命令。
pip install matplotlib
pip install seaborn
pip install sklearn
数据准备
虚拟化你的分类变量
假设您有一个“大学名称”专题,其中包括诸如“哈佛”、“乔治亚理工学院”、“新加坡国立大学”等标签。对于基于距离的最大似然法,如逻辑回归和 K 近邻法(KNN),你是如何表示它们的?
当您有一个分类变量(非数字)时,您将需要创建多个虚拟特征来将分类替换为数字特征。
实体模型化删除了编码变量,并将唯一的整数值添加到 is_[feature]变量中(例如:is_harvard_graduate,is_yale_graduate)。这些用 0(假)或 1(真)表示,用于基于距离的 ML。
**当……**您将分类目标变量用于基于回归/距离的 ML 时,您应该使用这种方法。
虚拟销售和工资分类特征
特征选择
想象一下小型创业公司的人力资源保留问题。你有责任预测谁将离开你的公司。你收集了所有你能想到的数据:他们的家庭背景、工作经历和过去一年的表现。
你很高兴,因为你有 100 多个特征,并觉得足以将它们输入神经网络。
这是维度诅咒的陷阱( 理查德·e·贝尔曼 ) **。**实际上,当你有一个宽数据集但数据集短(n_features 大但数据量小)的时候。很容易使你的 ML 模型过拟合,因为它会记住给定唯一特征集的所有观察值。
解决方案是减少特性集的大小。这允许模型忽略不相关的特征并学习相关的特征。
现在,选择哪些功能?
我们使用一种简单的算法,称为递归特征消除(RFE)。该方法逐个重新运行特征的过滤,直到集合被替换为给出最佳可学习性的集合。
想象一下你的学校篮球俱乐部。每年,教练都会召集感兴趣的学生,并在每次季后赛中淘汰一些。最终的结果是一组具有一致的技能和团队合作的玩家来执行。
您可以根据功能集在一个集合中的重要性对其进行排序。
当… 有大量低观测值的特征倾向于过度拟合您的 ML 模型时,您应该使用此方法。
列车测试分离
想象一下你最近的学术考试。你是怎么准备的?有没有把所有模拟考试答案都背下来但期末考试表现不好的情况?如果是,你需要理解你的模拟考试(训练)以产生期末考试(测试)的结果。
拆分训练和测试数据集对于评估模型准确表示现实的能力非常重要。
这是一个试金石,我们用它来知道模型是欠拟合还是过拟合。
- 训练集提供了一个已知输出和一般化数据。
- 测试集评估我们的模型在未知数据集上的表现。
- 验证集测试调优评估和再培训。
当… 您评估任何 ML 模型时,您都应该使用这个。
ML 培训
逻辑回归
想象一下你现在办公室里的同事。你能选出 3 个最有可能离开小公司的人吗?
你选择了千禧一代(20-30 岁)吗?
如果我根据过去 1 年的表现向您展示谁表现出色,您觉得如何?你能猜得更好吗?
逻辑回归是一种基于概率的模型,它使用最大似然作为距离函数。它计算在给定输入的情况下预测某个值的概率。
在我看来,最好的用例之一是确定适当的权重。它们最好地解释了特征 X 的权重,这对于基于评分的检测系统(信用风险或逃跑风险)来说是方便的。
警告:小心道德问题(阅读数学毁灭武器
在下面的结果中。我们观察到,满意度 _ 结果、工作 _ 事故和工资水平对预测员工外逃风险有重要影响。
当… 运行基于回归的模型、分析其系数以及预测分类问题时,您应该使用此工具。
决策图表
决策树的目标是将数据分成组,从而最大限度地获取信息。
决策树的最大优势是直观和容易获得洞察力,即使是未经清理和非标准化的数据。它不受离群值和具有规则的分割顶部特征的影响。
在我看来,它的最佳用例是找到最能解释某一类的概要。比如离职员工的症状有:低 _ 满意度,低 _ 末位 _ 评价。
当… 您运行基于规则的模型,分析其分类剖析规则,并预测分类问题时,您应该使用此工具。
ML 评估
混淆度量和初步评估统计
混淆度量将模型预测与现实进行比较,这使我们能够了解模型性能并回答业务问题—数据学校:
- 真阳性(TP): 我们预测他会离开(他确实离开了)。
- 真正的否定(TN): 我们预测他不会离开(他没有离开)
- 假阳性(FP): 我们预测他会离开(但他没有离开)——第一类错误。
- 假阴性(FN): 我们预测他不会离开(但他确实离开了)——第二类错误。
- 进一步统计:准确率、误分类率、精确度和召回率
当… 你评估任何模型的分类问题时,你应该使用这个。
AUC ROC 曲线
AUC(曲线下面积)ROC(最佳曲线)在设置模拟中设置阈值,以测量分类判断的置信度。它通过给出一个百分比来说明模型能够在多大程度上区分类别。
AUC 越高,模型的预测就越有把握。从逻辑上讲,对于医疗和高风险环境,您希望 AUC 很高,以显示对每个判决的高度信任
而在垃圾邮件检测中,这种高标准可能是不必要的。
当… 您在将模型投入生产之前分析模型的分类问题并确定可信度时,您应该使用此工具。
具有精确回忆曲线的 ROC-AUC
(奖金)多分类器实验
在大多数情况下,您希望试验各种类型的分类模型,并确定性能最佳的模型。有许多基本款和套装款可供选择,例如:
- KNeighborsClassifier —基于实例的 ML,根据观察与其他实例的接近程度来预测类。
- 支持向量分类器-尝试基于具有最大分离距离的核来分离类。
- 决策树分类器——基于规则的 ML,通过分割特征来基于规则预测类别,启发式地给出最佳信息增益。
- 随机森林分类器-决策树集成,依赖于在不同数据和特征集上运行的多个模型。
- Ada Boost 分类器——决策树集成,它混合多个特征树桩,从头开始形成树集成。
- 等等
当… 您想要试验哪个模型给出最高的准确性(预测质量)和最小的对数损失(信息增益)时,应使用此选项。
最后的想法
来源: Unsplash
我相信这些代码很容易在您的第一次数据探索中直接实现。这个可视化工具箱将为您提供一个良好的开端,让您在探索和可视化数据时变得更加自信。
一如既往,如果你有任何问题,请通过 Linkedin 联系我。如果时间允许,我很乐意回答你的问题。
索利·德奥·格洛丽亚
关于作者
文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。
除了在谷歌的工作,Vincent 还是《走向数据科学媒体》的特约撰稿人,为全球 50 万以上的观众提供有抱负的 ML 和数据从业者的指导。
在空闲时间,文森特在佐治亚理工学院攻读硕士学位,并为铁人三项/自行车旅行进行训练。
最后,请通过 LinkedIn ,Medium或 Youtube 频道 联系文森特