介绍
在某个时间点,您可能听说过中奖彩票的机会非常渺茫。与所有与概率相关的事情一样,多次试验可能会导致结果对你有利。现在,如果你参加很多次彩票,你中奖的机会会更大一些,这取决于你参加了多少次彩票。这仍然不能保证你最终会中奖,但是是均匀分布的,并根据大数定律(在本例中意味着大量彩票),我们可以得出相对更有可能的可能性。
重要的是要了解,每个新彩票都是独立于其他彩票的,并且相同的彩票“彩票号码”可以赢得许多不同的彩票(遵循大数定律)。您也可能会运气不好,无论您尝试了多少次,每次都选错了号码。您现在有两个选择:
- 您每次都可以尝试随机数。
- 您每次都可以尝试相同号码。
理论上(和数学上),这两种情况发生的可能性相同。然而,场景 2 会给你带来轻微的优势。随着次数接近无穷大,最终每一个数字都会被选中。问题是,对于场景 1,您需要尝试更多次,希望您当时选择的数字与获胜的数字相匹配。在场景 2 中,您确信随着试验趋于无限,您的数字将在某个时刻“获胜”。对于本博文,我们将使用场景 2。
那么,在我告诉你答案之前,你认为你能回答这个问题吗?
“如果您周围的所有彩票都有正好 100 万人的老虎机,并且您为每个玩过的人都选择了同一张彩票 [x],那么您需要玩多少张彩票才能最终成为中奖者?” (欢迎评论您最初的答案)
答案是...
大约1440万次。
这篇博文的其余部分将介绍我如何得出该值、如何进行模拟以及一些注意事项。从这里开始事情会变得更加技术化。
逻辑
100万人的彩票号码范围为1 - 1,000,000(或0 - 999,999)。玩家每次抽奖只能选择该范围内的号码,中奖彩票也只能来自该范围。本质上,我们可以说我们将拥有一组 100 万个数字。
考虑到用户可以选择该范围内的任何数字,我们需要满足集合中的每个项目至少被击中一次的条件。这是因为,如果每个号码至少被叫过一次,那么它将涵盖玩家可能选择的任何可能的票号。这也意味着我们不关心每个数字运行了多少次,从而使“集合”成为用于我们的模拟的理想 Python 数据结构。我们将从一个空集开始,并在每次迭代时用随机生成的数字填充它,直到该集包含指定范围内的每个数字。由于 Python 集合不重复数字,因此我们不必担心确保唯一性。
def calculate_lottery_chances(lottery_players_count): number_set = set() count = 0 while len(number_set) <p>对于 1,000,000 人的彩票,函数调用如下:calculate_lottery_chances(1000000),它将返回中奖之前尝试彩票的次数。以这种方式排列代码使其具有很强的可扩展性。</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567637690021.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"></p> <h2> 问题 </h2> <p>简单来说,问题的根源就是“变异”。第一次运行该函数时,我得到了“1310 万”次作为我的值。我重新运行了一下,得到了大约 1390 万的结果。我这样做了更多次,得到的答案差异很大——在某个时候,我得到了 1500 万个。很明显,我需要这样做并找到平均值。按照到目前为止的现有模式,我认为随着平均迭代次数趋于无穷大,我将更接近于得到<strong>一个</strong>可靠的答案。需要一些可以做到这一点并且快速完成的东西,这促使我编写了这个函数:<br> </p> <pre class="brush:php;toolbar:false">def average_over_n_times(function, function_arg, n): """ This returns the average of the returned value of a function when it is called n times, with its (one) arg """ total = 0 for x in range(0, n): total += function(function_arg) return round(total/n)
随后,所有内容都会被修补为:
num_of_trials = average_over_n_times(calculate_lottery_chances, lottery_players_count, n)
其中“n”表示对结果进行平均的次数。然而,这带来了另一个问题,我们将在下一节中讨论。
“n”应该是什么?
n 的值越大,结果越接近“平均情况”。然而,考虑到仍然没有绝对性或确定性,执行这一系列任务太多次就会失去生产力。我这么说有以下原因:
- 时间不是无限的,我们不能无限期地执行这些计算,这意味着每次运行时总会有变化(无论多小),这违背了“绝对”的想法。
- 计算资源是有限的。
- 这个实验的假设之一是计算机生成的“随机性”可以准确地模拟现实。
- 就像算法运行时一样,较小的幅度不再与较大的幅度一样重要。当处理大于 13,000,000 的值时,大约 100,000 的变化不会那么显着。
牢记这些,我用以下值测试了“n”:10、20、30、50、100、1000 和 5000 次。
PyTorch 从何而来?
此时,您可能想知道为什么博文标题中没有提到“PyTorch”一词。好吧,虽然我提到用不同的值测试 n,但它与我用于所有测试的代码并不相同。
这些都是计算量很大的实验,我的 CPU 跟我说了一句话。我之前分享的代码片段是在一个具有零外部包依赖性的文件中编写的,并且该文件在 bash shell 中运行,并在前面添加了 time 命令来跟踪执行时间。以下是仅使用 CPU 时的执行时间:
n | Time (min and sec) |
---|---|
10 | 1m34.494s |
20 | 3m2.591s |
30 | 5m19.903s |
50 | 10m58.844s |
100 | 14m56.157s |
在 1000 时,我无法再让程序运行了。我不确定是不是中途断了没能停止执行,但我在4小时57分钟后取消了。我认为有几个因素影响了这一点,我将在“注意事项”部分中讨论这些因素。不管怎样,我的风扇噪音很刺耳,我知道我可能已经把笔记本电脑功率适中的 CPU 推得有点太多了。我拒绝接受失败,在思考如何至少运行 4 位迭代时,我想起了一位使用 PyTorch 的朋友告诉我的话:
“GPU 在计算密集型方面通常比 CPU 更高效”
PyTorch 使用 GPU,使其成为完成这项工作的完美工具。
重构
PyTorch 将用于我们目的的计算,因此重构现有的calculate_lottery_chances() 代码意味着更改依赖于CPU 的数值运算并切换到合适的PyTorch 数据结构。简而言之:
- Python set() 数据类型将不再足够。
- Python randint() 函数将替换为其 PyTorch 等效函数。
- 由于 set() 数据类型不够,因此会切换为生成与 lottery_players_count 大小相匹配的零张量,并用布尔值来指示某个号码之前是否中奖。
calculate_lottery_chances 的重构如下:
def calculate_lottery_chances(lottery_players_count): number_set = set() count = 0 while len(number_set) <p>我将设备设置为“xpu”,因为我的计算机使用 PyTorch 支持的 Intel Graphics GPU。</p> <h2> 输出 </h2> <p>为了确保在执行过程中使用我的 GPU,我在运行之前打开了 Windows 任务管理器并导航到“性能”部分。运行时,我发现 GPU 资源使用量出现明显峰值。<br> 对于上下文,这是之前和之后的对比:</p> <p>之前:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567637915280.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"><br> 请注意 GPU 使用率为 1%</p> <p>之后:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567638051975.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"><br> 请注意,GPU 使用率为 49%</p> <p>对于不同 n 值的运行时间,GPU 的速度要快几倍。它在不到一分钟的时间内始终运行低于 100 的 n 值,并且能够计算 <strong>5000</strong>(五千!)</p> 的 n 值 <p>这是使用 GPU 的运行时表:</p> <div><table> <thead> <tr> <th>n</th> <th>Time (min and sec)</th> </tr> </thead> <tbody> <tr> <td>10</td> <td>0m13.920s</td> </tr> <tr> <td>20</td> <td>0m18.797s</td> </tr> <tr> <td>30</td> <td>0m24.749s</td> </tr> <tr> <td>50</td> <td>0m34.076s</td> </tr> <tr> <td>100</td> <td>1m12.726s</td> </tr> <tr> <td>1000</td> <td>16m9.831s</td> </tr> </tbody> </table></div> <p>为了直观地了解本实验中 GPU 和 CPU 操作之间的性能差距有多大,可以考虑以下数据可视化:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567638195144.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"></p> <p>x 轴的上限为 100,因为我无法再从 CPU 获得实际的“及时”输出,因此没有空间与 GPU 进行比较。使用 1000 - 5000 范围内的数字进行实验,结果往往是“1440 万次”。这就是我之前得到答案的方式。</p> <h2> 注意事项 </h2> <p>这个实验做出了假设并依赖于某些做事方式。此外,我对 PyTorch 的经验不足可能意味着可能有更有效的方法。以下是一些需要考虑的因素<strong>可能</strong>影响了我的发现的准确性或执行时间:</p> <ol> <li>我做了一个微妙的假设,即计算机生成的随机性模仿了现实生活(物理世界)中的随机性。</li> <li>虽然我切换了一些逻辑以使用 PyTorch,但其余代码仍然依赖于 CPU。例如,在 Average_over_n_times() 函数中,循环中的加法和求平均值可能都受益于 PyTorch 的等效项。我怀疑性能会有所提升。</li> <li>我不确定我使用的batch_size对准确性和性能的影响。</li> <li>所有 CPU 和 GPU 测试都是在我的电脑接通电源的情况下完成的,以便让机器发挥最佳状态。使用电池供电的设备运行它们可能会获得更长的运行时间。</li> <li>PyTorch 的 CUDA 可能比“XPU”更有优势,但我的电脑不支持前者。 </li> <li>测试期间我避免让我的电脑“休眠”。如果您的计算机处于睡眠状态,测试可能需要更长时间才能运行。</li> </ol> <p>最后,我想指出,这是我第一次使用 PyTorch 做任何事,它的性能给我留下了深刻的印象。</p> <h2> 结论 </h2> <p>当我陷入困境时,我没想到会看到性能上的如此提升。我了解了张量背后的想法以及一些有关计算更复杂的任务背后的支持机制的知识。您可以随意使用、复制或修改代码片段。</p> <p>感谢您对我的包容,希望您阅读愉快。</p> <p>下次再见,</p> <p>干杯。 ?</p>
以上是一次彩票探索如何让我了解 PyTorch 的强大功能的详细内容。更多信息请关注PHP中文网其他相关文章!

Linux终端中查看Python版本时遇到权限问题的解决方法当你在Linux终端中尝试查看Python的版本时,输入python...

本文解释了如何使用美丽的汤库来解析html。 它详细介绍了常见方法,例如find(),find_all(),select()和get_text(),以用于数据提取,处理不同的HTML结构和错误以及替代方案(SEL)

Python 对象的序列化和反序列化是任何非平凡程序的关键方面。如果您将某些内容保存到 Python 文件中,如果您读取配置文件,或者如果您响应 HTTP 请求,您都会进行对象序列化和反序列化。 从某种意义上说,序列化和反序列化是世界上最无聊的事情。谁会在乎所有这些格式和协议?您想持久化或流式传输一些 Python 对象,并在以后完整地取回它们。 这是一种在概念层面上看待世界的好方法。但是,在实际层面上,您选择的序列化方案、格式或协议可能会决定程序运行的速度、安全性、维护状态的自由度以及与其他系

本文比较了Tensorflow和Pytorch的深度学习。 它详细介绍了所涉及的步骤:数据准备,模型构建,培训,评估和部署。 框架之间的关键差异,特别是关于计算刻度的

Python的statistics模块提供强大的数据统计分析功能,帮助我们快速理解数据整体特征,例如生物统计学和商业分析等领域。无需逐个查看数据点,只需查看均值或方差等统计量,即可发现原始数据中可能被忽略的趋势和特征,并更轻松、有效地比较大型数据集。 本教程将介绍如何计算平均值和衡量数据集的离散程度。除非另有说明,本模块中的所有函数都支持使用mean()函数计算平均值,而非简单的求和平均。 也可使用浮点数。 import random import statistics from fracti

该教程建立在先前对美丽汤的介绍基础上,重点是简单的树导航之外的DOM操纵。 我们将探索有效的搜索方法和技术,以修改HTML结构。 一种常见的DOM搜索方法是EX

本文讨论了诸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和请求等流行的Python库,并详细介绍了它们在科学计算,数据分析,可视化,机器学习,网络开发和H中的用途

本文指导Python开发人员构建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等库详细介绍,强调输入/输出处理,并促进用户友好的设计模式,以提高CLI可用性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Atom编辑器mac版下载
最流行的的开源编辑器

Dreamweaver Mac版
视觉化网页开发工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),