第3篇:概率论就是算可能性——猜硬币的故事

🤔 什么是概率论?

概率论说白了就是算事情发生的可能性有多大

你肯定玩过抛硬币吧?正面朝上还是反面朝上?概率论就是用数学方法来研究这类"猜结果"的问题。

🪙 从抛硬币开始

🎯 最简单的例子

抛一次硬币​:

  • 可能结果:正面、反面
  • 每种结果的可能性:看起来相等
  • 所以:P(正面) = 1/2,P(反面) = 1/2

抛两次硬币​:
可能的结果:

  • 正正、正反、反正、反反
  • 每种结果的概率:1/4

💻 用Python模拟抛硬币

import random
import matplotlib.pyplot as plt

def flip_coin(n_flips):
    """模拟抛n次硬币"""
    results = []
    for _ in range(n_flips):
        # random.random() 产生0-1之间的随机数
        if random.random() < 0.5:
            results.append('正面')
        else:
            results.append('反面')
    return results

# 模拟抛100次硬币
flips = flip_coin(100)
heads_count = flips.count('正面')
tails_count = flips.count('反面')

print(f"抛了100次硬币")
print(f"正面出现: {heads_count}次 ({heads_count/100 * 100:.1f}%)")
print(f"反面出现: {tails_count}次 ({tails_count/100 * 100:.1f}%)")

你会发现,虽然理论上应该各50次,但实际结果可能略有偏差。抛的次数越多,结果越接近50%!

📊 概率的基本概念

1️⃣ 概率的取值范围

概率总是在 ​0到1之间​:

  • P = 0:绝对不会发生
  • P = 1:一定会发生
  • P = 0.5:一半一半的机会

2️⃣ 期望值:长期的平均值

例子:掷骰子

  • 可能结果:1, 2, 3, 4, 5, 6
  • 每种结果的概率:1/6
  • 期望值 = 1×(1/6) + 2×(1/6) + ... + 6×(1/6) = 3.5

虽然不是每次都能掷出3.5,但掷很多次后,平均值会接近3.5。

import numpy as np

def dice_experiment(n_rolls):
    """模拟掷骰子实验"""
    rolls = np.random.randint(1, 7, n_rolls)  # 产生1-6的随机整数
    average = np.mean(rolls)
    return rolls, average

# 实验:掷1000次骰子
rolls, avg = dice_experiment(1000)
print(f"掷了{len(rolls)}次骰子")
print(f"平均值: {avg:.2f} (理论值: 3.5)")
print(f"各个点数出现次数: {np.bincount(rolls)[1:]}")

🎲 重要的概率分布

正态分布:最常见的分布

正态分布就像一座钟形山:中间高,两边低,大部分数据集中在中间。

生活中的例子​:

  • 人的身高:大多数人中等身高,特别高和特别矮的人很少
  • 考试成绩:大部分人考中等分数,学霸和学渣是少数
  • 测量误差:多次测量同一个东西,结果通常呈正态分布
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 生成正态分布数据:模拟成年男性身高(均值175cm,标准差10cm)
mean_height = 175
std_height = 10
heights = np.random.normal(mean_height, std_height, 10000)

print(f"生成的身高数据统计:")
print(f"平均身高: {np.mean(heights):.1f}cm")
print(f"标准差: {np.std(heights):.1f}cm")
print(f"170-180cm的人数: {np.sum((heights >= 170) & (heights <= 180))}")

# 理论上的概率
prob_170_180 = stats.norm.cdf(180, mean_height, std_height) - stats.norm.cdf(170, mean_height, std_height)
print(f"理论上170-180cm的比例: {prob_170_180:.3f}")

伯努利分布:非黑即白的分布

只有两种结果的情况,比如:

  • 抛硬币:正面/反面
  • 考试及格/不及格
  • 用户点击广告/不点击
from scipy.stats import bernoulli

# 模拟用户点击广告的概率(假设10%的用户会点击)
p_click = 0.1
clicks = bernoulli.rvs(p_click, size=1000)  # 1000个用户

actual_click_rate = np.mean(clicks)
print(f"理论点击率: {p_click}")
print(f"实际点击率: {actual_click_rate:.3f}")
print(f"点击人数: {np.sum(clicks)}/{len(clicks)}")

🧠 条件概率和贝叶斯定理

🔍 条件概率:在特定条件下的概率

例子:疾病检测

  • 某种疾病的发病率:1%
  • 检测的准确率:99%(有病的人99%能检出,没病的人99%不会被误诊)

如果检测结果是阳性,真的患病的概率是多少?

直觉可能觉得是99%,但实际上要用贝叶斯定理计算:

def bayes_disease_detection():
    """贝叶斯定理计算疾病检测问题"""
    
    # 先验概率
    p_disease = 0.01      # 患病率1%
    p_no_disease = 0.99    # 没病的概率99%
    
    # 检测准确率
    p_positive_given_disease = 0.99    # 有病→阳性的概率
    p_negative_given_no_disease = 0.99 # 没病→阴性的概率
    p_positive_given_no_disease = 0.01  # 没病→阳性的概率(误诊)
    
    # 计算检测阳性的总概率
    p_positive = (p_disease * p_positive_given_disease + 
                  p_no_disease * p_positive_given_no_disease)
    
    # 贝叶斯定理:P(有病|阳性) = P(阳性|有病) × P(有病) / P(阳性)
    p_disease_given_positive = (p_positive_given_disease * p_disease) / p_positive
    
    return p_disease_given_positive

result = bayes_disease_detection()
print(f"检测阳性时真正患病的概率: {result:.3f} ({result*100:.1f}%)")

输出结果会让你惊讶:​只有约50%​​!

这就是为什么医学检测通常需要多次确认的原因。

🤖 为什么机器学习需要概率论?

1️⃣ 不确定性是现实世界的本质

机器学习要处理的很多问题都有不确定性:

  • 垃圾邮件分类:不能100%确定某封邮件是垃圾邮件
  • 推荐系统:不能100%确定你会喜欢某个商品
  • 自动驾驶:不能100%确定前方没有障碍物

2️⃣ 概率让AI学会"谦虚"

# 朴素贝叶斯分类器示例(简化版)
class SimpleNaiveBayes:
    def __init__(self):
        self.class_probs = {}      # 各类别的概率
        self.feature_probs = {}    # 特征在各个类别下的概率
    
    def predict_probability(self, features):
        """预测属于某个类别的概率"""
        probabilities = {}
        
        for class_name, class_prob in self.class_probs.items():
            # 朴素贝叶斯假设:特征之间相互独立
            prob = class_prob
            for feature_name, feature_value in features.items():
                feature_prob = self.feature_probs[class_name].get(
                    (feature_name, feature_value), 0.001)  # 避免除零
                prob *= feature_prob
            probabilities[class_name] = prob
        
        # 归一化,使概率和为1
        total = sum(probabilities.values())
        for class_name in probabilities:
            probabilities[class_name] /= total
            
        return probabilities

# 使用示例:垃圾邮件分类
nb = SimpleNaiveBayes()

# 假设的训练数据告诉我们:
nb.class_probs = {'spam': 0.3, 'ham': 0.7}  # 30%垃圾邮件,70%正常邮件

nb.feature_probs = {
    'spam': {
        ('contains_money', True): 0.8,    # 垃圾邮件含"钱"字的概率80%
        ('contains_free', True): 0.9,     # 垃圾邮件含"免费"的概率90%
    },
    'ham': {
        ('contains_money', True): 0.1,     # 正常邮件含"钱"字的概率10%
        ('contains_free', True): 0.05,    # 正常邮件含"免费"的概率5%
    }
}

# 预测一封新邮件
new_email = {'contains_money': True, 'contains_free': True}
probabilities = nb.predict_probability(new_email)

print("新邮件的分类概率:")
for class_name, prob in probabilities.items():
    print(f"{class_name}: {prob:.3f} ({prob*100:.1f}%)")

看到了吗?AI不是简单地说"这是垃圾邮件",而是给出概率,体现了知识的不确定性

📝 本篇小结

  1. 概率是可能性大小的度量,范围0-1
  2. 期望值是长期平均值,帮助我们做预测
  3. 正态分布很常见,大部分自然现象都遵循它
  4. 贝叶斯定理帮我们在有新证据时更新信念
  5. 机器学习用概率来处理不确定性和做出谨慎的预测

🎯 练习题

  1. 如果你连续抛3次硬币,恰好2次正面的概率是多少?(提示:列出所有可能结果)
  2. 修改疾病检测的例子,如果患病率变成0.1%,检测阳性的人真正患病的概率是多少?
  3. 想想生活中还有哪些现象可以用正态分布来描述?

下一篇预告:第4篇《线性回归——找一条最合适的直线》​

我们将学习如何用一条直线来预测数值,这是机器学习中最基础也最重要的算法之一!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值