大白话5分钟带你走进人工智能-第二节概率基础及高斯分布

本文从数学角度出发,为证明线性回归中损失函数是最小二乘,铺垫了高斯分布这一重要概率密度函数。介绍了高斯分布的发现过程,指出自然界中大量现象由多种随机过程结合,结果趋向正态分布。还讲解了概率论基础,如随机变量、概率密度函数等,下节将推导mse损失函数。

                                                                         第二节:概率基础及高斯分布

上一节中我们讲述了机器学习的常规套路,以及一些基础的概念,比如损失函数,随机变量等。了解了线性回归中的损失函数是最小二乘,那么本节我们通过数学的角度证明为什么是最小二乘?所以有必要铺垫一个很重要的概率密度函数,高斯分布

既然是分布,它本身就代表一个概率密度函数。只不过高斯分布,拆解开来,就是服从某种特点的概率密度函数。我们知道高斯分布的图形是这样的:

                                                                                                                                              

 

这个图像是高尔顿最早发现的,高尔顿是达尔文的表哥,小的时候做游戏的时候,发现如下图所示的游戏中:

他发现把一堆小球给倒进去之后,最后落在隔板里的越靠中间的落的越多,越靠外面的越来越落的越远,因为钉子是完全随机的,每次倒入小球的过程中,小球每次碰到钉子都会随机地往左走或者往右走,那么小球总共遇到多少层钉子就有多少次往左或者往右的机会,只要这个机会是公平的,最后最多的小球往左的次数跟往右的机会差不多,所以都落到中间的位置。而极少的小球回落到两边,从而他发现了这个高斯分布的函数。

好多自然界中的事物就是服从高斯分布的,比如大学里把女性的教职员工拉过来,在操场站队,按身高五厘米为一个间隔,各自占一个队。你会发现特别矮的和特别高的都怎么样,比较少。身高在中间的最多,也在背后默默地形成了这么一个高斯分布的图形。

思考一下这个背后是为什么?什么决定了一个人的身高?好多种因素,从基因角度就有好多个基因决定。再从你未来生活的饮食习惯有好多种决定你爱不爱运动,又有好多种决定就是是不是好多好多种因素公平的综合的决定了你高还是矮。你想特别倒霉的人基因又矮,吃了又少,又不爱动了,然后父母所有基因都矮的人是不是一定会比较少,因为就相当于在高尔顿钉板这个模型里边,小球一直在往左走,每一个命运的岔路口他都选择了不好的决定,最后造成了它是一个比较特殊的例子。而对于人来说每一个因素决定身高很高这一种可能性也少。所以说若干个随机过程共同决定出一个结果的时候,往往最终的结果的概率密度函数会服从一个高斯分布的形式。 所以我们看简单来说,自然界中大量的现象都是由多种随机过程结合,最后得到一个结果,比如身高,那么根据中心极限定理,不同随机变量满足独立随机相加,就会让结果趋向于正态分布,这个结果就会趋向于正态分布的结果。也就是对于任何一个数学建模来说,我们不知道它服从什么分布的时候往往先拿正态分布来进行尝试。因为正态分布是最常见。

既然是高斯分布式一个概率密度函数,所以自然可以用数学的形式表达出来,具体怎么样得出高斯分布的概率密度函数我们不做推导,仅给出高斯分布的概率密度函数。

                                                                        f(x)=\frac{1}{\sigma \sqrt{2\pi }}e\tfrac{-(x-u)^{2}}{2\sigma ^{2}}

解释:

π就是3.14 ,e是2.7,\sigma是方差,u是均值。

我们理想的概率密度函数,就好比是一个完美的机器,答题机一样,你给我一个题目X,我给你结果概率,给我一个x我给你概率。什么情况下这个机器就算确定好了,只要你确定了均值和标准差,这个机器就算确定好了,也就是在σ和μ这两个东西已知的在均值和标准差都已知的情况下,给一个x就会得到一个唯一的结果,那么均值和方差怎么求?

从名字中就可以窥探一二,假设你收集上来的这堆数据真的服从高斯分布的话,并且你收集上来数量又足够多的情况下,均值就是平均值。\sigma就是方差,如下公式。

                                                                           \frac{1}{m}(y-y(\theta ))^{2}

 

以上实际上我们是我们是讲解了一下概率论的一些基础,咱们回忆下什么是随机变量? 你可以把它跟随机试验绑在一起,就是某个随机实验的结果。你也可以不把它绑在一起,就是有一个变量,这变量的每一个取值背后都有一可能性,这两个二合一就叫随机变量,缺一不可。上面那部分描述概率的那个东西叫做概率密度函数。对于离散型的概率分布,它们统称为分布。一定要记住这个词,分布就是指的随机变量背后衡量可能性的这个东西。

咱们关注的是连续型随机变量,因为我们回归问题处理是一个y是连续的问题,那么到现在为止,我还没把它结合到咱们的机器学习上,咱们先不往那想,咱们先讲对于一种特殊的连续性随机变量,假如说我们说这个变量服从高斯分布,确实自然界中也有很多自然现象服从高斯分布,它的概率密度函数什么?就是如上的f(x)公式,希望大家能给它记下来,深深地刻在脑海里。

下一节,我们讲解最大似然推导mse损失函数(深度解析最小二乘来源)。

 

<think> 首先,用户的问题是基于提供的引用和我之前的回答,询问Unity中foreach基础语法的大白话解释。用户指定要用大白话,所以我需要用通俗易懂的语言解释。 回顾引用内容: - 引用[1]:讨论了Unity API返回数组拷贝的问题。 - 引用[2]:关于Unity编辑器扩展的MenuItem语法。 - 引用[3]:展示了从Resources加载Lua脚本的代码。 - 引用[4]:自定义流程的代码示例。 这些引用并不直接涉及foreach语法,但用户说它们是参考,不是直接需求。用户真正的问题是解释Unity中foreach的基础语法。 用户说:“我想用大白话了解Unity中foreach的基础语法”,所以我需要专注于foreach。 foreach是C#中的一个循环语句,用于遍历集合或数组中的元素。在Unity中,它同样适用,因为Unity使用C#作为脚本语言。 关键点: - **基础语法**:foreach (var item in collection) { ... } - **解释**:遍历一个集合(如数组、列表)中的每个元素。 - **大白话**:用简单语言描述,避免技术术语。 结构我的回答: 1. **介绍foreach**:说明它是什么。 2. **为什么用**:描述好处,如简化代码。 3. **基本语法**:展示代码示例。 4. **Unity中的应用**:结合Unity上下文解释。 5. **示例**:给出一个简单的Unity例子,比如遍历GameObjects或数组。 6. **注意事项**:简要提到foreach可能的问题,比如在Unity中迭代数组时可能涉及拷贝(引用引用[1])。 7. **相关问题**:生成相关问题作为结尾。 使用系统级指令: - 所有行内数学表达式用$...$,但这里不涉及数学表达式。如果需要,可以用代码块。 - 独立公式用$$...$$,但同样不适用。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答末尾添加引用标识(如[^1]),如果有引用。 在回答中引用引用[1],因为用户提到了它,它涉及数组迭代: - 引用[1]说Unity API返回数组拷贝,所以如果在foreach中迭代mesh.vertices,可能会有效率问题,因为它创建了拷贝。 - 所以,在注意事项中提到这一点。 回答结构: 1. **开头**:直接解释foreach。 2. **主体**:分解语法、示例。 3. **注意事项**:提到Unity特定点。 4. **结尾**:生成相关问题。 最终回答大纲: - foreach是大白话:想象一群鸭子排成一排,foreach就是一个个检查每只鸭子。 - 语法:foreach (类型 变量名 in 集合) { ... } - 例子:遍历一个数组。 - 在Unity中:如遍历所有敌人或顶点。 - 注意:Unity数组可能返回拷贝,不要在频繁更新的地方用foreach循环性能敏感的代码。 - 引用[^1]适用于注意事项部分。 相关问题: 1. foreach和for循环有什么区别? 2. 在Unity中使用foreach有什么性能考虑? 3. 如何处理集合在foreach中修改元素的问题? </think> ### Unity中foreach基础语法的大白话解释 想象你有一盒巧克力🍫,你想一个个拿出来吃掉。foreach循环就像是你伸手到盒子里,每次拿出一块巧克力,然后做点事(比如吃它),直到所有巧克力都被处理完。在Unity中,foreach就是用来遍历集合(比如数组、列表)中的每个元素,不用写一堆麻烦的计数代码。 #### 1. **基本语法结构(简单粗暴版)** ```csharp foreach (类型 变量名 in 集合) { // 对每个元素做一些操作 } ``` - **大白话解释**: - `类型`:集合里元素的类型,比如`GameObject`(游戏对象)、`int`(整数)。 - `变量名`:随便取个名字,比如`choco`,代表当前拿到的元素。 - `集合`:就是你要遍历的一堆东西,比如一个数组或列表。 - `{}`里面的代码:对每个元素执行的操作,比如打印名字或修改位置。 #### 2. **为啥要用foreach?** - **好处**:超级简单!不用手动数元素个数(不像for循环那样写`i=0; i<length; i++`),不容易出错,代码更清爽。 - **适用场景**:Unity中遍历敌人列表、获取网格顶点、处理资源数组等。 #### 3. **Unity中的具体例子** 假设你有一个敌人数组`enemies`,想给每个敌人加10点血量: ```csharp // 定义敌人数组(假设已经在Unity中赋值) GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy"); // 用foreach遍历每个敌人 foreach (GameObject enemy in enemies) { // 拿到敌人的血量组件,增加10点 Health health = enemy.GetComponent<Health>(); if (health != null) { health.AddHealth(10); Debug.Log(enemy.name + "的血量增加了!"); } } ``` - **大白话解读**: - `foreach (GameObject enemy in enemies)`:从`enemies`数组中一个个“抓”出敌人,每次抓到的就叫`enemy`。 - 括号里的代码:对每个`enemy`,检查有没有血量组件(`Health`),有就加血,并打印消息。 #### 4. **注意事项(Unity特有)** - **性能小坑**:Unity的一些API(如`mesh.vertices`)返回数组时,是返回一个**拷贝**而不是原数据。这意味着: - 如果用`foreach`遍历这些数组,可能会浪费性能(因为拷贝操作耗时)。 - 解决方案:如果集合很大,改用`for`循环直接索引原数组,避免拷贝。参考你的引用[1],它解释了为什么Unity这样设计(防止意外修改核心数据)[^1]。 - **不能修改集合大小**:在`foreach`循环中,不能添加或删除集合元素(比如删除敌人),否则会报错。需要改集合时,先用`for`循环或临时列表。 #### 总结 Unity中的`foreach`就是一个“懒人神器”:帮你自动遍历集合里的每个东西,你只管写“对每个元素干啥”的代码就行。记住,简单场景用它很爽,但遇到性能敏感(如大量数据)或Unity的特殊数组时,小心拷贝问题!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L先生AI课堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值