假设检验折扣的提高
你的折扣策略是推动销售,还是只是让你花钱?
我打赌你知道这种感觉:一件你需要的东西正在打折,所以你高兴地把它放进你的购物车,然后开始想,“用我刚刚攒下的钱,我还能买什么?”几下点击(或在商店里转几圈),你的购物车里就有了比你想要的更多的东西。
这是一个如此普遍的现象,以至于一些零售商公开利用它。亚马逊有那些“附加”商品,如果你将它们添加到一定规模的订单中,这些商品会更便宜(或者只有现货)。我很肯定我听说过 Target 广告,这些广告开玩笑地描述了这样一种体验:去商店买一些必需品,然后带着一车你并不需要但却想要的东西离开,一旦你看到你得到了多么划算的东西。
在我的数据科学训练营的一个项目中,我被要求使用一个包含产品和销售数据的数据库来形成和测试一些假设,这些数据来自一个虚构但现实的精细食品经销商。这是 Northwind 数据库,微软创建了它作为学习如何使用他们的一些数据库产品的样本。虽然这些数据并不真的真实,但它是真实的,所以大多数时候它的表现就像你所期望的真实销售数据一样。它也非常非常干净,这在数据科学中是不寻常的。
在这篇文章中,我将带你通过一个假设检验,使用韦尔奇的 t 检验来确定顾客在得到折扣后是否会花更多的钱(剧透:他们会的!),如果是,他们又多花了多少钱。
如果“打折促销”是一个广为人知的现象,你可能会问,为什么我还要测试它存在的假设呢?嗯,如果你是一家企业,而你的折扣没有让人们花更多的钱,难道你不想知道吗?如果你的顾客真的利用折扣作为省钱的机会,而不是花同样多的钱购买更多的产品,那会怎样?在我的项目中,我定义了一个商业案例,在这个案例中,Northwind 公司的整个折扣策略正在接受检查;高管们想知道什么在起作用,效果如何,这样他们就可以在必要时做出改变。
假设来说
在继续之前,我想明确地陈述我的假设。
我的无效假设是,没有打折商品的订单的平均总金额等于至少有一个商品打折的订单的平均总金额。
我的另一个假设是,没有折扣商品的订单的平均总金额小于至少有一个商品折扣的订单的平均总金额。
因为我试图确定一个分布的均值是否大于另一个分布的均值,所以这将是一个单尾测试。
现在让我们准备好数据。
推购物车
在我从 Northwind 数据库收集的数据中,每个观察都代表客户订单中的一个独特产品。我的表中的每一行都包括订单的标识符、产品的标识符、产品的数量和单价、应用的折扣百分比(如果有的话)、产品的名称、类别(例如,“饮料”)以及代表类别的数字。我添加了一个 boolean 列来记录是否有折扣(以便于以后排序),并添加了一个计算产品单价乘以数量再乘以折扣(如果有)的列来获得订单中该产品的总价。看一看:
来自 Northwind 数据库的数据
对于我的分析,我需要按订单编号对观察结果进行分组,然后将订单分为两组:有一个或多个折扣项目的订单,以及没有折扣项目的订单。
# Assume my data is stored in a DataFrame called `df`
# Get list of orders where no items are discounted
group_by_discount_bool = pd.DataFrame(df.groupby('OrderId')['Discount_bool'].sum())
ids_no_disc = group_by_discount_bool[group_by_discount_bool.Discount_bool == 0]
ids_no_disc = list(ids_no_disc.index)
# Get list of orders with at least one discounted item
ids_with_disc = group_by_discount_bool[group_by_discount_bool.Discount_bool > 0]
ids_with_disc = list(ids_with_disc.index)
# Subset products by whether they occur in orders with discounts or not
orders_discount = df[df.OrderId.isin(ids_with_disc)]
orders_no_discount = df[df.OrderId.isin(ids_no_disc)]
# Group by order; these orders contain ONE OR MORE discounted items
orders_discount = orders_discount.groupby('OrderId')['ProductTotal'].sum()
# Group by order; these orders contain NO discounted items
orders_no_discount = orders_no_discount.groupby('OrderId')['ProductTotal'].sum()
这留给我两个一维数组( orders_discount 和 orders_no_discount ),分别包含有折扣和没有折扣的订单的总美元值。我的假设检验的目的是确定这两个数组的均值是否显著不同。
但在此之前,我们先来看看分布本身。
扭曲的观点
核密度估计图。y 轴值是概率密度值。
啊哦。
这是一些强大的积极倾斜!看起来大多数订单总额低于 5000 美元,但一些大订单给了两种分布长的右尾。我担心这些巨额订单可能并不能代表大多数客户的行为。
让我们更详细地检查一下这些分布,看看发生了什么。
有折扣和无折扣订单的箱线图和核密度估计图。
核密度估计图(右栏)告诉我,这两种分布确实有很长的右尾。盒须图(左栏)让我们更容易看到这些极值落在哪里。我想剔除这些大订单,这样我就可以把我的分析重点放在绝大多数顾客的购买行为上。
为了修整分布,我将删除超出右须的值,右须代表每个分布的四分位数范围(第 25 和第 75 个百分点之间的距离)的 1.5 倍。在这些分布的情况下,这种调整相当于可用值的 7–8%。这是我愿意做出的牺牲。
# Calculate the cutoff point (1.5*IQR + 75th percentile) for non-discounted
iqr = stats.iqr(orders_no_discount)
upper_quartile = np.percentile(orders_no_discount, 75)
cutoff = 1.5 * iqr + upper_quartile
# Remove outliers from non-discounted sample
orders_no_disc_trimmed = orders_no_discount[orders_no_discount <= cutoff]
# Calculate the cutoff point (1.5*IQR + 75th percentile) for discounted
iqr = stats.iqr(orders_discount)
upper_quartile = np.percentile(orders_discount, 75)
cutoff = 1.5 * iqr + upper_quartile
# Remove outliers from non-discounted sample
orders_disc_trimmed = orders_discount[orders_discount <= cutoff]
修剪分布的箱线图和核密度估计图
那更好。现在离群值少得多(也不那么极端),虽然分布仍然是正偏的,但它们比以前看起来更正常。
快速 Levene 检验表明这两个样本的方差在统计上没有差异。这对于我以后想要计算统计检验的能力来说是个好消息,但是 Welch 的 t 检验也可以。
测试一下
不幸的是,没有一个方便的 Python 包来执行 Welch 的 t-test,所以我编写了自己的包,并将其包装在另一个包中,该包将 t-statistics 与我选择的 alpha 值进行比较,并让我知道我是否可以拒绝(或无法拒绝)零假设。
这就是它的作用:
这产生了 p 值 0.00000355,远低于我选择的 alpha 值 0.05。我拒绝无效假设!假设没有潜在的变量在起作用,我可以自信地认为有折扣和没有折扣的订单的平均总金额之间存在统计上的显著差异。
那个肿块有多大?
现在我们知道,包含打折商品的订单往往比没有打折商品的订单要大,但是它们有多大的不同呢?为了找到答案,让我们看看效果大小,或者有折扣的平均订单和没有折扣的平均订单之间的差异。
我给自己写了一些函数来计算一个原始效果大小,用它来计算一个标准化的效果大小(科恩的 d ) ,然后把它传递给一个能量分析。请注意,我针对 Cohen 的 d 的函数考虑了两个样本可能具有不同长度和方差的可能性,并且我的功效分析将两个样本的平均长度作为观察次数(“nobs1”)。代码如下:
# Define a function to calculate Cohen's d
def cohen_d(sample_a, sample_b):
"""Calculate's Cohen's d for two 1-D arrays"""
diff = abs(np.mean(sample_a) - np.mean(sample_b))
n1 = len(sample_a)
n2 = len(sample_b)
var1 = np.var(sample_a)
var2 = np.var(sample_b)
pooled_var = (n1 * var1 + n2 * var2) / (n1 + n2)
d = diff / np.sqrt(pooled_var)
return d
# Define a function to calculate effect size and power of a statistical test
def size_and_power(sample_a, sample_b, alpha=0.05):
"""Prints raw effect size and power of a statistical test,
using Cohen's d (calculated with Satterthwaite
approximation)
Dependencies: Numpy, scipy.stats.TTestIndPower"""
effect = abs(np.mean(sample_a) - np.mean(sample_b))
print('Raw effect size:', effect)
d = cohen_d(sample_a, sample_b)
power_analysis = TTestIndPower()
sample_length = (len(sample_a) + len(sample_b)) / 2
power = power_analysis.solve_power(effect_size=d,
alpha=alpha,
nobs1=sample_length)
print('Power:', power)
这就是它的作用:
286.68 的原始效应大小意味着有折扣的平均订单总数和无折扣的平均订单总数之间的差异是 286.68 美元。0.995 的幂意味着我只有 0.05%的机会犯第二类错误(也就是假阴性)。我希望幂至少为 0.8,所以我对这个结果很满意。很有可能是我正确的检测到了一个真实存在的现象——woohoo!
TL;大卫:如果你给他们打折,他们会花更多的钱。
如果我们想知道 286.68 美元是否是一个很大的差异,我们可以对这两个样本运行我的 cohen_d() 函数,得到的值是 0.33。在科恩的 d 值的世界里,我们通常会说 0.2 是小影响,0.5 是中等影响,0.8 及以上是大影响,但这都是相对的。如果我们每年都进行这个测试,并且总是得到大约 0.2 的科恩的 d 值,那么有一年得到 0.33,我们可能会认为这在我们的特定环境中是一个很大的影响。
你可以在我的 GitHub repo 中查看我在 Northwind 数据库上的其余项目。因为我发现它既有用又漂亮,这里的是一个非常好的可视化工具,可以帮助你理解样本大小、效果大小、alpha 和功效是如何联系起来的。
跨贴自jrkreiger.net。
假设检验:分布不重要(!)
进行 t 检验,扔掉 t。剩下的也一样整洁。
1.索赔
我在网上读到过(所以这肯定是真的)优秀作家与众不同的地方在于,他们甚至在开始写作之前就知道自己的故事将如何结束。知道结局提供了方向、清晰和目标,因为他们知道他们的目标是什么。所以,我会给你这个故事的结局,妙语就在这里(此后称为“索赔”)——进行两个样本的 t 检验(或任何假设检验);现在扔掉 t 分布(零假设的分布——我们将讨论它是什么),用世界上任何其他分布代替它。新的分布可能是高斯分布,也可能是某种奇怪的多模态形状,这无关紧要。现在,如果您对任何数据使用这种“修改”的假设检验,您最终会得到与原始检验相同的性能(错误率)。从表面上看,这就像打开一辆法拉利,拆掉它的引擎,换上其他车的引擎。这辆“改装”法拉利的性能依然如故,就好像我们没有改变任何东西一样!?怎么会?
1.1 背景
好的,在这次旅程中,你需要基本的假设检验。如果你感到生疏,请点击此处。虽然这种说法适用于任何假设检验(我们将会证明),但我们将使用双样本 t 检验作为模板来比较均值,因为它是更广为人知的假设检验之一。
什么是假设检验?让我们举一个两样本 t 检验的具体例子。假设我们有一个生产给定尺寸坚果的生产流程。当然,没有一个过程是完美的,因此,生产的坚果在大小上有一些小的差异。昨天引入了一种新的自动化流程,使这一流程更加高效。我们担心这可能会改变坚果大小的分布,这是不可接受的。双样本 t 检验为我们提供了一种比较新旧流程平均规模的方法。如果新流程的平均规模有显著差异,这将是一个问题。我们所需要的是得到一些用旧工艺生产的坚果和一些用新工艺生产的坚果,并将与它们的大小相关的数据输入假设检验。
假设检验就像一个守望者,密切关注我们制造过程的质量,并在它被破坏时提醒我们。这就引出了一个问题——谁来监视守夜人?就像制造过程不是完美的一样,我们用来判断方法是否不同的假设检验也不是完美的。它可能会出错。它会犯两种错误。它可能会忽略方法上的真正差异,说实际上没有差异,或者它可能会发出错误的警报,说实际上没有差异,但实际上有差异。第一种错误被称为假阴性(我们将其标记为 b),第二种错误被称为假阳性(我们将其标记为 a)。这两种错误之间总是有一个权衡。例如,从不说有差异(测试从不返回阳性,所以没有假阳性)来获得完美的(零)假阳性率是微不足道的。但是,这种策略会导致 100%的假阴性率。类似地,可以得到零假阴性率,但是会导致 100%的假阳性率。有用的测试通常介于这两个极端之间。测试预测阳性越积极,假阳性率越高,假阴性率也越低(真正的差异不太可能被遗漏)。假阳性率和假阴性率之间的这种权衡可以在任何测试中绘制出来(见下面的图 1)。如果 test-1 的曲线低于 test-2 的曲线,我们可以说 test-1 产生的错误更少,比 test-2 更好(也称为“更强大”)。现在,让我们用双样本 t 检验来比较平均值。给了我们一个误差率的图表。如果我们用另一个任意分布来代替测试中的 t 分布,那么图表肯定会变得更糟吗?让我们看看会发生什么。
1.2 测量误差
要了解我们的测试表现如何,我们不必等待来自人造坚果的真实世界数据。只有两种可能;要么新过程导致均值改变(零假设),要么不改变(替代假设)。假设我们要做一个实验,用旧的生产工艺生产 30 个坚果,用新的生产工艺生产 30 个,并将数据传递到我们的测试中。嗯,我们可以首先假设新流程没有改变平均大小,并模拟 30 个对应于旧流程的大小和 30 个来自相同分布的新流程的大小(例如,平均大小设置为适当值和一些附加方差的正态分布)。我们知道在这种情况下各组之间没有区别,因为我们是这样模拟数据的。如果测试开始,并说它发现了均值的差异,我们知道这是一个假阳性。类似地,我们从旧流程中生成 30 个尺寸,然后从新流程中生成 30 个尺寸,这一次为新流程设置一个不同的(比如稍微高一点)值。然后,我们也将这些数据点传递给测试。我们现在希望我们的测试能找到不同之处。如果不符合,这就是假阴性。我们将我们的测试应用到这些有不同倾向的数据点上(“触发快乐”),并多次重复这个过程。这给了我们测试的假阳性对假阴性率的权衡。
1.3 插图
现在,我们继续进行上一节中描述的模拟,使用按原样应用的 t 检验,具有正确的分布。但是接下来,我们通过将测试中使用的 t 分布与其他任意分布交换来“修改”测试。我们可能预期这些修改对测试的有效性有不利影响(因此错误率更高,意味着假阳性对假阴性的权衡曲线应该向上移动)。
但是当我们实际绘制这些曲线时,下图是我们得到的结果:
图 1:用于比较平均值的双样本 t 检验框架中插入的各种零假设分布的假阳性率与假阴性率的权衡。
在该图中,我们首先使用 t 分布(根据测试要求,平均值为 0,标准差为 1),接下来我们将 t 分布替换为具有相同平均值和标准差的正态分布。接下来,我们用均值为 1、标准差为 2 的正态分布来代替它。最后,我们用均值为 0,标准差为 1 的柯西分布来代替它。对应于这些测试的假阳性率对假阴性率的线如图 1 所示。令人惊讶的是,它们都在彼此之上。因此,将 t 分布与其他不相关的分布交换对测试的性能没有任何影响!现在让我们来看看用来绘制这个图的代码。
2.创造情节
现在,让我们探索一下用来创建上面这个情节的代码。由于我们要进行 t 检验,并用其他分布替换 t 分布,所以“uno”步骤是从头开始实现双样本 t 检验。这是基于这里的描述。
从零开始的两个样本 t 检验。参见 gist at:https://gist . github . com/Ryu 577/6146 e88b 347 BC E5 a 66 DDA 168 BC 5 cefe 0
接下来,我们将它包装在一个函数中,该函数可以使用两个数组来代替原始的均值和方差。
将数组作为输入的双样本 t 检验的包装。我们也可以通过分布来作为零假设。参见 gist at:https://gist . github . com/Ryu 577/b 18 fcddaa 73216448 ef 72593 a 76 a2 d 15
现在,我们实现了一个函数,该函数模拟来自零假设和替代假设的数据,并在不同的显著性水平上生成假阳性和假阴性率,从而绘制出 alpha-beta 曲线。
在双样本 t-检验中交换各种分布来代替 t 的函数。参见代码:https://gist . github . com/Ryu 577/925 FB 03 bb2a 1869 a 60037 EEC 74 ddf cf 5
最后,将所有这些放在一起,使用两样本 t-检验中的零假设的不同分布绘制α-β图。
这将生成与我们在上一节中看到的图形非常相似的东西。
如果你不喜欢数学,这就是你把新的知识添加到你的收藏中,并骑向夕阳的地方。否则,留下来…
3.索赔的证据
首先,我们定义一些符号。我们将假设我们的测试是单侧的,另一个假设是第二总体在某些度量上更大(比如双样本 t-检验的均值)。
我们感兴趣的假设检验操作如下:
- 我们想知道一组的某些性质是否比另一组的大。
- 我们计算一个检验统计量(X ),如果第二组的性质确实比第一组大得多,那么这个检验统计量将会取大值。
- 我们从两组中随机收集一些样本,并根据这些样本计算这个检验统计量。
- 如果检验统计量如此之大,以至于看到某个事物等于或大于它的概率小于某个显著性水平α,我们拒绝零假设,并得出结论,第二组可能对所讨论的属性具有更大的值。
各种情况下测试统计量 X 的分布:
X_0:零假设下检验统计量的分布(假设我们感兴趣的度量没有差异;假设无罪——所有的审判都是从这个开始的。
Y_0:在我们测试的完美世界中,在零假设下测试统计量的分布——我们测试的所有分布假设都完全满足,独角兽跨越彩虹。
X_a:当两组之间的感兴趣度量存在差异时,交替假设下检验统计量的分布。
3.1 错误率
根据上述第四点,我们拒绝零假设的标准是(在某个显著性水平,α)😛(X≥y0)< α. But the left hand side is the probability that Y_0 will be greater than some value, which is the survival function of Y_0 (denoted S_{Y_0}). So, the probability of rejecting the null hypothesis becomes:
where in the last step, we used the fact that the survival function of any distribution is monotonically decreasing. When the null hypothesis is true, the distribution of the test statistic, X is: X ∼X_0. So the probability above becomes:
But under the null hypothesis, rejecting the null is by definition an error. So the probability above is an error rate; the rate of erroneously rejecting the null when it is true. Let’s call this false positive rate, a.
So, the significance level that leads to a false positive rate, a is given by:
Eq (1): The significance level that leads to false positive rate, a.
Similarly, under the alternate hypothesis, the distribution of the test statistic becomes: X ∼ X_a. So the probability of rejecting the null becomes:
In the case of the alternate hypothesis, we’d be making an error if we 不拒绝零假设。所以,当我们应该拒绝空值时,误差率 b 变成:
等式(2):假阴性错误率。
现在,我们希望 b 是 a 的函数(假阴性率是假阳性率的函数)。因为实际误差率的权衡才是最重要的。为了得到这个,我们可以将等式(1)代入等式(2 ),这样我们得到:
等式(3):假阴性对假阳性率的权衡。
等式(3)告诉我们,当使用假设检验时,在我们的检验的零假设中使用的分布 Y_0 与假阴性与假阳性率之间的权衡无关。这证明了我们开始写这个博客时的说法。换句话说,不管我们在双样本 t 检验中使用的 Y_0 是 t 分布,还是正态分布或柯西分布。假阴性对假阳性率的权衡(如等式(3)给出的 b 作为 a 的函数)将保持完全相同。
用人工智能创造真正的商业价值
我的使命是让数据科学家(再次)开心……同时帮助公司利用人工智能产生真正的商业价值……这是 2020 年 1 月在瑞士洛桑 EPFL 举行的应用机器学习日的演讲摘要。你也可以在 YouTube 上找到这个演讲。
我是如何完成这个任务的
在 2018 年之前,我自己也是一名不快乐的数据科学家。我从事的项目没有产生真正的商业价值。在我的团队中,我们缺少做正确事情的正确技能和工具。我们不知道如何建立一个管道或生产系统。与此同时,我们所做的事情往往没有真正的商业利益。
我很沮丧,因为我更喜欢研究有影响力的话题。
我不是市场上唯一一个有这种沮丧的人,这时我意识到问题就在眼前。
在我处理这个问题的最初几个月,我认为数据科学家的项目管理将是这个问题的和解决方案。端到端如何将您的数据项目投入生产。
当我和人们谈论这个话题时,我意识到这还不够。这里有一些来自该领域数据科学家的轶事…
来自数据科学家的轶事…熟悉吗?
以及那些在 AI 工作,但本身不是从业者的人的轶事…
这让我想到,数据科学家和公司其他人之间是否存在不匹配?
是否存在不匹配?
收集半结构化证据
在某一点上,我开始意识到这一切都是为了让公司准备好利用人工智能产生商业价值。
然而,仍然有一些悬而未决的问题,下面是我进一步探索的三个假设和收集的一些初步数据。
假设一
对工作不满意的数据科学家在那些更难从人工智能中创造商业价值的公司工作。
假设 2
公司没有用人工智能产生商业价值的主要原因是管理层缺乏人工智能素养。
假设三
为了从人工智能中产生真正的商业价值,需要在公司的多个层面上进行转型。
我用这些假设与人交往,我问了以下四个问题。
问题 1
作为一名数据科学家,是什么让你在工作中感到快乐?
问题 2
贵公司能够利用人工智能创造商业价值的主要原因是什么?
问题 3
你在工作中不开心的主要原因是什么?
问题 4
你能说说为什么你的公司不能用人工智能创造价值吗?
结果
快乐的数据科学家在他们的工作中有自由。他们在他们能够解决问题的项目上工作,他们在整个公司的跨学科项目上工作。这是惊喜吗?对我来说不是,前两点是数据科学家经常被指责的事情。也许将正确的问题放到数据科学家的桌面上很重要?
其他三个问题的结果
公司在人工智能方面取得成功的原因首先是对正在进行的项目有明确的商业价值,因此他们朝着一个目标努力。如果你现在问自己。这个应该清楚了吧?嗯,我见过很多项目开始,因为它们很酷或者只是很有趣。
管理支持非常重要,一方面是为了一个目标而努力,另一方面也是为项目提供合适资源所需的关注和能力。如果没有管理层的支持,将很难获得建立一个高效系统所需的资源。
由于缺少技能和资源,公司无法利用人工智能创造价值。一方面是使事情端到端工作的技能。另一方面是资源,即预算、技术以及 IT 或业务等不同利益相关方的时间。
如果没有端到端的承诺,那么在概念验证后基本上是向前推进,那么将很难获得最终用户的实际价值并产生底线影响。
一方面,人们经常提到的是同行对人工智能或机器学习的理解。人们不止一次地被要求做特别的报告或构建闪亮的可视化。与此同时,我感到沮丧的是,人们不明白“做人工智能”需要什么,而且原型明天就无法上线。这种缺乏素养实际上会导致错误的期望,而这又会导致双方的挫败感。
我们还看到,不快乐的数据科学家不快乐的原因与公司不成功的原因相同。是素养,是管理的承诺,是权利资源的。
重新审视假设
有了这些新获得的信息。让我们重温一下假设。
假设一
对工作不满意的数据科学家在那些更难从人工智能中创造商业价值的公司工作。
一方面这是真的,但实际上有快乐的数据科学家在还没有产生商业价值的公司工作。
当我们关注是什么让公司在人工智能方面取得成功;我们同时致力于那些让数据科学家不高兴的事情。这意味着我们有一个问题要解决。
假设 2
公司没有用人工智能产生商业价值的主要原因是管理层缺乏人工智能素养。
我还不相信这是主要原因。可能当管理层具备人工智能素养时,他们将能够提供承诺,以及缺少的技能和资源。但这就够了吗?
假设三
为了从人工智能中产生真正的商业价值,需要在公司的多个层面上进行转型。
我们需要人工智能转型。
是啊!这是我确信无疑的事情。这些问题不会在一夜之间得到解决,当然雇佣一名数据科学家是不够的。我还没有找到一个人,他有时间和技能来建立在大公司内部工作的解决方案。同时提供业务真正需要的东西。
当我们谈到转型时,我们可以想到我们的运营模式。我们需要包括必要的部分来准备公司。
- 这是关于一个的愿景和战略,在人工智能方面你想成为什么样的公司,以及你将如何实现。
- 为此你需要什么样的技术,你会购买还是制造?这对你的数据策略和结构意味着什么?
- 你需要什么样的人,你将如何招聘和培养他们?
- 你需要实施哪些流程来确保你的项目顺利进行?
- 变革管理。公司的其他人将如何为即将到来的事情做准备?
- 你做的事情是否符合 T21 GDPR 的法规,你做的事情是否合乎道德?
- 最后,围绕所有这些为治理做准备,以使其发挥作用。
我现在确信,所有这些话题都与人工智能在现实生活中的工作相关。
概括起来
让数据科学家一步步开心起来
我们可以把我们所学的放在时间轴上。我们从这位数据科学家开始,他与一家公司的领导层一起工作(1)。数据科学家很不开心,直到领导看到了曙光,变得有人工智能素养(2)。他们会采取行动,把之前提到的所有必要的东西整理好(3)。然后我们将能够成为快乐的数据科学家(4)。
如果你想从这篇文章中带走或传递一部分。就这样吧…
“希望利用人工智能造福组织的公司领导人应该在人工智能方面培养自己,并成为懂人工智能的人。这意味着不仅要了解可能的应用,还要了解如何让人工智能在他们的组织中取得成功。”
“一旦他们这样做了,他们将能够提供超越概念验证所需的承诺,并提供产生人工智能真正商业价值所需的资源和技能。”****
“最后,我们的数据科学家再次变得快乐起来。”
当然,这并不是它的终点。我会让你了解这次旅程的最新进展。更多后续!
关于我:我是一名分析顾问,也是当地一所商学院“人工智能管理”研究的主任。我的使命是让数据科学家(再次)开心,并帮助组织利用人工智能创造商业价值。 在这里报名我的简讯。
我分析了数据科学帖子的标题,以了解读者感兴趣的内容——以下是我的发现
作为一名作家,我总是想知道读者对什么帖子感兴趣,以及是否有办法让我了解这一点。
事实证明,我可以。
我所需要的只是相关的数据,并充分利用我的数据科学知识!
在这篇文章中,我将分享我通过分析 3000 多篇文章标题和它们相关的掌声所得到的发现。
和我的其他作品一样,比如:
[## 使用广义翻译向量来处理拼写错误和不在词汇表中(OOV)的单词…
我的实验和结果是用一种新颖的方法来处理拼写错误和 OOV 单词。希望你能找到他们…
towardsdatascience.com](/using-a-generalised-translation-vector-for-handling-misspellings-and-out-of-vocabulary-oov-words-494cd142cd31) [## 网络越深越好吗?案例研究
网络越深越好吗?为什么偏差/方差和预测结果的下游影响是什么?
towardsdatascience.com](/are-deeper-networks-better-a-case-study-6ee9bcb0725b)
这篇文章主要是关于数据驱动的,有很多代码片段和结果可以查看。
就这样,让我们开始吧!
研究问题
在这个项目中,有几个问题我想知道答案。
- 作家发布了什么帖子?
- 读者对哪些帖子感兴趣?
数据清理
照片由 Gaelle Marcel 在 Unsplash 上拍摄
有 3153 篇帖子的发布者被贴上了“走向数据科学”的标签。
数据清理过程并不太困难。
对于非文本列,我只需要过滤、删除空白行并转换日期。
对于文本专栏,我做了小写、删除标点符号、单词替换、词汇化,并将有意义的二元模型转换为一元模型。
以下是用于清洁过程的相关包。
正如您所看到的,典型的 numpy、pandas、re、nltk、spacy、gensim 和 maplotlib 肯定会被使用。
这里值得注意的是 pyLDAvis。
这个包为你的 LDA 模型输出提供了一个漂亮的仪表板。
它看起来会像这样:
pyLDAvis 输出示例
你可能注意到的下一件事是“display _ side _ by _ side(…)”定义。
这允许我在同一个单元格内输出两个数据框,从而非常容易地显示参考表。
display_side_by_side 定义示例
最后,我将显示列宽扩展到 100 个字符,以便能够看到完整的文章标题。
清理日期列
为了清理日期列,我简单地创建了一个定义,在将所有日期转换为日期时间格式之前,将年份“2020”附加到日期中。
没什么特别的。
以下是清理后的输出:
带有清除日期的数据帧的输出
清理标题列
为了清理标题,我使用了小写字母、删除标点符号、单词替换、词汇化,并将有意义的双字母词转换为单字母词。
小写、删除标点符号和替换单词
我做了两种类型的替换:
- 将版本号替换为“版本号”
- 将所有数字替换为“num_sub”
我做了这些替换,因为我想保留版本号和数字号可能带来的信息。
例如,在一些帖子的标题中,有很多标题看起来像“ 10 种做… ”或“ 5 种做… 的技巧和诀窍”。
从分析中移除这些数字将会丢失关于这些帖子标题是如何撰写的信息。我不放心删除这些数字,因此,我用“num _ subtoken”替换了它们。
至于版本号,一些帖子的标题被写成“… Tensorflow 2.0 … ”或其他类似的版本。
同样,我认为最好完整地保存这些信息,以便进行分析。
下面是替换后的输出示例。
令牌替换的示例
词汇化
我只应用了词汇化,并去掉了词干以保持标记的可读性。
对于那些不熟悉这两者的人来说,下面的例子可以清楚地说明两者的区别。
Stemming:
trouble -> troubl
troubling -> troubl
troubled -> troublLemmatization:
trouble -> trouble
troubling -> trouble
troubled -> trouble
我用 Spacy 做了引理化。
运行该程序后,示例结果将如下所示:
词汇化的例子
将有意义的二元模型转换为一元模型
在进行主题分析之前,我做的一件不寻常的事情是将有意义的二元模型放在一起。
我是在和新加坡式英语合作的时候学会这个窍门的。
我意识到单独分析某些令牌没有意义。
以 unigrams、神经、网络vs bigram、神经网络为例。
把 bigram " 神经网络"放在一起做题目分析不是更好吗?
也就是说,将类似于"神经网络的二元模型转换成类似于"神经网络的一元模型。
进行这种转换将有助于使主题更具可读性、可理解性和准确性。
那么,你将如何做到这一点呢?
为此,您需要利用 NLTK 库。
您可能希望使用搭配包,通过逐点相互索引(PMI)来查找共现标记。
第一步是在运行 NLTK 搭配包之前将所有句子标记成一个列表,以获得每个二元模型的 PMI 分数。
下面是"finder . score _ ngrams(score)"的输出:
[(('neural', 'network'), 65.91936507936508),
(('datum', 'science'), 63.632571637945574),
(('machine', 'learning'), 40.09489351902355),
(('artificial', 'intelligence'), 35.65887096774193),
(('how', 'to'), 27.32665009222873),
(('in', 'python'), 17.652721482339317),
(('deep', 'learning'), 16.500750302833072),
(('time', 'series'), 14.835164835164836),
(('part', 'num_sub'), 13.934801929913661),
(('jupyter', 'notebook'), 12.422360248447205),
...]
注意 NTLK 如何输出一组有意义的二元模型以及相关的分数?
在我的例子中,对于任何高于 1 分的 PMI,我创建了一个有意义的二元词典,如下所示:
{'neural network': 'neural_network',
'datum science': 'datum_science',
'machine learning': 'machine_learning',
'artificial intelligence': 'artificial_intelligence',
'how to': 'how_to',
'in python': 'in_python',
'deep learning': 'deep_learning',
'time series': 'time_series',
'part num_sub': 'part_num_sub',
'jupyter notebook': 'jupyter_notebook',
...}
一旦我创建了这样一个字典,我就创建了一个定义,用它各自的 unigram 替换每个有意义的二元模型。
下面是替换后的示例:
有意义二元模型替换的例子
注意“ scikit learn ”现在是“ scikit_learn ”。二元模型已被转换为一元模型。
有了所有这些清洁步骤,我现在准备好了我的主题分析。
基于潜在狄利克雷分配和网格搜索的主题分析
回想一下,这里的目标是回答这些问题:
- 作家发布了什么帖子?
- 读者对哪些帖子感兴趣?
为了回答这些问题,我首先需要将文章标题分解成不同的主题。
为了实现这一点,我用网格搜索运行了 LDA 主题模型。
这里是使用的 sklearn 包。
第一步是通过术语矩阵为 LDA 创建文档。
为了进行矢量化,我使用了 sklearn 的 CountVectorizer 函数。
输出形状是稀疏度为 1.32%的(3018,169)稀疏矩阵。即 1.32%的单元是非零的。
接下来要做的事情是建立我的网格搜索和绘制相关的情节。
我运行了 18 个不同的 LDA 模型,从 5 个主题到 10 个主题,学习衰减率不同——0.5,0.7 和 0.9。
之后,我提取了每个组合的对数似然分数,并绘制它们以找到最佳的主题数量。
网格搜索的结果
选择的最佳主题数量实际上是 5 个,但在试验了不同的主题后,我觉得学习衰减 0.5 的 7 个主题是一个更好的设置。
因此,我选择了后者。
看看这 7 个主题在视觉化时是如何分开的。
7 个主题在 0.5 学习衰减时的 LDA 可视化
另外,请注意将有意义的二元模型转换成一元模型是多么有用。
如您所见,LDA 现在可以将“深度学习”、“神经网络”和“数据科学”视为单个令牌,这使得主题更具可读性。
为了获得每个主题的术语相关性的表格视图,我们总是可以为它创建一个数据框。
每个主题的前 12 个术语
下一个合乎逻辑的步骤是根据相关术语标记主题类别。这比看起来要难。
以下是我标注的主题名称。(我试过了)
手动创建的主题名称
但是样本中主题的分布是怎样的呢?
主题分布输出
在这里,我们可以清楚地看到,大多数帖子属于主题 0—“特性和功能指南,关于可视化、熊猫或 jupyter 笔记本的帖子”
然而,从宏观层面来看这种主题分布是不够的。
我觉得最好是从更细的层面来看待这些话题。
跨月。
会有什么模式吗?
为了进行这种分析,我必须准备相关的分析表。
首先,我将主题表合并到主数据框中。接下来,我将日期拆分成月份。
为进一步分析准备的表格
一旦我得到了这个工作表,就该进一步分析数据了。
作家发布了什么帖子?
为了按月绘制折线图,matplotlib 接受 2 个变量列表来绘制 X 和 Y 轴。
因此,我需要执行一些分组处理来提取相关信息以形成这些列表。
处理完成后,我简单地将结果绘制出来。
每月发布的主题频率
参考表格
乍一看,你可以看出,对于主题 0,TDS 作者从 2019-01 年开始才开始发表更多关于这个主题的文章-请注意峰值
主题 1 也是如此。
为了获得更好的视角,这里是单独的地块。
每月发布的主题频率(分开)
从单个情节来看,就为主题 3 和主题 6 撰写的帖子而言,它们似乎越来越受欢迎。
而主题 2 和 5 似乎呈下降趋势。
话虽如此,这里的混淆变量是新冠肺炎疫情。
注意到大多数话题是如何在 2020 年 3 月达到峰值的吗?
我猜所有国家的封锁导致了这些峰值。
但有人可能会说,如果封锁确实是一个混淆变量,那么人们应该预计在所有话题中都会出现峰值,但这显然不是这里的情况。
尽管我相信上面的情节很好地概括了 TDS 作者所写的内容。
它仍然没有告诉我们 TDS 的读者对什么帖子感兴趣。
为了了解这一点,我决定通过鼓掌的次数来估算读者的兴趣。
读者对哪些帖子感兴趣?
了解读者兴趣的唯一方法是通过他们给每篇文章的掌声。
因此,我决定将拍手分成 4 个不同的类别。
很高兴趣:≥1000 拍
高兴趣:500 ≤拍<1000
过得去兴趣:150 ≤拍< 500
低兴趣:< 150 拍
有了这些类别箱来代理读者的兴趣,我简单地创建了一个名为“兴趣分组”的新专栏。
增加了“兴趣分组”一栏
一旦分组形成,我必须为每个主题创建子组,以获得在折线图上绘制每个主题所需的所有输入。
有了所有相关的信息,是时候逐个主题地查看结果了。
对于每个部分,我将显示每个主题的 3 个结果集。
- 每个兴趣组的帖子频率的折线图
- 参考表和术语相关性图
- 给定主题的帖子标题示例
读者兴趣分析—主题 0
主题 0 兴趣小组的频率
主题 0 的参考表
主题 0 中的文章标题示例
在这里你可以看到这个话题的大部分帖子属于“低兴趣”和“高兴趣”组。
同样清楚的是,与“高兴趣”或“非常高兴趣”组相关的帖子似乎呈下降趋势——帖子频率已降至平均水平以下。
过去一个月,与“体面兴趣”群体相关的帖子频率也有所下降。这可能预示着下降趋势的开始。
关于“低兴趣”组的帖子,有越来越多的作家发布与此话题相关的帖子。
在宏观层面上,你也可以看到趋势是如何转变的。
这个话题的高兴趣时代是从 2018 年到 2019 年年中。到 2020 年,读者的兴趣转移了,但作家似乎仍在这个主题上发表了很多文章。
这对 TDS 写手意味着什么?
- 这些趋势表明,读者不再对阅读与这个话题相关的帖子感兴趣。
- 如果你想为你的读者写一篇引人入胜的文章,你的文章可能仍然会引起不错的兴趣,但这种趋势正在迅速消失。我再等几个月。
读者兴趣分析—主题 1
主题 1 兴趣小组的频率
主题 1 的参考表
主题 1 中的文章标题示例
对于“非常高兴趣”群体,读者对该主题的兴趣似乎仅在 2018-10 至 2019-04 期间达到峰值。
几个月过去了,读者兴趣从 2019–04 年转移到 2019–09 年的“高兴趣”群体。
从 2019-04 年到 2020-03 年,可以看到从“高兴趣”群体到“体面兴趣”群体的另一次兴趣转移。
最后,从 2020 年到 2003 年,随着关于这个主题的文章数量增加,读者的兴趣减少,并落入“低兴趣”组。
这对 TDS 写手意味着什么?
- 如果你的计划是在这个话题上获得高参与度,这条船似乎早就起航了。很多关于这个话题的文章正在被撰写,但是大部分都属于“低兴趣”一类。
读者兴趣分析—主题 2
主题 2 兴趣小组的频率
主题 2 的参考表
主题 2 中的文章标题示例
在宏观层面上,如果我们看一下过去 4 个月所有利益群体,似乎作家们就这个主题发表的文章越来越少——注意所有折线图中的下降趋势。
除此之外,即使发表了文章,它们似乎也不属于“高兴趣”或“非常高兴趣”群体。
这对 TDS 作家来说意味着什么?
有两种方法可以解释这种趋势:
- 机遇。随着关于这个主题的文章越来越少,这可能是一个发表关于这个主题的杀手级帖子的好时机,这个帖子肯定会从读者倾向于在他们的提要中看到的所有其他主题中脱颖而出。
- 不是好兆头。或许,作者感觉到读者不再有兴趣阅读这些类型的帖子。你仍然可以发表与这个主题相关的帖子,但是你可以期待更低的参与度。
读者兴趣分析—主题 3
主题 3 兴趣小组的频率
主题 3 的参考表
主题 3 中的文章标题示例
这个话题很有趣,因为就跨兴趣组的帖子分布而言,23%的文章属于“非常高兴趣”组。
在过去的几个月里,你也可以清楚地看到“低兴趣”组中许多关于这个主题的文章。
除此之外,没有任何其他明确的趋势/模式。所有的趋势似乎都是零星的。
这对 TDS 写手意味着什么?
- 如果你专注于写关于这个主题的好的高质量的文章,你可能会得到很高的参与度。然而这个话题是一个拥挤的空间——2 个月内写的 60 篇文章在“低兴趣”组。
读者兴趣分析——主题 4
主题 4 兴趣小组的频率
主题 4 的参考表
主题 4 中的文章标题示例
这很难看出,但如果你关注 2018 年 7 月至 2019 年 8 月的日期范围,你会注意到大多数文章都属于“非常高兴趣”和“高兴趣”组。
几个月过去了,利息水平开始下降,主要集中在“合理利息”一组。
这对 TDS 写手意味着什么?
- 看起来这个话题对 TDS 的读者来说还是很有趣的。我认为很多读者对进入数据科学的故事感兴趣。无论是理论知识还是数据科学访谈的故事。
读者兴趣分析—主题 5
主题 5 兴趣小组的频率
主题 5 的参考表
主题 5 中的文章标题示例
这是我在解释什么类型的文章属于这个主题时最纠结的话题。
从趋势来看,在过去 3 个月中,对“体面兴趣”群体的兴趣水平呈下降趋势。在此期间,没有多少文章属于“高兴趣”或“非常高兴趣”组。
这对 TDS 写手来说意味着什么?
- 结果似乎表明读者对这个话题的兴趣下降了。如果你发表与这个话题相关的文章,你可以期待更低的参与度。
读者兴趣分析—主题 6
主题 6 兴趣小组的频率
主题 6 的参考表
主题 6 中的文章标题示例
这个话题只占所有文章的 7.3%,而且似乎正在引起人们的兴趣;尽管是零星的。
从宏观的角度来看,作家们似乎在这个话题上发表了很多。(回想一下之前关于主题 6 的图表,作者发布的帖子数量在增加)
但是从读者兴趣的角度来看,我看不到一个清晰的模式。
也许,这个题目里有“高息”。
这对 TDS 写手来说意味着什么?
- 我不确定。我认为有某种形式的兴趣。但也许,这根本就是一个糟糕的话题。我应该添加术语“使用”作为停用词,并且不应该用“ num_sub ”替换数字。
结尾注释
我们终于来到了帖子的末尾!
我想在我结束这篇文章之前,我想补充一些免责声明。
本帖的结果,如果可能的话,应该掉以轻心。
在这次分析中,我没有考虑到很多令人困惑的变量。即新冠肺炎、Medium 在 2019 年的算法变化或 Medium 随时间的增长率。
例如,由于算法的变化,鼓掌行为可能从 2019 年末开始发生了巨大变化。如果事实确实如此,那么利用掌声来引起读者兴趣的方法是有缺陷的。
除此之外,我无法解释这些年来 TDS 作者数量增加的 TDS 增长率。从逻辑上讲,更多的作者等同于更频繁的文章计数。
最后,在详细查看了所有 7 个主题之后,我可能犯了一个错误,没有在 5 个主题上停下来。理解第五题和第六题变得相当困难。
无论如何,我仍然希望你喜欢这篇文章!
所有代码都可以在我的 GitHub 中找到:
[## timtan-github/TDS-使用潜在的 Dirichlet 分配和网格搜索的后标题分析
这是一个分两部分的项目:数据收集数据分析的数据收集代码可以在这个…
github.com](https://github.com/timtan-github/TDS-Post-Title-Analysis-with-Latent-Dirichlet-Allocation-and-Gridsearch)
祝写作愉快,下一期再见!😄
再见了,朋友们!
LinkedIn 简介:蒂莫西·谭
从熨斗学校毕业后,在数据科学领域找到一份工作
阿德里安·特林考斯在 Unsplash 上拍摄的照片
办公时间
结束我的数据科学传奇
大家好,有一段时间了。对于那些一直关注我的数据科学训练营之旅的人来说,这将是我的数据科学之旅现阶段的最后一章。希望这不会是我发表的最后一篇博客,但是我想和你分享我旅程的最后一步。
两年前,也就是 2018 年 8 月,我从瑞银的理财规划师和销售顾问的工作岗位上被裁了。在意识到很难找到进入另一家公司的道路一年后,我决定通过帮助指导战略来实现我的愿望,即能够改变人们的生活。良好的策略和决策是通过对可用数据的仔细分析而制定的,而良好的商业决策也是通过这种分析而制定的。
考虑到这一点,2019 年 7 月,我在熨斗学校的沉浸式数据科学项目中开始了我的数据科学之旅。如果你一直关注我所有的博客,你会知道这是一个艰难的旅程,但我学到了难以置信的东西。我获得了许多硬技能,我可以磨练和发展这些技能,使自己成为更有吸引力的候选人,其中许多技能可以应用于不止一个行业。
很多阅读我博客的人可能会问,这很好,但是汉密尔顿现在在哪里?他毕业后是什么样子的?真的像他们广告宣传的那样神奇吗?更重要的是,人们想知道,你找到工作了吗?
是的,我做到了。
熨斗之后的艰难之路
由于博客会有点长,我将从熨斗学校为你提供的资源开始,以及毕业后的第一个 90 天是什么样子。在我的下一篇文章中,我将谈一谈我的求职过程,它有多令人沮丧,以及我最终是如何找到工作的。
所以让我们来谈谈毕业后的生活是什么样子的。首先,你必须习惯于早上不早起,不去绞尽脑汁解决前一天晚上你积极思考的数学或编码问题。第二,你必须习惯不被你的同学、你的同路人控制,在艰难的上坡路上到达终点。十五周的压力、痛苦、自我怀疑会让人们团结起来,这是任何团队建设练习都无法完成的。毕业后的第一个早晨,我深切地感受到他们的缺席。
熨斗的研究生资源
接下来你需要知道的是,毕业后,Flatiron 有两个机构帮助他们的毕业生找到工作。第一个是雇主合伙组织。第二是他们的职业指导服务。我将在下面为你一一列举:
雇主合伙集团 : 熨斗学校雇佣的猎头。他们与潜在雇主交谈,帮助协商最初的工资期望,或者安排与潜在雇主的面试,或者在某些情况下,只是给你发送一个职位空缺的链接。他们的素质因人而异。有些人试图帮你找到你梦想中的工作,有些人只是想把你塞进任何空缺的职位中,这就是“任何工作都重要”的方法。我们通常会收到他们发来的电子邮件,宣布一个空缺职位,如果你感兴趣,请回复邮件。
**职业教练服务:**熨斗学校聘请的职业教练。这些人会每周和你联系,通常是通过视频电话。他们将帮助构建求职策略,进行模拟文化面试,帮助你整理简历和 LinkedIn,并检查你的心理健康状况。他们是你的私人啦啦队长,你永远不会意识到你一直需要一个,直到你有一个。通过代理,他们也是熨斗学校毕业后的代言人。他们会检查你的每周工作追踪,以确保你符合退款保证的要求。一旦你得到退款保证,你就失去了与他们的联系。
熨斗招聘事件
毕业后你要做的第一件事就是清理你的 github,完成你的最终项目,因为雇主肯定会想谈论它。与你的教练会面,检查你的个人品牌,建立或重新格式化你的简历,让你的 LinkedIn 闪闪发光。接下来是准备熨斗的招聘活动,对我的班级来说,是在毕业后两个星期。
招聘活动是什么?Flatiron 的雇主伙伴关系小组每季度举办一次招聘会。本质上,你和所有其他软件工程和数据科学毕业生都在 WeWork 空间见面,EP 为你安排了 15 分钟的面试,面试对象是希望招聘熨斗毕业生的公司。这些基本上都是速配约会,而且会如你所料。在规定的 15 分钟内,你必须拿出你最强的“准备好给人留下深刻印象”来说服这些人让你进入下一轮更严肃的面试。我会见了三家公司。一家是基于人工智能的抵押贷款处理公司,第二家是一家主要的服装零售商,最后一家是专门为投资银行提供研究和建模的金融科技公司。其他人会见了一家与内容创作者合作的公司 Frederic Fekkai(美发沙龙/美容集团),以及一家帮助其他企业识别市场机会的公司。没有特别的主题,他们会将你与你提前指明的行业偏好相匹配。
说实话,我们都没有为招募活动做好准备。这将是我们许多人毕业后的第一次面试经历。我们都去了,因为首先“如果我真的找到工作了呢?”其次,我们都认为,即使没有任何结果,我们至少可以从数据科学面试过程中获得一些经验。我们很努力,但我们觉得比我们先毕业的那一届在这方面有更多的面试经验,很可能会进入下一轮。我们班有 10 人参加了招聘活动,6 人参加了后续面试,3 人进入了第三轮,2 人收到了录用通知,1 人被录用。
模拟面试
招聘活动结束后,我安排了熨斗公司给新毕业生的模拟技术面试。模拟面试是由一家名为 Skilled Inc .的公司运营的。他们通过签约的专业人士为各种行业提供模拟技术面试,这些专业人士希望将他们的经验货币化,并为像我这样的新手提供一些帮助。熨斗免费提供一个模拟技术,如果你想要更多,你必须自己付费。
关于我个人的模拟面试,我不打算讲太多细节。每个面试官都是不同的,他们的经历是不同的,因此他们的面试风格也是不同的。我的没有问编码或数学问题,而是详细介绍了我的项目、它的商业应用,以及如何最好地将其扩展为一个持续工作的模型。有趣的是,由于我来自销售和业务开发背景,这是一种我非常熟悉的方法。我的一个同学有一个亚马逊工程师,这对于一些严肃的 DFS 和 BFS 算法编码以及真正困难的亚马逊级 DS 问题来说是难以置信的困难。
对于那些想知道的人来说,这些面试的目的是不要成功,尽管如果你成功了那就太好了。关键是要接触到在真实面试中可能会被问到的问题类型,并突出你可能有的和需要努力的知识差距。我觉得我的面试没有让我在这方面做好准备。这在一些面试中行得通,但不是大多数。对于我那位得到了 Amazon guy 的同学来说,他在加强编码方面得到了大量有用的反馈,但在数学部分有所欠缺,直到今天他仍然对此感到有点不舒服。
在模拟技术面试之后,我和我的教练进行了模拟文化面试。这是我感觉更舒服的一种方式,在这种方式中,你努力向潜在的面试官展示你的品牌和价值。如果你对找工作认真一点,你会花大量时间打造你的品牌和信息。你应该准备好回答的最简单的问题是“告诉我关于你自己的情况”,“你为什么想在这里工作?”“你为什么从事这个职业?”
在模拟文化面试中,我拿到了一份类似上述的常见面试问题清单,并被告知要做好准备。然后我的采访被录了下来,录音被发给我进行评论。我的教练给了我极大的帮助,让我的脚本变得更加用户友好,我应该和不应该使用的时髦词汇,我过度使用的单词或短语,以及调整我的语气或肢体语言。她还给了我一些建议,告诉我雇主希望在他们的潜在候选人身上看到什么样的东西,以及一系列可以问潜在雇主的好问题。
最后,还有简历和 LinkedIn 评论。这两点通常是潜在雇主对你的第一印象,也是唯一的印象。Flatiron 为软件工程师和数据科学家提供了首选的技术简历格式。这种格式包括从对你和你的信息的标准描述开始,然后列出你的关键词搜索技巧。然后它会深入到你的项目列表中,包括使用的技术和结果。最后,列出你的工作经历,以及你希望作为附录包括的任何其他内容。看一看:
现在这种格式有几个问题,有些对我来说是特殊的,有些是一般的问题。如你所见,我的简历有两页,这很不寻常。我今年 37 岁,在银行业 10 多年,升职频繁。通常,如果我申请一份银行工作,这将是一个很好的事件序列。然而,作为一名职业改变者,我需要人们看到我的项目,并证明我有能力成为一名数据科学家,所以我的项目占据了很大的空间,我简历的其余部分致力于显示我在其他工作中做了 DS 类型的“东西”。
雇主伙伴关系对此有很大的问题,因此我没有收到他们的很多来信。他们希望我大幅缩减简历的可读性,尽管熨斗的指导方针规定,如果你有 5 年以上的工作经验,两页纸是可以接受的。因此,在我找工作大约 5 个月后,当 Flatiron 评估我的情况时,他们问 EP 为什么我没有被录用,他们指出我的简历长度是一个问题。这是我专门为 EP 准备的简历。
我将在这里花一点时间,就这个问题大声疾呼。当然,EP 有很多候选人需要他们去筛选。另一方面,我是 10 月份从 Flatiron 毕业的,到 11 月份我清理好的简历就在他们手里了。然而,不知何故,在他们整理简历、推荐工作等的整整 7 个月里,没有人费心与我或我的教练沟通,这是一个潜在的障碍?在这整整 7 个月的时间里,当我看着我的就业缺口逐月扩大时,我预算着每一分钱,担心被录用?提到我的简历太长确实是他们最起码能做的,但没人会在意?不,相反,他们只是去找那些容易跳槽的毕业生,去他妈的这个家伙和他长长的简历。
我跑题了。第二个问题是,对于许多人力资源人员来说,这种格式有点令人困惑。我不确定这种格式是否是一种标准,但我的很多回复和招聘信息都是这样的:
*“So tell me about the work you did at Yelp…”*.At which point the conversation devolves into: *“Actually, I didn’t work at Yelp, my final project utilized data from Yelp to…”* Followed by:*“Oh, I see, well we really need someone who has* (insert random skill here)*, I’ll pass on your resume and maybe we’ll reach out…”***end call**
我不知道这是谁或什么造成的,懒惰的人力资源人员还是糟糕的申请人跟踪软件。无论哪种方式,每个人都受到影响。也许我会造一个更好的 ATS,卖几百万。
开始的结束
我的求职之旅的第一部分就这样结束了。我一定会在我的下一篇帖子中写下我的求职经验和策略!下次见!
我给你带了些高清图!神经网络如何改进旧游戏
用于实时超分辨率的神经网络
铁血联盟截图(图片作者)
用于游戏图形增强的实时超分辨率(RTSR)神经网络(仅限 Nvidia GPU)
在 90 年代,当我还是个孩子的时候,我喜欢在我的电脑上玩视频游戏。在俄国,那时个人电脑还不太多,所以我的第一个游戏站是 ZS Spectrum,里面有游戏磁带。色彩鲜艳明亮的 DOS 游戏后来成了我真正的发现。对我来说,大多数现存的流派都是从 90 年代开始的。在有点怀旧之后,我决定回忆一下我的青春,在 Dosbox 模拟器上运行一个旧游戏,但受到了巨大像素和低分辨率的不愉快打击。虽然大像素的旧图形可能有其魅力,但许多人现在对这种质量不满意。
对于游戏玩家来说,提高图形质量通常至关重要。育碧在 2014 年花了大约六个月的时间为高清游戏《英雄 3》重绘纹理,并引发了人们对这款游戏的兴趣
【https://trends.google.com/trends/explore? 日期= 2012-06-01% 202020-06-25&q = % 2Fm % 2f 056 _ 97,%2Fm%2F065pfn
同样的情况也发生在 CNC 系列第一场由于高-its res remaster(红线)(https://www . ea . com/ru-ru/games/command-and-conquer/command-and-conquer-remastered)。
并不是每个游戏都值得高清重制,因为重绘图形需要花费很多精力。另一种方法是算法增强。
为了提高分辨率,消除游戏中的大像素和台阶,目前使用了各种后处理和反走样算法(更多详细信息,请参见https://vr.arvilab.com/blog/anti-aliasing),但反走样算法会导致所有令人讨厌的“模糊”图片,这往往比大像素的棱角更不可取。
但是你可以尝试使用超分辨率技术来提高图像质量。超分辨率的想法是使用神经网络来提高图像的分辨率,绘制丢失的像素。现在已经取得了令人印象深刻的结果,类似于改进 Bladerunner 电影中的图像的场景
超分辨率技术改善了图像的视觉感知,例如,这里的https://github.com/tg-bomze/Face-Depixelizer,但是给图像带来了新的信息。它可以用来提高电影质量【https://www.youtube.com/watch?v=49oj2JUtn0A【https://www.youtube.com/watch?v=3RYNThid23g】T5。然而,大多数算法都是资源密集型的,而且相当慢,我想创建一个脚本来实时改善游戏。
一点理论
以下所有内容将适用于卷积神经网络(https://en.wikipedia.org/wiki/Convolutional_neural_network),这是一种用于处理图像的神经网络子类型。首先,让我们看看神经网络如何解决超分辨率问题。该任务非常类似于自动编码器任务的解决方案(https://en.wikipedia.org/wiki/Autoencoder)。为了在输出端得到相同的图像,有必要将图像输入到网络输入端。然而,自动编码器通常用于解决高效数据压缩的问题,因此,其架构的一个特点是瓶颈——瓶颈,即具有少量神经元的网络层。这种层的存在使得剩余部分学习信息的有效编码和解码。为了训练超分辨率网络,首先有意降低高质量图像的分辨率,并将其输入神经网络。预期的输出是高质量的源图像。超分辨率任务定义了所用网络的架构。
通常,输入和输出数据之间有一个连接(跳过连接),这大大加快了学习速度。输入数据的像素大小增加,并被添加到卷积网络的输出中。因此,你不需要完全从头开始训练网络来把图像变成几乎一样的。这种联系允许训练画出通过增加像素尺寸而放大的图像和真实的高清图像之间的差异。在不同级别和通过不同层数的跳跃连接的想法是非常有效的,并导致了网络的剩余网络类的出现。如今,几乎所有流行的建筑都采用了这种连接方式。在这里可以找到解决超分辨率问题的最新架构的很好的概述(https://github.com/krasserm/super-resolution)。我的任务是创建一个神经网络来实时解决超分辨率问题。
具有四个残差块的 edsr 架构被选择为分辨率增加 4 倍(标准 edsr 具有 16 个块)。在研究和优化之后,其尺寸显著减小(非线性部分的尺寸减小了 4 个块,并且线性上采样步骤被优化而没有优化质量损失),并且速度被提高而没有显著的质量损失。一般网络架构如图所示。每个块是一个 X * Y * N 图像,其中宽度对应于通道的数量。转换—对应于 3×3 卷积(在 res 块之后激活非线性 ReLU 的情况下)。升级步骤——由于渠道变平而导致的维度增加。
超分辨率的 EDSR 卷积网络(图片作者
我提出的 RTSR 建筑(更快)(作者图片)
高质量的照片已经从https://data.vision.ee.ethz.ch/cvl/DIV2K/.下载,一般任何照片都可以。训练的代码在这里(有一些来自https://github.com/krasserm/super-resolution的函数用于数据生成器)。用于更好工作的图像大小调整是像素化游戏中最接近的方法
我要指出的是,裁员方法对培训质量影响很大。下采样的最佳方法是最近邻或中值滤波。包括像素平均的方法通常不适用。
之后,移除。/cache 文件夹并用我们的数据重新创建生成器(适当缩小)
输出是具有简单架构的相对较小(2.6 MB)的神经网络。同时,该检查给出了与预训练的 16 块网络的细微差别:
左侧—初始图像,右侧—16 块 edsr,中间 rtsr。低分辨率图像来自 Github 项目。增强图像是作者图像
运行网络
我已经在一个支持 cud nn(https://developer.nvidia.com/cudnn)的显卡(我有一个 GTX 1060 3 Gb)上启动了最终的网络,以获得高性能。以下是与 RTSR 一起玩的链接:
【https://github.com/Alexankharin/RTSR
用于推断的管道如下:
1.从区域或窗口捕捉图像
2.经由 RTSR 的图像增强
3.在新窗口中绘制增强图像
在开发过程中,我发现当在 DOSBox 模拟器中启动游戏时,分辨率是 640x480 像素,但大多数情况下它是通过将像素大小加倍来产生的,因此在增强之前,可能需要可选的初始 320x240 图像恢复步骤(我后来发现了详细信息https://www . dosgamers . com/dos/dos box-dos-emulator/screen-resolution)。
截图使用 Linux 中的 mss 库或 windows 中的 d3dshot 库
图像处理和绘图——使用 OpenCV-python 和 PIL 库。要关闭窗口,激活它并按 q 键。
脚本写在 superres_win.py 文件中。
我的 1060 3GB 笔记本电脑在 320x240 图片下提供 20–22 FPS,我发现它对于大多数类型的游戏都是可以接受的。根据基准测试http://ai-benchmark.com/ranking_deeplearning_detailed.htmlGTX 1070 和 1080 在类似的任务应该超过 1060 近 2 倍(也没有真正测试)!对于舒适的游戏来说,大约 40 的 FPS 应该足够了。下面是一段视频,展示了街机游戏的质量改进:
安装了 GTX 1060 3 GB 和 Linux 的固定 PC 只能提供 17 FPS(我还没有发现为什么模型运行得更慢)。
对于主线任务来说已经足够了:
它甚至对一些平台游戏也很有效:
如何使用:
你需要一个支持 cuda 和 cud nn(https://developer.nvidia.com/cuda-gpus)以及已安装的 cuda / cudnn 库的显卡。需要安装 python 3.7 和 TensorFlow(有 GPU 支持的 2.0 以上版本)。这可能是一项艰巨的任务,兼容性问题(【https://www.tensorflow.org/install/source_windows】T2)可能会发生。最简单的方法是安装 Anaconda 发行版(【https://www.anaconda.com/products/individual】T4),然后打开 Anaconda 提示符命令行并编写
conda install tensorflow-gpu
如果因为冲突而没有成功,那么
conda install cudnnpip install tensorflow-gpu
应该管用。
可以使用 pip 安装其他库:
pip install opencv-python
pip install mss
pip install d3dshot
pip install pywin32
D3dshot 库安装可能需要额外的步骤https://github . com/SerpentAI/d3d shot/wiki/Installation-注意:-Laptops
从 https://github.com/Alexankharin/RTSR下载并解包 EDSR 脚本和模型
使用命令运行 superres_win.py
python superres_win.py
在 7 秒钟内,你应该激活游戏窗口。将会出现一个窗口,增强您显示器的游戏区域。调整窗口捕获区域 WSAD 键。捕捉区域的大小可以用 IJKL 键来改变。将捕获区域放置到游戏中后,按 0 启动超分辨率模式。1 键或 2 键定义最初捕获的图像是否有大(2x2)像素。制作一个窗口,让你的游戏活跃起来,开始玩吧!
例子
增强前后的 MegaMan X screeenshots(图片由作者提供)
真人快打 3 屏幕截图(图片由作者提供)
凯兰迪亚传说截图(图片作者)
暗黑 2 截图(图片由作者提供)
英雄无敌截图(图片作者)
我建立了一个区块链,而我得到的只是一篇 17 页的研究论文
我的成绩是通过血、汗和泪获得的,但我不禁感到悲伤的是,这个项目并没有多少现实生活中的奖励。
由图米苏于pixabay.com
我目前是一名大学生。哇,在学校的时光真美好(感谢我要毕业了)。碰巧的是,这个故事的主要焦点发生在上学期,在所有新冠肺炎的东西加速之前。
作为一名计算机科学专业的学生,我需要完成一门名为高级研究的学期课程。这是一个非常(故意)模糊的课程名称,在这个课程中,他们希望你做的是,选择一个你认为可以应用计算机科学的问题,并研究解决方案。哦,让我们不要忘记项目的高潮,论文和演示。
该项目
我的教授(嗨!如果你正在读这篇文章),让我们根据项目想法分组(为了他和我们的利益)。我很乐意承认,我的项目想法不是我想出来的,是我的合伙人想出来的。然而,我确实热情地推动了这个项目的建设,直到今天,我的合作伙伴还会高兴地取笑我。你问的这个神秘项目是什么?
我们想建立一个使用区块链的投票系统。
点击这里查看 GitHub 上的项目(如果你想看的话,那里也有论文和演示文稿的副本)。
为什么?
嗯,我的合作伙伴对技术的信息安全领域非常感兴趣(对政治学也有热情),我喜欢挑战。这个想法引起了我的兴趣。这个挑战嘲弄了我。事实上,由于压力,我度过了许多不眠之夜,还长了几绺头发。
我们决定使用 Hyperledger Fabric (HF)来构建项目(没有 Composer)。最终,由于项目的操作系统相关部分的问题,实际的链变成了我的项目部分,我的合作伙伴在概念证明 Merkle-tree 上做了一点工作(很抱歉,但我仍然无法解释它是如何准确工作的)。
那个学期的大部分时间,我都在试图完成这个链条上的基本功能。我重新开始了很多次。我筛选了目前存在的关于 vanilla Fabric 的少量文档,试图找到答案,尽我所能进行故障排除——其中一些是中型文章,我将在下面链接。那个项目极大地考验了我的耐心,但我太固执了,无法从不那么困难的事情重新开始。
但是为什么要有投票系统呢?
我相信很多人都不知道,目前(在美国)使用的大多数投票系统/机器都经过研究,发现非常不安全。没有用确切的术语来说明原因。可能是因为很难确定这些机器是在由第三方测试之前制造和销售的。
本质上可以归结为三个可能的原因。
- 开发人员没有多少安全培训或经验。
- 公司为了省钱,偷工减料。
- 该公司几乎没有进行任何测试。
所以,这门课的目的是尝试将我们的计算机科学知识应用到现实世界的问题中,为什么不采用投票系统呢?
为什么是区块链?
由于区块链的整个前提是成为一个不可编辑的、仅附加的账本,由一个对等网络来维护,还有什么更好的办法来解决安全问题呢?由于投票被认为是一个几乎符合圣经的民主进程,再多的安全措施也不过分,对吗?
区块链的真理是,安全性的大小取决于有多少对等体参与到网络中来维护账本的完整性。由于这一点,你仍然必须满足拜占庭将军问题的要求,以便有效地保护网络,参与的对等体数量越大,欺骗网络就越困难。
一个新兴的竞争者?
所以第无数次,我让步了,重新开始,直接使用了 HF 的一个例子,并尽可能少的修改以使它工作。而且成功了!我们写了论文,做了期末报告,并获得了分数。突然之间,这个项目除了一个奇怪的一次性副业项目之外,再也没有任何意义了。在撰写论文的最后阶段,我们甚至发现弗吉尼亚州实际上有一个由 Hyperledger Fabric 支持的公开可用的(尽管是私下维护的)电子投票应用程序。
第一反应是,这让我们的项目失去了意义。然而,它没有。为什么?因为那是出于“安全原因”而私下维护的我们的是开源的。重要的区别是,我们没有任何方法来研究他们是否改善了我们发现的关于旧的(尽管目前仍在使用)投票系统的研究论文所带来的安全条件。开源 it 的想法是让维护者对社区发现的漏洞负责,并在需要的地方寻找社区人才。
经验教训
最后,我学到了新的东西,克服了巨大的挑战,并为自己做了一些我仍然感到自豪的工作。完全公开,我花了大部分时间做前端开发,我已经作为一名开发人员/初级软件工程师工作了将近两年。
我给你的建议是,新程序员,当你把基础做好了,挑战你自己。想一些非常有挑战性的事情,甚至可能是稀奇古怪的事情,经历碰壁和重新开始的动作。挑战会迫使你发现你需要解决问题的深度,或者迫使你放弃。
无论哪种方式,即使没有真正的、有形的回报——不幸的是,我仍然不能把这 100 英镑存到银行——它也会让你更多地了解你自己和你用来实现你的解决方案的技术,这比在堆栈溢出中寻找你真正在寻找的解决方案的零零碎碎要好得多。
[## 区块链 Hyperledger 结构—错误和解决方案
你好,在这篇文章中,我想分享一些你可能面临的错误和可能的解决方案。
medium.com](https://medium.com/coinmonks/hyperledger-fabric-composer-errors-solutions-827112a3fce6) [## Hyperledger Fabric 链码测试教程
大家好!我在这里向您解释我是如何创建测试环境,使我能够真正…
medium.com](https://medium.com/coinmonks/tutorial-on-hyperledger-fabrics-chaincode-testing-44c3f260cb2b) [## 在 Node.js 中开始开发 Hyperledger 结构链代码
用 Node.js 编写链代码的初学者指南
medium.com](https://medium.com/coinmonks/start-developing-hyperledger-fabric-chaincode-in-node-js-e63b655d98db) [## 了解 Hyperledger 结构-认可事务处理
Hyperledger Fabric 与许多其他区块链平台之间的一个关键区别是交易的生命周期。在…
medium.com](https://medium.com/kokster/hyperledger-fabric-endorsing-transactions-3c1b7251a709)
我用树莓派和机器学习做了一个 DIY 车牌阅读器
机器学习终于变得可行了
GIF 来自预测视频。检查结果部分。
几个月前,我开始考虑让我的汽车具有探测和识别物体的能力。我很喜欢这个想法,因为我已经看到了特斯拉的能力,虽然我不想马上买一辆特斯拉( Model 3 看起来越来越多,我不得不说),但我想我会尝试满足我的梦想。
所以,我做到了。
下面,我记录了项目中的每一步。如果你只是想看探测器运行的视频 GitHub 链接,跳到底部。
第一步。确定项目范围
我开始思考这样一个系统应该有什么能力。如果说我一生中学到了什么的话,那就是从小处着手永远是最好的策略:循序渐进。所以,除了明显的车道保持任务(每个人都已经做过了),我想到的只是在开车时简单地识别车牌。该识别过程包括 2 个步骤:
- 检测车牌。
- 识别每个牌照的边界框内的文本。
我认为,如果我能做到这一点,那么转移到其他任务应该是相当容易的(如确定碰撞风险、距离等)。甚至可能创建一个环境的向量空间表示——这将是 dope。
在过多担心细节之前,我知道我需要:
- 一种机器学习模型,将未标记的图像作为输入,并检测车牌。
- 某种硬件。粗略地说,我需要一个连接到一个或多个摄像机的计算机系统来查询我的模型。
首先,我着手建立正确的对象检测模型。
第二步。选择正确的型号
经过仔细研究,我决定采用以下机器学习模型:
- yolov 3——这是迄今为止最快的车型,可与其他最先进的车型相媲美
mAP
。该模型用于检测物体。 - CRAFT 文本检测器——用于检测图像中的文本。
- CRNN —基本上是递归的 CNN (卷积神经网络)模型。它必须是递归的,因为它需要能够将检测到的字符以正确的顺序组成单词。
这三种模式如何协同工作?嗯,操作流程是这样的:
- 首先, YOLOv3 模型检测从摄像机接收的每一帧中的每个牌照的边界框。建议预测的边界框不要太精确,包含比检测到的对象更多的内容是个好主意。如果太窄,那么后续流程的性能可能会受到影响。这与下面的模型是相辅相成的。
- CRAFT 文字检测器从 YOLOv3 处接收裁剪下来的车牌。现在,如果被裁剪的帧过于狭窄,那么很有可能会遗漏部分车牌文本,这样预测就会失败。但是当边界框更大时,我们可以让 CRAFT 模型检测字母在哪里被发现。这给了我们每个字母非常精确的位置。
- 最后,我们可以将每个单词的边界框从 CRAFT 传递给我们的 CRNN 模型来预测实际的单词。
有了我的基本模型架构草图,我可以转移到硬件上。
第三步。设计硬件
知道我需要低功率的东西让我想起了我的旧爱:树莓派。它有足够的计算能力预处理帧在一个体面的帧速率,它有 Pi 相机。Pi 相机是树莓 Pi 的实际相机系统。它有一个非常棒的图书馆,非常成熟。
至于互联网接入,我可以只扔在一个 EC25-E 的 4G 接入,也有一个 GPS 模块嵌入从我以前的一个项目。下面是第篇讲的就是这个盾。
我决定从圈地开始。把它挂在汽车的后视镜上应该效果不错,所以我最终设计了一个双组件支撑结构:
- 在后视镜的一侧,树莓 Pi + GPS 模块+ 4G 模块会留下。查看我在 EC25-E 模块上的文章,了解我对 GPS 和 4G 天线的选择。
- 另一方面,我有一个 Pi 摄像机,通过一个带有球形接头的臂来支撑。
这些支架/外壳将由我信赖的 Prusa i3 MK3S 3D 打印机打印。
图 1—Raspberry Pi+4G/GPS 屏蔽外壳
图 2 — Pi 摄像机支架,带有用于定向的球形接头
图 1 和图 2 显示了渲染时的结构。请注意, C 型支架是可插拔的,因此 Raspberry Pi 的外壳和 Pi 摄像头的支架不附带已经印刷好的支架。它们有一个插座,灯座插在上面。如果我的一个读者决定复制这个项目,这将非常有用。他们只需调整支架,就能在汽车后视镜上工作。目前,持有人在我的车上工作得很好:这是一辆路虎神行者。
图 3-Pi 摄像机支撑结构的侧视图
图 4—Pi 摄像机支撑结构和 RPi 支架的前视图
图 5——摄像机视野的想象图
图 6 —包含 4G/GPS 模块、Pi 摄像头和 Raspberry Pi 的嵌入式系统特写照片
显然,这些需要一些时间来建模——我需要几次迭代来使结构坚固。我在 200 微米的图层高度使用了PETG
材质。PETG
在 80-90 度(摄氏度)下工作良好,抗紫外线辐射能力很强——虽然没有ASA
好,但也很强。
这是在 SolidWorks 中设计的,所以我所有的SLDPRT
/ SLDASM
文件以及所有的STLs
和gcodes
都可以在这里找到。也可以使用它们来打印您的版本。
第四步。训练模型
一旦我有了硬件,我就开始训练模型。
不出所料,最好不要多此一举,尽可能重用别人的作品。这就是迁移学习的意义所在——利用来自其他超大型数据集的见解。一个非常恰当的迁移学习的例子是几天前我在这篇文章中读到的。在中间的某个地方,它谈到了一个隶属于哈佛医学院的团队,该团队能够微调一个模型来预测*“从胸片中预测长期死亡率,包括非癌症死亡”*。他们只有一个只有 50,000 张标记图像的小数据集,但他们使用的预训练模型( Inception-v4 )在大约 1400 万张图像上进行训练。他们花的时间不到原始模型训练时间的一小部分(时间和金钱),但他们已经达到了相当高的精度。
那也是我打算做的。
YOLOv3
我在网上寻找预训练的车牌模型,并没有我最初预期的那么多,但我找到了一个对大约 3600 张车牌图像进行训练的模型。虽然不多,但也比什么都没有强,除此之外,它还在 Darknet 的预训练模型上进行了训练。我可以利用这点。这是那家伙的型号。
由于我已经有了一个可以记录的硬件系统,我决定用我的在镇上开几个小时,收集帧来微调上面那个家伙的模型。
我用 VOTT 给收集到的帧做了注解(当然还有车牌)。我最终创建了一个由 534 张图片组成的小型数据集,并为车牌添加了带标签的边框。这里是数据集。
然后我找到了 YOLOv3 net 的这个 Keras 实现。我用它来训练我的数据集,然后将我的模型预测到这个 repo 中,这样其他人也可以使用它。我在测试集上得到的图是 90% ,这确实很好地给出了我的数据集有多小。
克拉夫特和 CRNN
在无数次试图找到一种好的网络来识别文本之后,我偶然发现了 keras-ocr ,这是 CRAFT 和 CRNN 的打包和灵活版本。而且还附带了他们预先训练好的模型。太棒了。我决定不对模型进行微调,让它们保持原样。
最重要的是,用keras-ocr
预测文本非常简单。基本上只有几行代码。查看他们的主页,看看是怎么做的。
第五步。部署我的车牌检测器模型
我可以采用两种主要的模型部署方法:
- 在本地进行所有的推理。
- 在云中进行推理。
这两种方法都面临着挑战。第一个意味着有一个大的“大脑”计算机系统,这是复杂和昂贵的。第二个挑战是延迟和基础设施,特别是使用 GPU 进行推理。
在我的研究中,我偶然发现了一个叫做[cortex](https://github.com/cortexlabs/cortex)
的开源项目。这对于游戏来说是相当新的,但它肯定是人工智能开发工具进化的下一步。
基本上,cortex
是一个只需轻轻一按开关,就可以将机器学习模型部署为生产 web 服务的平台。这意味着我可以专注于我的应用程序,剩下的交给cortex
来管理。在这种情况下,它在 AWS 上做所有的准备工作,我唯一要做的就是使用模板模型来编写我的预测器。更牛逼的是,每个型号我只需要写几十行。
这是从他们的 GitHub repo 中截取的cortex
在终端中的动作。如果这不是美丽和简单的,那么我不知道该叫它什么:
来源: Cortex GitHub
由于这个计算机视觉系统不是由自动驾驶仪使用的,所以延迟对我来说并不重要,为此我可以选择cortex
。如果它是自动驾驶系统的一部分,那么使用通过云提供商提供的服务就不是一个好主意,至少现在不是。
使用cortex
部署 ML 模型只是一个问题:
- 定义
cortex.yaml
文件,这是我们的 API 的配置文件。每个 API 将处理一种类型的任务。我分配的yolov3
API 用于检测给定帧上的车牌边框,crnn
API 用于使用工艺文本检测器和 CRNN 预测车牌号码。 - 定义每个 API 的预测值。基本上,在
cortex
中定义一个特定类的predict
方法来接收一个有效载荷(所有的 servy 部分都已经被平台处理了),使用有效载荷预测结果,然后返回预测结果。就这么简单!
在不深入我是如何做到这一点的具体细节的情况下(为了让文章保持一个适当的长度),这里有一个经典虹膜数据集的预测器的例子。cortex 实现这两个 API 的链接可以在上找到,他们的资源库在这里——这个项目的所有其他资源都在本文的末尾。
# predictor.pyimport boto3
import picklelabels = ["setosa", "versicolor", "virginica"]
class PythonPredictor:
def __init__(self, config):
s3 = boto3.client("s3")
s3.download_file(config["bucket"], config["key"], "model.pkl")
self.model = pickle.load(open("model.pkl", "rb")) def predict(self, payload):
measurements = [
payload["sepal_length"],
payload["sepal_width"],
payload["petal_length"],
payload["petal_width"],
] label_id = self.model.predict([measurements])[0]
return labels[label_id]
然后做一个预测,你就像这样用curl
curl [http://***.amazonaws.com/iris-classifier](http://***.amazonaws.com/iris-classifier) \
-X POST -H "Content-Type: application/json" \
-d '{"sepal_length": 5.2, "sepal_width": 3.6, "petal_length": 1.4, "petal_width": 0.3}'
预测响应看起来像这样"setosa"
。很简单!
第六步。开发客户端
有了cortex
来处理我的部署,我可以继续设计客户端——这是棘手的部分。
我想到了以下架构:
- 从 Pi 摄像机中以 30 FPS 的速度采集分辨率合适的帧( 800x450 或 480x270 ),并将每一帧推入一个公共队列。
- 在一个单独的进程中,我将从队列中取出帧,并将它们分发给不同线程上的许多工作线程。
- 每个工作线程(我称之为推理线程)都会向我的
cortex
API 发出 API 请求。首先,向我的yolov3
API 发出一个请求,然后,如果检测到任何牌照,向我的crnn
API 发出另一个请求,请求一批被裁剪的牌照。响应将包含文本格式的预测车牌号码。 - 将每个检测到的牌照(有或没有识别的文本)推送到另一个队列,最终将其广播到浏览器页面。同时,还将板号预测推送到另一个队列,以便稍后保存到磁盘(以
csv
格式)。 - 广播队列将接收一堆无序的帧。其消费者的任务是在每次向客户端广播新的帧时,通过将它们放置在非常小的缓冲区(几个帧大小)中来对它们进行重新排序。该使用者正在单独运行另一个进程。这个消费者还必须设法将队列的大小保持在一个指定的值,以便帧能够以一致的帧速率显示,即 30 FPS。显然,如果队列大小下降,那么帧速率的下降是成比例的,反之亦然,当队列大小增加时,帧速率也成比例地增加。最初,我想实现一个滞后函数,但我意识到这会给流一种非常不稳定的感觉。
- 与此同时,在主进程中会有另一个线程运行,从另一个队列中提取预测和 GPS 数据。当客户端收到终止信号时,预测、GPS 数据和时间也被转储到一个
csv
文件中。
这里是与 AWS 上的云 API 相关的客户端的流程图。
图 7 —客户端流程图以及配备 cortex 的云 APIs】
在我们的例子中,客户端是 Raspberry Pi,推理请求发送到的云 API 是由 AWS 上的cortex
提供的( Amazon Web Services )。
客户端的源代码也可以在其 GitHub 库上查看。
我必须克服的一个特殊挑战是 4G 网络的带宽。最好降低该应用程序所需的带宽,以减少可能的挂起或对可用数据的过度使用。我决定在 Pi 摄像头上使用非常低的分辨率:480x270
(我们可以使用小分辨率,因为 Pi 摄像头的视野非常窄,所以我们仍然可以轻松识别车牌)。尽管如此,即使在这个分辨率下,一帧的 JPEG 大小在 10 兆比特时也有 100KB 左右。乘以每秒 30 帧得到 3000KB,大约是 24 Mb/s,这还不包括 HTTP 开销——这是一个很大的数目。
相反,我做了以下几招:
- 将宽度缩小到 416 像素,这正是 YOLOv3 模型调整图像的大小。规模显然保持完整。
- 已将图像转换为灰度。
- 移除图像顶部 45%的部分。这种想法是,车牌不会出现在画面的顶部,因为汽车不会飞,对吗?据我所见,剪切掉 45%的图像不会影响预测器的性能。
- 再次将图像转换为 JPEG,但质量较低。
最终得到的帧大小约为 7–10KB,非常好。这相当于 2.8Mb/s。但是加上所有开销,大约是 3.5Mb/s(包括响应)。
对于crnn
API,即使没有应用压缩技巧,裁剪后的车牌也不会占用太多时间。他们坐在大约 2-3KB 的一块。
总而言之,要以 30FPS 的速度运行,推理 API 所需的带宽大约是 6Mb/s。这个数字我可以接受。
结果
有用!
上面的例子是通过cortex
运行推理的实时例子。我需要大约 20 个配备 GPU 的实例才能顺利运行。根据集群的延迟,您可能需要更多或更少的实例。从一帧被捕获到广播到浏览器窗口的平均延迟大约为 0.9 秒,考虑到推断发生在很远的某个地方,这真是太不可思议了——这仍然让我感到惊讶。
文本识别部分可能不是最好的,但它至少证明了这一点——通过提高视频的分辨率、缩小摄像头的视野或进行微调,它可以更加准确。
至于高 GPU 数量,这可以通过优化来减少。例如,转换模型以使用混合/全半精度( FP16/BFP16 )。一般来说,让模型使用混合精度将对精度产生最小的影响,所以我们不会有太大的损失。
T4 和 V100 GPUs 具有特殊的张量核,在半精度类型的矩阵乘法上速度超快。与单精度运算相比,半精度运算在 T4 上的加速比约为 8 倍,在 V100 上为 10 倍。这是一个数量级的差异。这意味着,已经转换为使用单精度/混合精度的模型进行推理所需的时间可以减少 8 倍,而在 V100 上只需十分之一的时间。
我没有将模型转换为使用单精度/混合精度,因为这超出了本项目的范围。在我看来,这只是一个优化问题。我最有可能在cortex
的版本0.14
发布时这样做(具有真正的多进程支持和基于队列的自动伸缩),这样我也可以利用多进程 web 服务器。
总而言之,如果所有优化都到位,将集群的大小从 20 个配备 GPU 的实例减少到只有一个实例实际上是可行的。如果适当优化,甚至不可能最大化一个配备 GPU 的实例。
为了让成本更容易接受,在 AWS 上使用弹性推理可以减少高达 75%的成本,这是一个很大的数目!打个比方,你可以花一毛钱买一个管道来实时处理一个流。不幸的是,目前cortex
还不支持弹性推理,但我可以预见在不久的将来它会得到支持,因为它已经引起了他们的注意。见票cortexlabs/cortex/issues/618。
注意:YOLOv3 和 CRNN 模型,可以通过在更大的数据集(大约 50-100k 个样本)上对它们进行微调来大大改进。在这一点上,即使帧的大小可以进一步减少,以减少数据的使用,而不会失去太多的准确性:“补偿某处,以便能够从其他地方”。这与将所有这些模型转换为使用半精度类型(以及可能的弹性推理)相结合,可以构成一个非常高效/划算的推理机。
更新一
有了支持 web 服务器多进程工作器的cortex
版本0.14
,我能够将yolov3
API 的 GPU 实例数量从 8 个减少到 2 个,将crnn
API(在 CRNN 和 CRAFT 模型上运行推理)的 GPU 实例数量从 12 个减少到 10 个。这实际上意味着实例总数减少了 40%,这是一个非常好的收获。所有这些实例都配备了单个 T4 GPU 和 4 个虚拟 CPU。
我发现计算最密集的模型是 CRAFT 模型,它是建立在大约 138 米重的 VGG-16 模型之上的。请记住,每一帧通常需要多个推断,因为在一个镜头中可能会有多个检测到的车牌。这大大增加了 it 的计算需求。从理论上讲, CRAFT 模型应该被淘汰,取而代之的是改进(微调)CRNN 模型,以更好地识别车牌。通过这种方式,crnn
API 可以缩小很多——减少到只有 1 或 2 个实例。
更新二
其他一些可以显著降低计算成本的因素包括:
- 使用 TinyYOLOv3 代替 YOLOv3 。运行一个推理大约需要 12 倍的时间。运行不太复杂的模型时丢失的映射可以通过在更全面的数据集上训练模型来恢复。
- 使用对象跟踪来避免必须检测每一帧上的牌照。这大大减少了两个 API 所需的推理总数。目标跟踪应该在本地完成,因为它在计算上是廉价的。
- 此外,我们不一定需要所有类型的锚盒为约洛夫 3 。我们只需要那些符合车牌形状的。减少数字可以使推断更快。
- 为输入源选择更高的帧速率,并在处理时只选取第个帧。例如,如果摄像机以 120 FPS 的速度运行,只需每隔 4 帧选取一帧,仍然可以得到 30 FPS。这允许更清晰/清晰的帧,从而导致更准确的预测。快速行驶的汽车是文本识别的罪魁祸首。
- 用 OpenALPR 代替 CRAFT + CRNN。我不完全确定这是不是一个完全好的主意,但是从我从别人那里听到的来看,这非常快。
- 知道发送到文本识别 API 的每一批帧都是车牌,我可以看到如何使用自动编码器来大幅度压缩图像以进行数据传输。或者如果不是这样,那么至少它们可以用来从这些帧中去除噪声。由于自动编码器运行起来通常非常便宜,我可以看到如何在 Raspberry Pi 上使用它们来预处理帧。然后它们会在 API 级别被解码。
这里的这里的、这里的、这里的或者这里的讨论了这些改进。
至于产生的 AWS 集群成本,我有以下想法:
- 在当前配置下,运行此操作的成本约为 4.00 美元/小时。只有使用 spot 实例才有可能。
- 假设所有的改进都到位了,成本可能会下降到 ~0.2 美分/小时。实际上,只需要大约 1%的 T4 GPU 的能力来运行这些。这也是一个非常粗略的数字。这当然可以通过运行 spot 实例来实现。
结论(以及 5G 如何融入所有这些)
我看到设备开始越来越依赖云计算,尤其是计算能力有限的边缘设备。由于 5G 目前正在部署,理论上它应该使云更接近这些计算受限的设备。因此,云的影响力应该随之增长。5G 网络越可靠,越普及,人们就越有信心将所谓的关键任务的计算转移到云上,比如无人驾驶汽车。
我从这个项目中学到的另一件事是,随着在云中部署机器学习模型的流线型平台的出现,事情变得多么容易。5 年前,这可能是一个相当大的挑战:但现在,一个人可以在相对较短的时间内做这么多。
资源
- 3D 打印支架的所有
SLDPRTs
/SLDASMs
/STLs
/gcodes
都可以在这里找到。 - 这个项目的客户端实现可以在找到。
- 这个项目的
cortex
实现在这里找到。 - Keras 中 YOLOv3 模型的库在这里找到。
- 用于工艺的库文本检测器+ CRNN 文本识别器在这里找到。
- 欧洲车牌的数据集(由我的 Pi 相机拍摄的 534 个样本组成)在这里找到。
- Keras(license _ plate . H5)和saved model(yolov 3folder/zip)格式的 YOLOv3 模型在这里找到。
我做了一个电报机器人来对抗食物浪费——下面是我的方法
使用 python-telegram-bot 创建电报机器人的完整 Python 指南
elegram 机器人现在风靡一时——从让你玩游戏、寻找朋友、寻找新机器人,甚至创造新机器人的机器人——可能性是无穷无尽的。今天,我将介绍我如何构建一个电报机器人来消除食物浪费,提供一个完整的教程,从(1) 如何使用 BotFather 创建一个电报机器人,赋予它(2) 提问,(3) 接收和存储用户响应和图片,(4) 将此信息发布到公共电报频道**,同时(5) 调用谷歌地图 API 来显示**
代码可以在我的 Github 库这里找到。代码进一步在 Heroku 上部署了这个机器人,你可以在这里阅读我的关于我如何部署这个机器人的教程。
食物浪费——一个荒谬的问题
根据联合国粮食及农业组织(FAO)的统计,全球每年大约有 13 亿吨的食物被浪费掉,相当于所有人类消费食物的三分之一。一些常见的罪魁祸首包括自助餐,餐馆,甚至家庭,原因包括购买了太多,甚至更荒谬的是,食物看起来不好吃。
照片由 Yukiko Kanada 在 Unsplash 上拍摄
然而,与此同时,每天有 8.2 亿人挨饿。这似乎是矛盾的——我们怎么能浪费这么多食物,而同时让世界上这么多人挨饿?这归结为剩饭剩菜和需要食物的人之间缺乏沟通。当然,有慈善组织接受食物捐赠,但是在需要食物的人和有剩菜的人之间没有直接的交流。再加上令人沮丧的错综复杂的监管程序,毫不奇怪,在食品捐赠和它们真正惠及最需要的人之间存在着巨大的时间差。
考虑到这个问题,为什么不促进剩饭剩菜和需要食物的人之间的交流呢?这将有助于把那些有剩菜的人直接联系到那些需要食物的人。这样,需要食物的人可以很快收到食物,不会有任何明显的时间延误。
电报机器人简介
当然,这听起来不错,但是我们如何去实现它呢?这就是电报机器人和频道提供轻量级解决方案,将食品供应商与需要食品的人联系起来的地方。
食物供应商可以首先与电报机器人聊天,提供关于食物的关键信息,如食物的位置、饮食规格等。收集完这些信息后,机器人会将它们的食物列表发布到公众可以访问的电报频道上。一旦食物被发布在频道上,有需要的人可以简单地收集食物。所有这些都可以在没有任何明显时间延迟的情况下完成——事实上,将食品邮寄给收到信息的最终用户的整个过程只需不到 10 秒钟!
食品过账流程图解
为此,机器人将从食物海报中询问以下问题:
- 食物的位置。使用 Google Maps API,位置将被转换为相应的纬度和经度坐标,然后可以显示在地图上,使用户可以轻松地导航到该位置。
- 食物的图片。
- 饮食规格,即食物是否是清真的、素食的等等。
- 可供食用的食物数量。
- 食物被清除前必须收集的时间。
食物海报将回答这些问题,机器人将把这些回答汇编成一条消息。有了这个摘要消息,在发帖人确认输入的细节是正确的之后,机器人将把信息转发到公共频道。
创建你的机器人
既然我们已经了解了这个过程是如何工作的,那就让我们来看看本质的细节吧!
首先,我们将创建一个机器人。为此,通过电报向机器人父亲发送/newbot 命令。它将提示您输入 bot 的名称,后面是用户名(必须以 bot 结尾)。您可以使用/setname 命令轻松地更改 bot 的名称,但不可能通过 BotFather 更改 bot 的用户名,因此如果您不确定,可以先用随机用户名创建一个测试 bot,一旦您测试了所有功能并确保 bot 正常工作,就用您想要的用户名创建一个新 bot。
与机器人父亲的第一次交流——“一个机器人统治所有人”!
创建 bot 后,BotFather 将向您发送 bot 的 API 密钥(在“使用此令牌访问 HTTP API:”行下)。把这个 API 密匙留给你自己,因为它可能被任何拥有 API 密匙的人滥用来控制你的机器人,这是你不希望发生的!你可以向机器人之父发送一堆命令来定制你的机器人,包括改变机器人的描述,它的简介图片等等,这些都是不言自明的,所以我会让你在官方电报文档上阅读它。
使用 python-telegram-bot 与机器人交互
已经创建了我们的机器人,是时候给它一些额外的功能了!由于目标是创建一个与食物海报交互的机器人,该机器人必须能够向海报发送问题,以提示所需的信息,然后在转发到公共频道之前存储这些信息。为此,我们可以使用一个非常方便的 python 包装器, python-telegram-bot 。Github 页面提供了许多使用该包装器编写的机器人示例,所以请查看该页面,看看是否有满足您的用例的示例!
首先,我们将安装所需的软件包。因为我们调用 Google Maps API 来提供食物位置的地图,所以我们还将安装 googlemaps python 包。如果你不想使用谷歌地图,你可以跳过这个包的安装。
在终端/命令提示符下,键入以下命令来安装这两个库:
pip install python-telegram-bot # using version 12.7
pip install googlemaps # using version 4.3.1
现在我们已经安装了这两个库,让我们开始研究代码吧!下面是代码(以防你想直接跳到它),我将在下面详细介绍。
电报机器人的完整代码,包括调用谷歌地图 API
首先,我们导入相关的库:
import logging
import telegram
from telegram import (ReplyKeyboardMarkup, ReplyKeyboardRemove)
from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters, ConversationHandler)
from googlemaps import Client as GoogleMaps
我们正在导入日志记录,以显示用户在终端中与机器人交互时的日志消息,以及 python-telegram-bot 下的各种模块。我们也在导入谷歌地图,在地图上显示食物的位置。
接下来,我们配置日志记录设置如下:
# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
接下来,我们定义六个状态,这六个状态决定了机器人将提出的问题:食物的位置、照片、饮食规格、份数、领取食物的时间,以及与海报的确认。
LOCATION, PHOTO, DIET, SERVINGS, TIME, CONFIRMATION = range(6)
对于确认,将有一个回复键盘,用户将能够选择两个选项:确认信息是正确的或重新开始整个过程。
确认并重启按钮
因此,我们使用 python-telegram-bot 模块中的 ReplyKeyboardMarkup 模块指定了这两个选项,代码如下:
reply_keyboard = [['Confirm', 'Restart']]
markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True)
之后,我们指定一些变量,包括你的 Telegram bot 的 API(你从 BotFather 获得的),以及 Google Maps 的 API。
为了获得谷歌地图应用编程接口,你需要一个谷歌云平台账户。创建帐户后(会有免费的信用点数,所以只要你不超过限额,这应该是免费的),转到谷歌云平台控制台并执行以下操作:
- 在搜索栏中搜索 API &服务。
- 点击搜索栏正下方的蓝色加号按钮启用 API 和服务。
- 搜索地理编码 API 并启用。
- 在 API &服务下,转到凭证并选择创建凭证 > API 密钥。
将会生成一个 API 密钥,所以只需复制这个密钥。这将是您的谷歌地图 API 令牌。再说一遍,保管好这个!地理编码 API 提供了 200 美元的免费积分,这应该足够满足您的需求了。
TOKEN = 'YOURTELEGRAMBOTTOKEN'
bot = telegram.Bot(token=TOKEN) GMAPSAPI = 'YOURGOOGLEMAPSAPITOKEN'
gmaps = GoogleMaps(GMAPSAPI)
现在我们已经定义了变量,让我们深入研究代码的实际部分!首先,我们定义一个函数来总结食物海报提供的信息,如下所示:
def facts_to_str(user_data):
facts = list()
for key, value in user_data.items():
facts.append('{} - {}'.format(key, value))
return "\n".join(facts).join(['\n', '\n'])
当这个函数被调用时,它将以 key-value 的格式返回信息(例如,饮食规范- Halal)。
接下来,我们定义当用户启动机器人时会发生什么。这是通过使用命令/start 来完成的(它的工作方式类似于您使用命令/newbot 和 BotFather 来创建您的 bot)。当海报启动 bot 时,我们希望 bot 问候用户并提示他发送食物的位置,因此我们将 start 定义如下:
def start(update, context):
update.message.reply_text("Hi! I am your posting assistant to help you advertise your leftover food to reduce food waste. To start, please type the location of the leftover food.")
return LOCATION
前一个函数返回 LOCATION,这是下一个函数,因为 bot 将存储用户提供的位置,以便在最后创建一个摘要。在函数 location 中,代码做了几件事:首先,它告诉机器人有一条来自用户的新消息,然后它将用户提供的信息存储在键“location”下,以便以后打印摘要时参考。接下来,记录器将记录用于调试目的的信息,以防出错。最后,机器人会回复一条信息,要求提供食物的照片。然后,函数返回 PHOTO,这是下一个函数。
def location(update, context):
user = update.message.from_user
user_data = context.user_data
category = 'Location'
text = update.message.text
user_data[category] = text
logger.info("Location of %s: %s", user.first_name, update.message.text)
update.message.reply_text('I see! Please send a photo of the leftovers, so users will know how the food looks like, or send /skip if you don\'t want to.')
return PHOTO
在下一个函数中,用户有两个选择:要么给食物拍照并发送给机器人,要么如果没有准备好图像就跳过。
def photo(update, context):
user = update.message.from_user
photo_file = update.message.photo[-1].get_file()
photo_file.download('user_photo.jpg')
logger.info("Photo of %s: %s", user.first_name, 'user_photo.jpg')
update.message.reply_text('Great! Is the food halal? Vegetarian? Please type in the dietary specifications of the food.')
return DIET def skip_photo(update, context):
user = update.message.from_user
logger.info("User %s did not send a photo.", user.first_name)
update.message.reply_text('Is the food halal? Vegetarian? Please type in the dietary specifications of the food.')
return DIET
同样,机器人首先接收来自用户的消息,然后从用户那里获取照片文件,然后保存为 user_photo.jpg。然后,记录器记录信息,机器人用下一个关于食物饮食规格的问题进行响应。
下面几行遵循和以前一样的结构,因为机器人询问饮食规格、份数、收集食物的时间。您会注意到相同的结构:机器人首先接收来自用户的消息,然后将用户响应存储在 user_data 中,接着进行日志记录,然后机器人做出响应,提示用户下一个问题。
def diet(update, context):
user = update.message.from_user
user_data = context.user_data
category = 'Dietary Specifications'
text = update.message.text
user_data[category] = text
logger.info("Dietary Specification of food: %s", update.message.text)
update.message.reply_text('How many servings are there?')
return SERVINGS def servings(update, context):
user = update.message.from_user
user_data = context.user_data
category = 'Number of Servings'
text = update.message.text
user_data[category] = text
logger.info("Number of servings: %s", update.message.text) update.message.reply_text('What time will the food be available until?')
return TIMEdef time(update, context):
user = update.message.from_user
user_data = context.user_data
category = 'Time to Take Food By'
text = update.message.text
user_data[category] = text
logger.info("Time to Take Food By: %s", update.message.text)
update.message.reply_text("Thank you for providing the information! Please check the information is correct:{}".format(facts_to_str(user_data)), reply_markup=markup)
return CONFIRMATION
从海报中获得所有必要的信息后,是时候总结信息并与海报进行确认了。首先,机器人合并信息,然后使用我们在上面定义的函数 *facts_to_str(用户 _ 数据)*发出摘要。
如果用户选择“确认”,机器人会将信息转发到公共频道。bot.send_photo 的 chat_id 参数代表频道的链接。
def confirmation(update, context):
user_data = context.user_data
user = update.message.from_user
update.message.reply_text("Thank you! I will post the information on the channel now.", reply_markup=ReplyKeyboardRemove())
bot.send_photo(chat_id='@nameofchannel', photo=open('user_photo.jpg', 'rb'), caption="<b>Food is Available!</b> Check the details below: \n {}".format(facts_to_str(user_data)) + "\n For more information, message the poster {}".format(user.name), parse_mode=telegram.ParseMode.HTML) geocode_result = gmaps.geocode(user_data['Location'])
lat = geocode_result[0]['geometry']['location'] ['lat']
lng = geocode_result[0]['geometry']['location']['lng']
bot.send_location(chat_id='@nameofchannel', latitude=lat, longitude=lng)
此外,我们现在调用谷歌地图来精确定位海报提供的确切位置。当用户回答关于位置的第一个问题时,位置已经存储在 user_data[‘Location’]中,所以现在我们将使用 google maps 提取位置的纬度和经度。有了这些信息,机器人将位置和地图一起发送到由 @nameofchannel 指定的频道。
bot 在公共频道上发布的消息;自助餐图片摘自https://my fave . com/johor-Bahru/V8-hotel-johor-Bahru-V8-hotel-johor-Bahru-晚餐-自助餐-1 人份-成人-64925
以下是一些帮助功能,以防用户取消与机器人的对话或出现错误:
def cancel(update, context):
user = update.message.from_user
logger.info("User %s canceled the conversation.", user.first_name)
update.message.reply_text('Bye! Hope to see you again next time.', reply_markup=ReplyKeyboardRemove())
return ConversationHandler.ENDdef error(update, context):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, context.error)
我们到了代码的最后一段!这里,代码定义了机器人应该为六种状态中的每一种状态做什么。最后,我们开始投票,这基本上使我们能够从海报中获取信息。python-telegram-bot 的 Github wiki 在解释这里的代码方面做得更好,所以如果你不确定每一行是做什么的,一定要检查一下!
def main():
updater = Updater(TOKEN, use_context=True)
# Get the dispatcher to register handlers
dp = updater.dispatcher
# Add conversation handler with the states LOCATION, PHOTO, DIET, SERVINGS, TIME and DONE
conv_handler = ConversationHandler(entry_points=[CommandHandler('start', start)],states={
LOCATION: [MessageHandler(Filters.text, location)], PHOTO: [MessageHandler(Filters.photo, photo), CommandHandler('skip', skip_photo)],
DIET: [MessageHandler(Filters.text, location)],
SERVINGS: [MessageHandler(Filters.text, bio)],
TIME: [MessageHandler(Filters.text, time)],
CONFIRMATION: [MessageHandler(Filters.regex('^Confirm$'), done), MessageHandler(Filters.regex('^Restart$'), start)] }, fallbacks=[CommandHandler('cancel', cancel), CommandHandler('start', start)] )
dp.add_handler(conv_handler) # log all errors
dp.add_error_handler(error) # start the bot
updater.start_polling() # Run the bot until you press Ctrl-C
updater.idle() if __name__ == '__main__':
main()
要启动您的 bot,只需进入终端/命令提示符并执行 python 文件。执行完文件后,进入 bot 并键入/start。你的机器人应该响应并问你上面编码的问题!当您响应时,您还应该看到出现以下日志:
记录在命令行中看到的张贴者的响应
原来如此!如果你想看看我创建的机器人,你可以在 @foodrescuerbot 找到它。公共频道的链接是 https://t.me/foodrescuers 的。
试试这个!我希望你能从中得到乐趣,并告诉我进展如何!如果你需要任何澄清,请随时提问。让我们都三思而后行,我们是否可以在购买之前吃完食物,并努力减少食物浪费~
如果你正在寻找免费的 部署机器人 ,请点击这里的获取一个关于如何在本地成功运行机器人后在 Heroku 上部署机器人的教程。
我建了一个网站来可视化冠状病毒
展示冠状病毒趋势、统计数据和新闻的交互式 Covid19 仪表板
大家好,
我希望每个人都尽自己的一份力量呆在家里,保持健康。我们再次被放回野外只是时间问题,一线工人可以放松一下了。
当呆在家里时,我明白事情似乎有点模糊不清。我们不确定外面发生了什么,这感觉就像生活在岩石下。你很幸运,我在这里为你提供完美的解决方案。一个冠状病毒网站。
来自tenor.com的 gif
我创建了一个互动网站,跟踪全球冠状病毒的统计、趋势和新闻。该网站每 30 分钟更新一次,为其浏览器保持几乎实时状态。它具有流畅的用户体验,非常适合你监控你的国家发生了什么,等等。
[## 电晕病毒 Covid19 交互式仪表板
电晕趋势提供最新的趋势,新闻和数据可视化的死亡,感染和恢复的情况下,由于…
corona-trend.com](http://corona-trend.com/)
在这篇文章中,我将谈谈我为什么建立网站。我将谈论它背后的动机,我决定在它里面包括什么,以及我在每件事情背后的思考过程。这是为了与你们分享我的旅程,也许会激励你们做得更好。开始了。
问题是
奥拉夫·阿伦斯·罗特内在 Unsplash 上拍摄的照片
已经有一些网站和我的网站有着相似的目的。你可能熟悉像 Worldometers 和 世卫组织冠状仪表板 这样的网站,它们在显示冠状病毒的当前数据方面做得很好。
这些网站的问题是它们提供了冠状病毒现状的全球视角。这很好,但是有些用户只对某个国家的数据感兴趣。通常,当我寻找关于冠状病毒的数据时,我发现自己在搜索一个特定的国家,以真正了解该国是如何恢复的。
据谷歌首席执行官桑德尔·皮帅在的一篇帖子称,冠状病毒搜索结果将被改变。谷歌努力展示与政府等机构相关的搜索结果。因此,在搜索冠状病毒时,像 这样的网站会频繁出现。
冠状病毒搜索结果截图
我知道一些网站使用地理布局来展示全世界冠状病毒的规模。然而,很多时候,我们甚至不知道自己感兴趣的国家在世界地图上的位置,找起来很麻烦。
例如,我们都读过关于冠状病毒如何在美国传播的新闻。知道了这一点,我去任何网站寻找冠状病毒在美国的统计数据,但还没有找到一个流畅的体验。
我也对我的国家的具体表现感兴趣。我住在马来西亚,目前处于运动控制令中。这里的政府已经一周又一周地延长了这个命令,没有人知道这什么时候会结束。话虽如此,我发现自己经常查找关于马来西亚的数据,这在一些网站上很难找到。
解决方案
在多次搜索特定的国家之后,我想为什么不自己做点东西呢。一个冠状病毒仪表板,允许用户获得全球视图,并能够顺利地深入到特定国家的数据。
该网站采用了简单的设计,用多种颜色来代表新病例、死亡和康复。用户能够清楚地查找全球数据,也能够搜索感兴趣的国家。表格、图表和数字会根据用户指定的国家自动更新**。**
**【corona-trend.com **
我发现自己刚刚进入网站,搜索马来西亚日报。通过观察趋势和数字,我对马来西亚的复苏情况有了很好的了解。为了好玩,我把新加坡和菲律宾等邻国包括进来,以比较我们的复苏情况。看起来马来西亚并没有那么糟糕。
布局
这是我对冠状病毒互动网站的看法。这可能并不适合所有人,所以如果你不好意思留下反馈或发邮件给我,请随意。
共有 3 页:
- 登录页面
- 统计页面
- 趋势和新闻页面
登录页面
登陆页面显示 3 个数字。总病例数、死亡数和痊愈数。
它们的意思与它们所显示的完全一样,即全球范围内冠状病毒导致的总病例数、死亡人数和康复人数。这是全球冠状病毒情况的一瞥。
统计页面
这就是有趣的地方。该页面以一种有组织的方式向您展示了几乎所有您需要知道的数据,同时在顶部有一个搜索栏。输入你感兴趣的国家,页面会随之改变。****
趋势和新闻页面
趋势部分提供了关于各国如何复苏的见解。有 3 个主要图表通过搜索栏更新来显示这一点,但我想强调一下新案例与新恢复图表。如果绿色持续高于读数,这意味着你选择的国家(默认为全球)正在走向全面复苏。
根据另外两个图表,你可以大致猜测你的国家将在多长时间内开始运转。我每天都追踪这个,以估计我什么时候可以去理发。
来自 romainlaurent 的 gif
新闻版块是一个不错的版块,展示了所有关于冠状病毒的最新消息。它是从 Reddit 的一个名为“冠状病毒”的子论坛上刮下来的,这个子论坛展示了来自著名来源的新闻,如 BBC 和卫报**。**
在幕后
在后端,有每 30 分钟更新一次网站的代码。该代码从 Covid19api.com、世卫组织、Reddit 等来源收集最新数据,以填充图表、表格和新闻。这是为了确保用户在浏览网站时获得最新的数据。
动机
克拉克·蒂布斯在 Unsplash 上拍摄的照片
企业家精神
我是千禧一代。我们都有内在的企业家精神。
我很自豪地说,这个项目极大地满足了我内心的企业家精神。****
通常,像我这样的年轻人并不真正知道生产一个可用的数字产品是什么感觉。我们中的一些人认为这只是代码。我处理网站从设计,前端和后端,产品,部署和营销的一切。这对我来说是一次很好的经历,我很自豪地说,我从这次经历中学到了很多。
这个网站已经开通快一周了,已经收集了大约 5000 个会话。我积极地从用户那里寻求反馈来改进我的网站。我了解到不同的目标受众对某个产品有不同的看法,我需要考虑这些来改进我的网站。
就拿我爸妈来说吧,他们其实不太会看数据。他们不能真正翻译图表。因此,他们发现这个网站非常令人困惑。另一方面,我的同事发现这个网站非常有用。他们还提到颜色在表现不同的统计数据方面做得很好。
来自 warnerarchive 的 gif
作为产品负责人,这帮助我确认了我的目标受众。它还为我提供了关于不同用户如何看待我的产品的宝贵反馈,以及我如何为每个人改进它。
提供价值
该网站的主要目标从来不是赚钱,而是提供价值。我发现了一个问题,并认为如果我能为某人解决这个问题,他们会发现这个问题是有价值的。
如果我从这个网站赚了一点钱,那很酷。然而,这不是我的主要目标。有比提供一个没有广告的免费网站更好的商业模式。
简单地说,这是我第一次通过解决一个我认为很多人都面临的问题来提供价值。不管那是不是真的,我们很快就会知道了。
建造一些很酷的东西
我的职业是数据科学家/数据工程师。我一直想做一些很酷的东西。这个网站只是一个开始。
通过为网站写所有的代码,我学到了很多关于前端和后端如何工作的知识。我学到了新的框架,如何通过我的代码优化页面加载速度和移动响应。
有趣的事实:当我最初完成这个网站时,它几乎花了 20 多秒来加载,这是完全不能接受的。现在,平均大约需要3-5 秒**。**
我将在网站上发表一篇关于技术细节的文章,你们中的一些人可能会对此感兴趣。
未来
**[## 电晕病毒 Covid19 交互式仪表板
电晕趋势提供最新的趋势,新闻和数据可视化的死亡,感染和恢复的情况下,由于…
corona-trend.com](http://corona-trend.com/)**
这就差不多概括了。以上是链接再次链接到我的网站。看看它,告诉我它对你是否有用。如果你认为这对你亲近的人有帮助,就和他们分享吧。
我希望这本书对你来说是有趣的/鼓舞人心的。我在制作这个网站的时候玩得很开心,我希望你在使用它的时候也玩得开心。
在你走之前
我们的旅程还没结束。请继续关注,我正在网站上写关于技术细节的文章。与此同时,请随意查看我的其他文章来暂时填补您对数据的渴望。
像往常一样,我引用一句话作为结束。
当你认为一件事足够重要时,即使成功希望渺茫你也会去做。——埃隆·马斯克
订阅我的时事通讯,保持联系。
感谢 的阅读!如果你想与我取得联系,请随时通过 nickmydata@gmail.com 或我的 LinkedIn 个人资料 联系我。也可以在我的Github中查看之前写的代码。
我不能在 10 天内教你数据科学
理解数据科学空间中的实体和需求的案例研究方法
“大约四年半以前,我一直在努力理解数据科学的整个概念。来自一个非统计学背景的人,我怀疑、担心,更重要的是,我令人讨厌。我怀疑自己是否能在一个我认为是数据密集型的行业中生存下去。但我现在仍然在风中航行,同时也学到了一些技能。我不会教你数据科学,因为我还在学习。但我会告诉你我与穆适马和诺华合作的经历,从零开始,设法爬上阶梯,缓慢而稳定"
我总是听到很多关于什么构成数据科学项目的问题?是否有多个交叉功能组合在一起形成了这个更广泛的范围?一个非计算机专业或者非统计学背景的人能进入这个行业吗?多个实体联合起来形成一个数据科学组。角色和职责通常是预先定义好的,需要统一的工作方式来实现更大的目标。这篇文章的唯一目的是让你对这些实体有所了解,并帮助你选择一个轨道,而不是跳进一个在线课程。
让我举一个例子来解释不同实体之间的交互。一家大型药房零售商(一家销售药品的公司)正计划扩大其市场并提高收入。作为该过程的一部分,他们决定与医生交谈,并让他们了解患者在访问他们的药房时将获得的所有好处。好处可能是在专业护理、折扣、减少排队或等待时间、药品供应、更顺畅的保险索赔过程等方面。这一过程通常被称为**【医师定位】**。现在,为了启动这一计划,分析主管决定将所有四个团队召集在一起。
业务分析师的角色
在这个项目中,业务分析师需要与不同的利益相关者互动,如品牌负责人、药剂师、商店经理、销售代表,并了解市场如何运作。这将有助于他们考虑所有可能的关键绩效指标(KPI),并使用它们来确定需要针对的医生的优先级。
比方说,业务分析师确定患者数量(就诊患者总数)、脚本(开出的处方)、医生专业(,比如医生是否是神经科医生、心脏病专家、家庭医生等。)、患者人口统计(住在药店周围的人,他们的年龄、收入、病史) &竞争对手市场(*收入,竞争对手药店产生的患者量)*作为一些 KPI。现在,他们将把数据需求传递给数据分析师团队。然而,业务分析师的角色不止于此。他们需要创建关于初始市场趋势的报告,以及按医师专业、地理位置等分类的患者和脚本量等摘要。一旦他们收到数据。
对业务分析师的要求
- 了解医疗保健系统如何运作
- 分析思维,能够识别不同的问题领域、导致这些领域的可能因素,更重要的是质疑每个假设、趋势和商业数据的关键方法
- 基本统计概念,如描述性统计(均值、中值、众数和何时使用它们)、相关性、假设和显著性检验(z 检验和 t 检验)。Excel 具有执行这些任务的所有内置函数。业务分析师应该能够解释结果,并使用它们来支持他们的发现和见解
- 有使用 ETL 工具的实践经验——SQL、Python、R、SAS 或 Alteryx (SQL 是一种可以跨多个平台使用的编程语言)。大多数拥有大量数据的大型企业主要在 SQL 上运行
- excel——公式、数据透视表和图表、切片器、VBA(有助于自动化)
- powerpoint
- 向更大的群体展示发现和见解的有效沟通技巧
数据分析师的角色
我认为数据分析师在任何决策周期链中都扮演着最关键的角色。两个原因。*“首先,它们是确保数据以结构化和随时可用的方式获取、转换和存储的关键杠杆。第二,大多数组织都有大量的数据,需要时间和技能才能处理成有用的形式”。*在上面的例子中,一次,业务分析师传递数据需求,数据分析师致力于采购、清理和集成数据到组织的专用存储区域,供不同的业务单位访问。
药店零售商会产生大量的交易数据,这些数据以未经处理的形式存储在他们自己的数据库中。此类数据集将包含与医生、患者、商店、药品等相关的信息。现在,数据分析师的目标是处理这些数据,添加来自其他相关表格的必要信息,并创建所谓的 分析数据集 或 ADS。*广告在任何分析行业都是一个关键概念。由于多个业务部门最终会处理相似的数据集,因此创建一个单一真实来源*以确保整个组织内报告的数字的一致性非常重要。此外,很多时候,组织从第三方供应商处获取数据,例如竞争对手的数据。数据分析师负责确保此类数据库在公司系统中的简化集成。
对数据分析师的要求
- 对关系数据库管理系统有透彻的理解
- 彻底理解数据集、它们包含的信息、它们的级别(主键和外键)等等
- 必须有使用 SQL、SAS 或任何其他 ETL 工具的实践经验
- 良好的统计学知识,以防大量数据清理需要完成。需要了解与缺失值处理相关的技术,如均值、中值、众数等基本技术,以及 K 近邻、空间聚类和 K 均值等高级技术
- SAS 有运行描述性统计和聚类算法的内置函数,但是在整个数据预处理都是在 SQL 中完成的情况下,了解 R 或 Python 中的一个是很重要的
高级分析师的角色
一旦数据分析师完成了数据准备,业务分析师进行了一些初步的深入研究,高级分析师(也称为数据科学家)将被要求运行细分模型,以确定其销售代表可以瞄准的高机会医师群。所有可能的推荐变量列表将提供给高级分析师,高级分析师将根据这些变量运行模型并产生最终建议。
在这个用例中,一旦生成了患者、HCP、脚本、竞争对手级别的数据集,业务分析师将对现有业务场景在不同地理区域的表现进行基本概述。将推荐一个高机会地理位置列表,高级分析师将根据该列表运行他们的模型并创建最终推荐列表。
高级分析师的要求
- 深入了解机器学习技术,最重要的是算法及其背后的数学。我们经常忽略线性回归、逻辑回归、决策树或神经网络的概念,因为大多数平台提供的功能可以在一段时间内产生结果。然而,了解数学知识可以让你对数据进行切片和切块,以获得想要的结果
- 通常,任何建模练习的结果都不会像您在大多数教程中看到的那样。有时很难解释结果并从中获得商业意义,因此一些市场商业敏锐度是有用的
- 使用 SAS、R 或 Python 的实践经验
- 商业利益相关者不太熟悉统计学,因此需要良好的沟通技巧来将 theta 值转化为商业行动
可视化分析师的角色
一个可视化的分析师在计划展开后开始描绘项目的后期。一旦销售代表开始瞄准医生,就该进行一些影响评估了,还有什么比创建一个在一个地方跟踪每个绩效指标的仪表板更好的呢?
如今,大多数组织都在避免各自为政。因此,以前涉及不同业务单位的多个报告的趋势正在减缓锚定到某种 360 度仪表板中。因此,可视化分析师很受欢迎,因为他们知道如何创建最好的仪表板。在这种情况下,一旦业务部门决定跟踪他们的 ROI (投资回报),他们就会要求可视化分析师创建一个仪表板,以粒度形式显示摘要。
基于调查的方法来确定每个数据科学家都应该知道的 BI 工具
medium.com](https://medium.com/@angeleastbengal/the-dawn-of-modern-analytics-a-look-into-some-of-the-recent-trends-of-business-intelligence-fc12cdf41cae)
可视化专家的要求
- 对以下 Power BI、Tableau 或 Qlik Sense(有时是 HTML)之一有透彻的了解
- Tableau 目前统治着市场,但组织也在慢慢采用 Qlik Sense。 Qlik Sense 被认为是一个具有 ETL 功能和更快数据处理速度的自助式仪表盘 。 ***自助式仪表板被定义为一个平台,非可视化专家只需拖放即可创建摘要、图表、过滤器等。***QVD 或 Qlikview 数据处理时间更短,并且驻留在 Qlik 架构中,确保易于维护
既然你已经知道不同的实体是如何运作的,我建议你思考你感兴趣的东西,并相应地选择一个在线课程,而不是直接跳到任何在线课程。如果你想了解数据科学行业的历史和未来的详细信息,你可以阅读大卫·多诺霍 的这篇文章 《数据科学 50 年》。
我创造了一个深度学习驱动的不和谐机器人来和 smily 反应😎
检测信息的情绪、情感和讽刺,并以适当的微笑回复。
和我的同事一起微笑
动机
我最近看了很多论文,大部分是关于深度学习的,RNN,CNN,LSTM[1],Transformer(注意力是你需要的全部)[3],BERT 等等。这个名单只会越来越长。但是学习任何东西的最好方法是体验它。此外,如果我用我的脸部署一个机器人,在我的办公室服务器上,它有时可以在我忙于阅读时为我提供代理。😜开玩笑的。作为一个有经验的软件开发人员,这只是一种实现新知识的冲动。
但是有一些很大的障碍。我上哪去弄这么多数据来训练一个神经网络?即使我管理数据,我也需要一台高保真配置的机器,或者至少需要一个强大的 GPU 来用数据训练我的模型。但是,有志者事竟成。🤓经过一番研究我发现, DeepMoji 🧙🏻♂️.我们可以使用像 DeepMoji 这样的预训练模型来实现我们的机器人。现在,在一个预先训练好的模型上工作,并根据需要使它变得更好是一种常见的做法。
对我来说,这是一个制作不和谐机器人(因为我的办公室交流是不和谐的)的绝佳机会,也是体验 NLP 过程如何使用各种 LSTM 和注意力机制的绝佳机会。这个机器人可以监听所有正在接收的消息,并用表情符号做出反应。
DeepMoji
DeepMoji 是建立在 Keras 上的模型,后端在 Tensorflow 上。Deepmoji 基于这篇由 Bjarke Felbo、Alan Mislove、Anders sgaard、Iyad Rahwan 和 Sune Lehmann 开发的论文。
本文表明,通过将远程监督扩展到更多样化的噪声标签集,模型可以学习更丰富的表示。通过对包含 64 种常见表情符号之一的 12 亿条推文数据集进行表情符号预测,他们使用单一预训练模型在情绪、情感和讽刺检测的 8 个基准数据集上获得了最先进的性能。
火炬手
TorchMoji 是由 huggingface 构建的 DeepMoji 模型的 pyTorch 实现。DeepMoji 构建在 python 2.7 之上。所以我们将使用 TochMoji,它是 python3 中的一个实现。所以我们将使用 torchmoji 来实现。
设置
对我来说,这次旅程中最紧张的部分是准备工作。因为我找不到任何合适的例子来在项目中实现 torchMoji。所有的例子都是在 jupyter 笔记本中使用的测试用例。但是我特别感兴趣的是使用我的 VS 代码在一个项目中实现它,这样我就可以用我的 discord BOT 连接它,并从那里发送响应。
这里可以看到我的完整代码:
https://github . com/anuragbhattacharjee/discord-NLP-smily-bot/
***在 github 库上给予⭐️之星帮助我们共同成长。你将获得项目的所有更新,我将获得更新项目的灵感。
那我们开始吧。
1.设置不和谐机器人
设置不和谐机器人很简单。导航至应用页面。创建一个应用程序,然后在您的应用程序下创建一个 bot。
创建机器人后,您将看到机器人的几个设置。您将需要在您的 BOT 设置下使用“BOT Token”来从您的代码连接它。
如果你进入 OAuth2 设置,你可以创建一个需要权限的链接,通过点击链接,一个不和谐的服务器所有者可以将机器人添加到他们的服务器。出于测试目的,我为自己创建了一个服务器,并在我的办公室服务器上测试之前先添加了 bot。
此时,您应该看到机器人已经加入到您的服务器中。但是离线了。因为我们还没有把它和我们的代码联系起来,赋予它生命。🤖❤
如果您在创建 discord bot 时遇到任何问题,请遵循以下链接中的详细可视步骤:
[## 创建 Bot 帐户- discord.py 1.4.0a 文档
为了使用这个库和 Discord API,我们必须首先创建一个 Discord Bot 帐户。正在创建…
discordpy.readthedocs.io](https://discordpy.readthedocs.io/en/latest/discord.html)
2.设置 python 环境
我在这里呆了很长时间。因为火炬手说要用康达来酝酿项目。但是当我试图下载所有的依赖项时,遇到了一系列的错误。
虽然你可以使用任何你喜欢的环境管理工具(conda/venv),你只需要知道如何使用它。Conda 在数据科学中使用时最受青睐,因为它们可以一次性设置所有需要的环境包。哪个更容易。但是我认为 Venv 更灵活。
不管怎样,经过几次反复试验失败后,我终于找到了一种方法。我下载了 torchMoji 项目,并在我的项目中作为一个包使用。我使用 venv 进行环境管理。你可以跟着我的 github repo 进行设置。https://github . com/anuragbhattacharjee/discord-NLP-smily-bot/
3.测试预测
设置完成后。现在是做一些测试的时候了。我必须对 torchMoji 库进行一些修改,以便在我的代码模块中正常工作。
现在编写一个代码来使用 torchMoji 来预测微笑是非常简单的:
我们可以通过在终端中运行来测试它
python3>>> from emojize import Emojize
>>> e = Emojize()
>>> e.predict("I am doing great today!")
:smile:
4.连接到不和谐机器人
这就是乐趣的开始。在您的项目设置好之后,现在是时候连接到您的 bot 并进行一些测试了。
要连接到 discord,我们需要安装 discord.py 包,如果您安装了 requirements.txt,那么这个包应该已经安装了。
现在要连接到不和谐机器人,我们需要做一个。env 文件并将我们的密钥放在。env 文件作为 DISCORD_TOKEN。我制作了一个 env.demo 文件,并把它放在我的 git repo 中,这样你就可以使用它了。😁
设置好令牌后,我们可以连接到discord.Client()
并监听客户端的几个事件。
我做了一个简单的实现,只需发送一个 smily 消息并对所有消息做出反应。但是我们可以通过检查消息来让它变得更聪明,如果我被提到了,或者如果消息中有我的名字,只是为了让它更人性化,因为什么样的开发者会回复帖子中的每一条消息。🤷🏻♂️
但是我会根据您的需要来实现它。如果需要,不要忘记分叉和启动回购。
以下是您可以使用的不一致事件的详细信息:
[## API 参考- discord.py 1.4.0a 文档
以下部分概述了 discord.py 的 API。请注意,该模块使用 Python 日志记录模块来记录诊断…
discordpy.readthedocs.io](https://discordpy.readthedocs.io/en/latest/api.html#event-reference)
参考资料:
[1] 长 SHORT-TERM 记忆
作者 Hochreiter 和 Schmidhuber,1997;苏茨基弗等人,https://www.bioinf.jku.at/publications/older/2604.pdf2014
[2] 使用数百万个表情符号来学习任何领域的表达,以检测情绪、情感和讽刺
作者:比亚克·费尔博、艾伦·米斯洛夫、安德斯·索加德、伊亚德·拉万、苏内·莱曼
https://arxiv.org/abs/1708.00524
阿希什·瓦斯瓦尼、诺姆·沙泽尔、尼基·帕尔马、雅各布·乌兹科雷特、莱昂·琼斯、艾丹·戈麦斯、卢卡斯·凯泽、伊利亚·波洛舒欣
、T4
【4】deep moji
https://github.com/bfelbo/DeepMoji
https://github.com/huggingface/torchMoji
我希望你喜欢这个博客。这是我正在写的关于 NLP 的几个主题的系列的第二个故事。如果你想看更多我的博客,你可以在这里关注我。
我是阿努拉格。从 2014 年开始专业从事软件工程师工作。我目前正在为我现在的雇主做一个 NLU 微服务。最近,我正在研究论文,以了解更多关于自然语言处理。在我的空闲时间,我喜欢开发简单有用的网络和移动应用程序。您可以在此与我联系:
🔗https://www.linkedin.com/in/anuragbhattacharjee/t20】🕸http://anuragbhattacharjee.com
快乐编码😀
阿努拉格·巴塔查尔吉
我设计了一个人工智能系统,可以预测“学术不诚实”,准确率很低
AIEMS 项目
第一章
未来的虚拟现实辅助课堂【照片由克里斯蒂安·弗瑞格南在Unsplash上拍摄】
标识 AIEMS(人工智能教育监控系统)
项目名称:“AIEMS(人工智能教育监控系统):网络教育高级人工智能(AI)监控与反馈系统开发”
第一章
智慧课堂与人工智能技术
作为一名电气工程专业的研究生,我喜欢接受挑战,接受不同的项目来帮助解决现实世界的问题。随着新冠肺炎的实施,有几个机构转向了在线教育,因为该平台在疫情期间既方便又安全。然而,尽管在线教学有许多优点,但该系统仍然缺乏“强大”的基础设施来应对面对面的传统课堂所带来的挑战。
据预测,未来 5 年,在线教育可能达到 3250 亿美元
1.1 面对面和在线课堂教学的挑战
1 个性化及其对学习能力的影响长期以来一直是人们感兴趣的焦点[1]。然而,仅在美国;由于课堂人数的巨大差异,一个教育工作者在计划他们的课程时很难遵循一个*【标准技术】【2】。有各种因素可以解释学习过程的有效性[3,4]。作为一名研究生助教,我有过直接教学和与学生一起工作的经验,我意识到学生的范围和确保优质教育是一个挑战。问卷经常被用作预测个人学习风格的工具[5–8]。学习分析,包括收集、分析和使用这些数据[9],也被认为可以改善学生的学习体验。然而,在大多数情况下,这些评估特别用于概括一个班级群体的整体学习模式,而不是利用它们来称赞任何一个学生的学习风格。*
除了学习风格的要素之外,一个重要的标准是学术评估并确保其完整性。根据发表在学术和商业伦理杂志上的一项研究,强调了在线教育者努力确保在线学生成绩的完整性。挑战包括:(一)确保注册学生参加考试并上交作业。(ii)个人作业在提交过程中不会受到影响。
在线记录和现场监督是最近几个学期大多数教师采用的各种方法,以确保在线评估的完整性。然而,当学生在他们的方法中变得有创造性时,有效地监控就变得困难了。因此,人工智能驱动的监考可能更有效,并有助于机构教育的整体质量。
3 博尔特等人调查了情绪状态对直觉判断能力的影响。该研究得出结论,消极情绪会限制直觉一致性判断。由疫情引起的情绪困扰的影响同样可能引发对学习轨迹和个人表现的反应。然而,据我们所知,在这种危机或类似的刺激环境下没有进行重大研究。了解动态变化对单个学生表现的影响,可以有效地帮助开发人工智能(AI)系统,从而帮助提高在线教学的质量。
教学和评估中的挑战
1.2 人工智能与智慧课堂
疫情新冠肺炎严重影响了传统的或地区性的课堂学习。这种中断更有可能成为我们历史上著名流行病的频繁中断,包括黑死病、西班牙流感、霍乱、淋巴腺鼠疫和疫情流感,或者第二波可能发生。疫情期间的核心任务之一包括避免社交聚会,社交聚会严重影响传统课堂的学习和评估行为。在完全或部分过渡到在线学习的过程中,人工智能(AI)可以在创新当前教育系统方面做出重大贡献。应用推理或认知技能和评估程序可以用来开发一个先进的人工智能系统,以补充我们现有的审议。在新冠肺炎疫情期间,很可能会在学生群体中引发情绪反应。这可能会极大地影响个别学生的学习轨迹。
人工智能(AI)技术已经获得了广泛的普及,因为它能够以边际精度进行预测,并具有解决复杂问题的潜力。在智能教室环境中使用人工智能的几个优势之一是它的认知潜力。人工智能开发中使用的算法最终可以帮助具有不同学习风格和能力的学生实现个性化学习节奏的目标。Lo 等人利用多层前馈神经网络(MLFF)开发了一个基于网络的学习系统,重点关注学生的认知风格[10]。Curilem 等人还提出了一个基于学生行为的智能教学系统(ITS)的数学模型[11]。
除了人工智能的认知能力之外,该系统还允许选择预测,这对预测至关重要。使用人工智能进行时间序列预测之前已经在金融行业[12–14]和医疗决策过程[15]中使用过。同样,在教育行业,人工智能已经被用于预测辍学[16]或逃避电子学习课程[17]。
在智能教室环境中利用 AI 的架构的概念肯定会提高理想场景中的学习质量。设计的架构面向参加传统和/电子学习的工程专业学生。因此,该系统需要对其最初的概念设计进行修改,以适应普通学生群体的需求,这些学生要么是高中学生,要么是最近才进入大学。****
1.3 智慧课堂的概念
智能教室的概念是一个不断研究的领域,它能够利用硬件和软件组件来适应学生的需求[18,19]。Aguilar 等人[20]提出,在智能教室环境中利用机构的学习分析可以产生更有效的结果。无线传感器和物联网(IoT)在智能教室环境中分析社会和行为模式的应用也在几个测试平台中得到解决[21–25]。因此,随着技术的发展,现在更容易预测个人的学习情况,从而相应地分析和提供学习情况。这最终会提高学生的学习成绩和学习动力。
不同学习能力的学生参加同一堂课的典型课堂环境
1.4 拟议概念项目的科学价值和意义
主要目标是开发一个先进的人工智能驱动的在线学习系统,补充我们现有的在线方法。人工智能已经成为大多数教育机构采用的课题。
最近,微软进行了一项调查,强调了以下统计数据:99.4 %的人同意人工智能是机构竞争力的组成部分,92 %的人同意对该技术进行实验。
因此,改进我们当前的在线学习系统将提高我们与其他领先机构的竞争力。电子学习是教育的未来,即使在疫情结束后,无论从短期还是长期来看,这都是一项不错的投资。据预测,未来 5 年,在线教育可能达到 3250 亿美元。由于地区壁垒不再是一种义务,投资改进这种技术可能会产生潜在的收入流(国内和国际)。根据乔治梅森大学和斯基德莫尔学院的一份报告,除其他因素外,导致学生和教师对在线学习不满的主要因素包括:
“监管和实质性的学生-教师互动是在线教育质量的关键决定因素,可提高学生满意度、学习和成果。”
教授们对在线课程表达的另一个担忧包括:
“但当这些学生参加微积分或遗传学的期末考试时,他们的教授如何知道远处笔记本电脑上的考生正在做自己的作业,而不是向谷歌先生寻求帮助。”
总而言之,任何教育机构要想成为在线教育领域的全球领先企业,都需要应对以下挑战:( I)及时且经济高效的学生反馈机制;( ii)增强在线监督机制,以确保学术诚信。
注:下一章重点介绍架构设计和流程图来理解模型。
参考
[1]史密斯、琳达 h .和约瑟夫 s .伦祖利。"学习风格偏好:课堂教师的实用方法."理论到实践 23,第 1 期(1984):44–50。
[2]好吃,喜英。“学习风格偏好”。
[3]苏塔托,佐科。"等效教育学习过程和学习成果有效性的决定因素."社会科学、教育和人文学科进展 (2017)。
[4] Rahman、Roselainy Abdul、John H. Mason 和 Yudariah Mohamad Yusof。“影响学生改变学习行为的因素。"过程社会学和行为科学56(2012):213–222。
[5]奥尔蒂戈萨、阿尔瓦罗、佩德罗·帕雷德斯和皮拉尔·罗德里格斯。" AH 问卷:学习风格的适应性分层问卷."计算机&教育 54,第 4 期(2010):999–1005。
[6] Tzouveli、Paraskevi、Phivos Mylonas 和 Stefanos Kollias。“基于学习者档案和学习资源调整的智能电子学习系统。”计算机&教育 51,1 号(2008):224–238。
[7]沃森、马克、米歇尔·麦克索利、谢丽尔·福克斯克罗夫特和安德里亚·沃森。"探索大学一年级学生的动机取向和学习策略."高等教育&管理 10,第 3 期(2004):193–207。
8 Petocz、Peter、Anna Reid、Leigh N. Wood、Geoff H. Smith、Glyn Mather、Ansie Harding、Johann Engelbrecht、Ken Houston、Joel Hillel 和 Gillian Perrett。“大学生的数学概念:一项国际研究。"《国际科学与数学教育杂志》* 5,第 3 期(2007):439–459。*
[9]阿尔莫纳德、弗洛伦西亚、爱德华多·费尔南德斯、阿德尔·梅利特和索特里斯·卡洛吉鲁。"基于人工神经网络的聚光光伏技术电特性技术综述."可再生和可持续能源评论75(2017):938–953。
[10]罗家俊、陈亚珍和修杰楷文。“根据在线确定的学生认知风格,设计一个自适应的基于网络的学习系统。"计算机&教育 58,1 号(2012):209–222。
[11] Curilem、S. Glória、Andréa R. Barbosa 和 Fernando M. de Azevedo。"智能教学系统:作为自动机的形式化和使用神经网络的界面设计."计算机&教育 49,第 3 期(2007):545–561。
[12] Schierholt,Karsten 和 Cihan H. Dagli。"股票市场预测使用不同的神经网络分类结构."金融工程的计算智能,1996 年。IEEE/IAFE 1996 年会议记录,第 72-78 页。IEEE,1996 年。
[13] 本特兹 Y ,布恩 L ,康纳 J 。用卡尔曼滤波器和神经网络模拟股票收益对经济因素的敏感性。金融工程中的计算智能会议录。纽约州 : IEEE 出版社,1996 年。**
[14]布劳纳、埃里克·奥、朱迪思·戴霍夫、孙晓云和沙伦·霍姆比。"黄金交易模型的神经网络训练技术."金融工程计算智能(CIFEr),1997 年。IEEE/IAFE 1997 年会议录,第 57-63 页。IEEE,1997 年。
[15] Loch、Tillmann、Ivo Leuschner、Carl Genberg、Klaus Weichert-Jacobsen、Frank Küppers、Evangelos Yfantis、Michael Evans、Valeri Tsarev 和 Michael Stö ckle。"前列腺经直肠超声的人工神经网络分析."前列腺 39,3 号(1999):198–204。
[16]马丁尼奥、瓦尔基利亚·里贝罗·德卡瓦略、克洛多瓦尔多·努内斯和卡洛斯·罗伯托·米努西。"基于人工神经网络的高校课堂辍学风险群体智能预测系统."在人工智能工具(ICTAI),2013 IEEE 第 25 届国际会议上,第 159–166 页。IEEE,2013 年。
[17] Lykourentzou、Ioanna、Ioannis Giannoukos、Vassilis Nikolopoulos、George Mpardis 和 Vassili Loumos。“通过结合机器学习技术在电子学习课程中进行辍学预测。”计算机&教育 53,第 3 期(2009):950–965。
[18]阿吉拉尔、何塞、普里西拉·巴尔迪维索、豪尔赫·科尔德罗和曼努埃尔·桑切斯。"基于多智能体系统的智能教室概念设计."载于【T2 人工智能国际会议论文集(ICAI)】,第 471 页。2015 年世界计算机科学、计算机工程和应用计算大会(WorldComp)指导委员会。
19 何塞·阿吉拉尔。"大学的智能教室是电子社会的支柱之一."在电子民主&电子政务(ICEDEG),2016 年第三届国际会议上,第 138–144 页。IEEE,2016。
20 阿吉拉尔、何塞和普里西拉·巴尔迪维索-迪亚斯。“在智能教室中学习分析,提高教育质量。”在 eDemocracy &电子政务(ICEDEG),2017 年第四届国际会议上,第 32–39 页。IEEE,2017。
[21]维纳、劳拉·r 和杰里米·库珀斯托克。"智能教室:在不断发展的技术环境中改变教与学."计算机&教育 38,第 1 期(2002):253–266。
[22]斯蒂费尔哈根、莱纳、妮可·贝纳丁、哈齐姆·凯末尔·埃克内尔、j .麦克多诺、凯·尼克尔、迈克尔·伏伊特和马蒂亚斯·沃尔费尔。"一位讲师在智能研讨室的视听感受."信号处理 86,12 号(2006):3518–3533。
23 亚历克斯·彭特兰。“社会意识、计算和交流。”计算机 38,3 号(2005):33–40。
[24]马丹、安摩尔、罗恩·卡内尔和亚历克斯·桑迪·彭特兰。“GroupMedia:分布式多模态接口。”第六届国际多式联运接口会议论文集,第 309–316 页。美国计算机学会,2004 年。
[25] Gligori、Nenad、Ana Uzelac 和 Srdjan Krco。“智慧课堂:讲座质量实时反馈。”在普适计算与通信研讨会(PERCOM Workshops),2012 IEEE 国际会议上,第 391–394 页。IEEE,2012 年。
注:下一章重点介绍架构设计和流程图来理解模型。
我设计了一个人工智能系统,它可以以边际准确度预测‘学术不诚实’(智能教室)
AIEMS 项目
第 2 章,第 1 部分,人工神经网络架构
未来的虚拟现实辅助课堂【照片由克里斯蒂安·弗瑞格南在Unsplash上拍摄】
标识 AIEMS(人工智能教育监控系统)
项目名称:“AIEMS(人工智能教育监控系统):网络教育高级人工智能(AI)监控与反馈系统开发”
第二章
人工神经网络体系结构
在我们之前的第章中,我们重点介绍了具有嵌入式人工认知能力的智能教室的概念。由于疫情仍然有效,课堂转移主要在网上进行,智能教室的架构应该提供创新,并解决传统教育平台的挑战。
我们强调了在线教育的两个主要挑战:( I)加强在线监督机制,确保学术诚信;( ii)提供及时且具有成本效益的学生表现反馈机制。
作为教育工作者的另一个主要挑战是识别学生的学习风格。大多数学生可以很容易地分为以下几类:
(1)口头:他们更喜欢通过关键词来学习。
(2)视觉:他们更喜欢通过图片来学习。
(3)听觉:他们更喜欢通过声音/节奏来学习。
(4)身体/亲缘美学:他们更喜欢通过身体接触来学习。
(5)逻辑/数学:他们更喜欢通过推理来学习。
作为一名教育工作者,在教案中不可能总是涉及所有不同的学习风格。人工智能(AI)技术可以将这一挑战转化为现实,并提供更多灵活性。本章主要关注在开发我们的项目 AIEMS 中使用的人工神经网络(ANN)架构。AIEMS 的动机是开发一个智能虚拟教室,为其学生成员提供全面的学习体验。同时,它将通过人工智能增强的监考机制来解决学术不诚实的挑战。
深度学习(DL)已经在这个特定的模型应用程序中用于开发 AIEMS 平台,因为它可以很容易地应用于多层神经网络。人工神经网络(ANN) 是一种数学模型,其灵感来自于神经元(我们大脑的基本工作单元)的架构。人工神经网络的基本结构如下所示:
人工神经网络(ANN)的体系结构
数学上,单层神经网络可以由下面的等式(1)表示
神经网络方程
学习分析需要处理大数据。因此,自适应计算算法可以通过管理模式并同时将新的输入数据累积到该模型中来进行有效的分析。深度学习(DL)已经在 fintech 行业显示出应用和范围,并不断用于检测欺诈活动。
了解平台的基础设施
AIEMS 是一个虚拟的电子学习平台,将有助于智能教室环境中的几个主要目的之一:
识别学生的认知学习风格。
这一点尤其重要,因为在大多数教室里,导师或教育者讲授的课程通常是标准化的,并偏向具有特定学习风格或能力的学生听众。这最终对一个学生的全部潜力的发展有很大的影响。在人工神经网络的帮助下,可以准确地识别学生固有的学习风格,从而可以为学生提供对他们的学习和发展理想的学习材料风格。同样,教育工作者需要通过分析和预测智能教室(或虚拟教室)中发生的学术和社会变化来了解他们的表现。
为了便于理解学生的认知学习风格,可以用流程图来补充。下面的流程图可以用来识别学生是否是视觉学习者。
确定可视学习者并将学生记录存储在数据库中的流程图
所附流程图是用于确定视觉学习者的模型的简化表示。由于视觉学习者通过图片和图表适应学习过程,因此教师可以提供包含图片的课程计划。在材料呈现给学生后,可以问他们一系列与材料相关的问题。如果学生能够以 50%及以上的分数准确回答,那么该学生可以被视为视觉学习者。
尽管这可能不是一个非常准确的模型,并且存在潜在的挑战。然而,它确实提供了一个机会来推进当前提供给学生和导师的学习平台。
网页参考资料
[1]https://sites . Google . com/site/holistic app education/engaging-different-learning-styles
我不相信电子
…不要让我开始谈论“共识”科学
约翰·哈维·凯洛格医生,由安东尼·霍普金斯扮演,在 1994 年电影《威尔维尔之路》的一个场景中成功完成手术后图片:巴特尔克里克询问者
所以,我参加了加州大学进化生物学系的员工会议。本周最大的担忧是校园被基督徒占领。史蒂文·j·古尔德被传唤去做一次演讲,谴责神创论(有点矫枉过正)。这在当时是一项非常流行的活动——丹尼尔·丹尼特和理查德·道金斯正在互相超越,以证明谁的无神论最纯粹。其中一个教授问房间里的人,“你们今天看了的报纸 了吗?35%的美国人不相信进化论!”我控制不住自己——我脱口而出:“太好了!”他们都盯着我,好像我放了个屁。我不是在交朋友,所以我解释说,“50%的美国人相信占星术。我们赢了!”
他们一点也不觉得这有趣。因此,我在那里默默忍受了余下的学业。也许我全错了,但我不认为科学中的任何问题是“信仰”的问题。科学家应该是专业的怀疑论者。的确,可能问科学家最烦人的问题是他们是否相信一个理论。更令人不安的是询问普通大众,他们是否相信科学家无法证明的事情:“真相。”
科学到底是什么?
从童年开始,我们都被灌输了科学的童话观点 :
科学在人类的努力中是独一无二的,因为它是累积的和进步的。将科学与其他形式的知识区分开来的是一种被称为“科学方法”的东西,在这种方法中,观察到的事实通过逻辑演绎或假设得到扩展,通过归纳产生,并被测试和验证。新的科学理论包含并取代了旧的理论,如 matryoshka 玩偶,扩大了范围、应用和预测的准确性,永远朝着真理前进。
这是一个神话,任何有思想的科学家都知道。然而,所有从事实践的科学家都在积极地延续这种虚构,以一种枯燥的、假设性的演绎叙述(观察、假设、方法、结果、结论)发表他们的工作,而不管想法是如何产生的,或者工作实际上是如何完成的。
卡尔·波普尔(Karl Popper)在标准观点(逻辑实证主义或逻辑经验主义)中戳出了巨大的漏洞,令人信服地指出,科学理论永远无法被证明,我们所能期望的最好结果是证伪一个科学理论。普拉特认为,科学家应该应用“多重假设的方法”,在这种方法中,他们提出尽可能多的替代解释,并着手根据每一个 other⁴.来检验它们
托马斯·库恩在他对科学 revolutions⁵.的历史分析中挑战了科学进步是知识的稳定积累的观点库恩区分了“正常”科学和“革命”科学的阶段。正常科学在一个普遍的理论共识(“主导范式”)内运作,很像经典观点。库恩将正常科学时期的科学进步比作“解谜”,在这种情况下,群体得出理论的含义,类似于演绎推理。当出现当前理论无法解释的异常或不一致时,科学家不一定会放弃该理论,但往往会开发出特设假设来修正当前理论(例如,在托勒密轨道或玻尔原子模型中添加本轮[图 2])。
图二:特设还是辉煌? **左:**玻尔原子模型:允许电子占据离散轨道,对应驻波。**右:**太阳系的第谷模型:地球为中心,月球和太阳围绕地球运行,其他行星围绕太阳运行。这在数学上等同于哥白尼体系,没有一些我们感觉不到地球旋转的怪异现象。作为一名天文学家和炼金术士,布拉赫是科学史上最古怪的人之一,他养了一只宠物驼鹿,雇佣了一名矮人灵媒,还和女王有一腿。可悲的是,他的驼鹿死了,因为它喝醉了,掉进了 stairs⁷.图片:维基共享
历史并不总是善待被抛弃的理论或临时的假设,认为它们是毫无理性基础的无稽之谈。费耶阿本德庆祝他们的发明。摆脱了教条,科学革命充满了创造力。特别的理论使停滞不前的领域恢复生机和活力。他们受到启发,为激进的新思想和理论铺平道路。
另一方面,新的或竞争的理论可以解释异常现象,但抛弃了以前理论的大部分范围。一个很好的例子是从炼金术到化学的转变(图 3)。库恩和费耶阿本德都没有达成一致的范式(共同的前提、观察、定义、范围、价值),理论之间的争论是不相称和不合理的。新的价值观、论点、方法、美学、对大众媒体的吸引力,都变成了公平的游戏(费耶阿本德称之为“一切皆有可能”)。费耶阿本德提倡方法论无政府主义,认为不存在科学 method⁶.这样的东西
图 3:燃素理论炼金术士 J.J .贝尔彻(1667 年)、皮埃尔·约瑟夫·麦克克尔、格奥尔格·恩斯特·斯塔尔(1731 年)开始对元素进行系统分类,对早期化学做出了贡献,其中包括 phlogiston⁸.燃素理论提供了一个结合燃烧(如火)和腐蚀(如锈)的一般理论。氧气的发现(约瑟夫·普利斯特列和安托万·拉瓦锡 1774 年)是炼金术终结的开始。可以说,炼金术正在进步,如果你愿意接受燃素具有负质量。图片:布朗大学干草展览[8]
*图 4:勒内·笛卡尔的肌肉收缩气动理论。【2000 多年来,肌肉收缩理论经历了几次范式转变。盖伦(公元 129-200 年)指出,肌肉以激动剂/拮抗剂对的形式发挥作用,由“动物精神”驱动(动画是动物区别于植物的能力)。勒内·笛卡尔在 1664⁹.提出了肌肉的液压机制(气球)理论 1667 年,Jan Swammerdam 证明肌肉收缩时体积不变。加尔瓦尼(1791 年)证明了电可以引发肌肉收缩,从而产生了电动理论(灵感来自玛丽·雪莱的《弗兰肯斯坦》中的动画)*。蛋白质折叠或蛋白质弹簧理论主导了 200 年。目前的滑动灯丝理论是在 1954 年才建立起来的。这些理论中的每一个都具有深刻的创造性,并得到了很好的支持。每一个都对我们的知识有所贡献,尽管并不正确。图片:维基共享
科学辩论的一个不受重视的方面是所使用的修辞,这通常远非理性。第谷·布拉尼年轻时在一次决斗中失去了鼻子,戴着黄铜假肢。这给了他在辩论中的巨大优势,就好像一个演讲者提出了一个相反的观点,他会不经意地移开并擦亮他的鼻子,分散观众的注意力。伽利略的文章充满了讽刺和嘲笑,即使对现代人来说也很有趣。他用意大利方言而不是学术性的拉丁语发表论文,以面对更广泛的读者⁰.对大众媒体和名人的吸引力一直延续到现代,不管是好是坏。
在波普尔、库恩和费耶阿本德之后,新实证主义“死了,或者说像一场哲学运动一样死了。”除了证伪之外,科学家们对于什么是科学、什么是独立于理论的事实、什么方法是发展理论的有效方法、当在理论之间做出决定时应该应用什么价值观都没有达成共识,并且很少有人轻率地宣称他们的理论在任何客观意义上都是“真实的”。公开的问题是,科学理论是否至少是对现实的真实描述,以及相信不可观察的实体是否合理——比如我们的朋友电子。
实用主义
许多科学家的谨慎立场是对理论的真实性采取不可知论的立场,同时重视其成果。由于量子力学的怪异,大多数物理学家已经放弃了形而上学。量子力学被接受是因为它与实验相符;就是这样。在礼貌的谈话中,人们会回避它的意思或它是否为“真”。(“闭嘴算了。”)
实用主义者对科学的主张没有那么夸张:一个理论的价值是功利的——它有预测价值,并使应用成为可能。理论只是“理论”,而不是事实或定律。通常,“模型”一词被用来代替“理论”,部分是为了避免认识论的包袱。(模型被弱定义为“某事物的数学或统计表示或近似。”)事实上,模型被视为现实的有用类比或图像。经常使用的一个生动的比喻是从巴勃罗·毕加索那里借用的——“艺术是帮助我们看到真理的谎言。"
一个不那么深奥,但更有趣的世界
这种世界观比听起来更乐观。考虑到另一种现实主义观点最终会导致科学的完成。1996 年,《科学美国人》记者约翰·霍根在中同样暗示了科学的终结,大部分科学中的重大问题都将得到解答的时刻即将到来。一旦物理统一了,就可以推导出化学,解释出生物学。留给科学的只是细节的逻辑推理,即解谜。那有什么好玩的?在不可知论者的观点下,真理永远无法被知晓,科学探索是一种更加人性化的活动,科学辩论也是无穷无尽的有趣。
你必须亲眼目睹,才能相信吗?
利用望远镜,伽利略看到了月球上的山脉、太阳上的斑点以及围绕木星运行的卫星。这可能被视为可验证的科学,因为原则上,一个人可以到月球上去看看山。但是微观世界呢?起初,望远镜和显微镜似乎没有什么区别。也许我们可以相信光学显微镜…在某种程度上。但如果你接受当前的理论,微观领域与宏观领域完全不同,物理定律也有完全不同的表现形式。没有办法像月球上的山一样,用我们的感官直接体验这个世界。我们看到的东西有多少取决于我们对所看到的东西的理论?我们没有看到什么?
理性经验主义也因复杂性而受挫。你可能很难找到一个了解大脑如何工作的神经科学家或者一个了解免疫系统如何工作的免疫学家。我们还不清楚疫苗是如何起作用的,也不清楚为什么免疫系统不能在一连串的免疫反应中自我消化。有数百种类型的细胞、分子受体、细胞因子和神经递质——所有这些都在一个组合的连接网络中相互作用,往往产生与它们在体外单独作用截然相反的效果。神经科学中充满了神秘和冒险。一个关于所有认知系统的令人沮丧的说法是“也许一个事物最简单的表现就是它本身。”
那么,我们如何看待这一切呢?很明显,科学发现了一些东西。牛顿力学仍然被用来解决绝大多数的工程问题,尽管它是“错误的”在发现 DNA 的 100 年前,基因是假设的、不可观察的实体,具有非凡的预测能力。它们现在几乎可见,那么我们应该‘相信’它们吗?我想是的——你难倒我了。
另一方面,我们对电子含义的理解在 100 年里已经发生了多次转变。电子既不是粒子也不是波,或者也许它们是场中的扰动。它们有电荷和自旋,但没有质量(它们只是从希格斯玻色子那里‘借用’了质量)。他们既不在这里也不在那里。你踢一个,另一个就掉在 60 光年之外。相信电子是双重思考的练习:同时持有相互矛盾的想法。我们只能同意电子是一个有用的概念。当你死的时候,你可以问上帝它们是什么。
你不会真的相信这一切吧?
费耶阿本德在我伯克利的哲学专业朋友中非常受欢迎。年轻的时候做一个反传统的人很有趣。我觉得我错过了,所以我在研究生院旁听了他的一些讲座。他非常有趣。下课后,我抓住他,诚恳地告诉他我一直在读他的一本书。他问我:“哪一个?”当我告诉他,“反对方法”时,他似乎很惊慌。“天哪,我太尴尬了。那是一本可怕的书。”
费耶阿本德从未把自己看得那么重,他在《科学的终结》中告诉约翰·霍根,“我认为西方科学能够为自己辩护。”库恩发现自己与库恩派分道扬镳,坚称自己不支持一种文化相对主义。建设性的经验主义者认为,科学已经取得了如此多的成就,并做出如此准确的预测,而没有一些真理内容,这将是一个“奇迹”。
但是费耶阿本德对暴政科学教条的警告受到了广泛关注。教条限制了自由的思想和辩论。教条很无聊。鹦鹉学舌不是学习。教条可能是错误的。唯一仍然有效的认识论原则是可证伪性。学术界和媒体的伪善让我们所有人都支持他们被证明在从气候变化到碳水化合物的所有事情上都是错误的。在他的自传《⁴》中,他哀叹道,“我常常希望我从未写过那本该死的书。”我很高兴他这么做了。
信念的意志
这让我想起了教员会议。在实践中,科学家认为什么是“真”并不重要。公众认为科学家们相信什么更不重要。在员工会议上,高度敏感的研究生对著名科学家伪造上帝的努力充满敬意。
一个可能很重要的问题是“有自由意志这种东西吗?”在笛卡尔物理学的时钟宇宙下,答案似乎是“不”。量子力学给我们留下了一些关于相信什么的可怕选择:从不可证伪和不相关的“多世界”解释到悲观的超级决定论观点。这两个极端都不允许自由意志。我当然希望自由意志存活下来,因为我发现宿命论令人沮丧。在那之前,我仍然坚定地站在实用主义者一边。正如威廉·詹姆斯所宣称的,“我自由意志的第一步就是相信自由意志。”
改变我的想法。
Russell Anderson 拥有加州大学的生物工程博士学位和电子工程学士学位。他的学术研究涉及生物系统(神经、免疫和进化)中的学习。他在洛斯阿拉莫斯和利弗莫尔国家实验室、加州大学(伯克利、旧金山、戴维斯和尔湾)、史密斯-凯特尔维尔眼科研究所和加州卫生部进行研究生研究。他曾在 IBM、Opera Solutions、HNC Software、KPMG、NICE/Actimize、HCL、Mastercard、JP Morgan Chase 和苏格兰哈利法克斯银行担任首席科学家。他发表了 30 多篇科学论文,拥有 5 项商业预测系统专利。
后记:对⁵ 的回复和讨论的总结
欢迎提问/评论:anderson.transactionanalytics@outlook.com
脚注:
1.理查德·道金斯(2006 年)。神痴。波士顿:霍顿·米夫林
2.在加州大学,“报纸”指的是《纽约时报》。当地报纸的所有标题都是关于辛普森的慢速汽车追逐,它发生在大约 15 英里以外(1994 年 6 月)。
3.卡尔·波普尔 (1935,1959)。科学发现的逻辑
4.约翰·r·普拉特(1964)。强有力的推论。科学第 16 期,第 146 卷,第 3642 期,第 347-353 页
5.托马斯·s·库恩(1962)。科学革命的结构 (1962)芝加哥大学出版社
6.保罗·费耶阿本德(1975 年)。反对方法:一种无政府主义知识论的提纲。纽约州纽约市 Verso 图书公司。
7.JLE·德雷耶(1890 年)。第谷·布拉尼:一幅 16 世纪科学生活和工作的图画。爱丁堡的亚当和查尔斯·布莱克。第 210 页
8.Pierre Macquer,《化学理论与实践的要素》,第二版,第 1 卷, Hay 展品,2020 年 1 月 9 日访问,https://library.brown.edu/exhibit/items/show/7。
9.m .科布(2002 年)。《时间线:驱走动物灵魂:简·斯瓦默达姆论神经功能》 (PDF) 。自然评论神经科学。3(5):395–400。
10.斯蒂尔曼·德雷克(1957)。伽利略的发现和见解。纽约:双日。
11.约翰·帕斯莫尔(1967)。逻辑实证主义,哲学百科全书。).纽约:麦克米伦
12.约翰·霍根(1996 年)。科学的终结:在科学时代的黄昏面对知识的极限。艾迪森-韦斯利
13.巴斯·范·弗雷森(1980)。“我认为当前科学理论的成功不是奇迹。这对科学(达尔文主义者)来说并不奇怪。因为任何科学理论都诞生于激烈竞争的生活中,是一片满是牙齿和爪子的丛林。只有成功的理论幸存下来——那些事实上抓住了自然界实际规律的理论。”《科学的形象 (1980),第 40 页。
14.保罗·费耶阿本德(1995) 消磨时间。芝加哥大学出版社。
15.我不相信电子——续集(2020 年 3 月)。走向数据科学。https://towards data science . com/I-don-t-believe-the-sequel-FFA 1 b 76 EC 7 a