Skip to content

Latest commit

 

History

History
220 lines (168 loc) · 7.08 KB

File metadata and controls

220 lines (168 loc) · 7.08 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0817
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在: 

     个人网站: `https://oeasy.org` 
     蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
     GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
     Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

从零开始

回忆

  • 今天 不言自明的 日心说
    • 经历的 很多前辈的流血 甚至 牺牲

图片描述

  • 我们今天都知道
    • 一个太阳回归年

图片描述

  • 随着 时间往前
    • 一年四季 春夏秋冬
    • 符合这个 规律 回归
  • 那 有没有 不随着时间 回归
    • 而是 指数级爆炸的呢?🤔

摩尔定律

  • 1965 年
    • 英特尔联合创始人戈登・摩尔
    • 统计了 1958 年集成电路发明后至 1965 年的晶体管数量数据
    • 他发现

集成电路上的晶体管数量每年都在翻倍

基于这个指数增长的历史趋势

图片描述

  • 1975 年
    • 摩尔结合行业发展速度

将预测修正为每 18-24 个月 翻倍

数据来源

图片描述

代码

# 摩尔定律验证 - 三张独立图片(无SimHei字体警告,实验楼专用)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# --------------------------
# 第一步:实验楼环境初始化配置(移除不存在的SimHei,彻底消除警告)
# --------------------------
plt.switch_backend('Agg')  # 无GUI后端,仅保存图片
warnings.filterwarnings('ignore', category=UserWarning)  # 屏蔽剩余无关警告
# 仅保留实验楼预装字体:优先文泉驿微米黑,其次DejaVu Sans(彻底移除SimHei)
plt.rcParams["font.family"] = ['WenQuanYi Micro Hei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
plt.rcParams['figure.dpi'] = 300  # 高清分辨率
plt.rcParams["font.size"] = 11
SAVE_DIR = "/home/project/"  # 固定保存路径

# --------------------------
# 第二步:内置芯片数据集
# --------------------------
chip_data = {
    "year": [1971, 1974, 1978, 1982, 1985, 1989, 1993, 1997, 2000, 2003, 2006, 2009, 2012, 2015, 2018, 2022],
    "transistors": [
        2300, 6000, 29000, 134000, 275000, 1180000, 3100000, 7500000,
        42000000, 178000000, 291000000, 731000000, 1400000000, 1750000000,
        8200000000, 80000000000
    ]
}
df = pd.DataFrame(chip_data)

# --------------------------
# 第三步:数据预处理与模型训练
# --------------------------
df["log2_transistors"] = np.log2(df["transistors"])
X = df["year"].values.reshape(-1, 1)
y = df["log2_transistors"].values

lr_model = LinearRegression()
lr_model.fit(X, y)
y_pred = lr_model.predict(X)

r2_score_val = r2_score(y, y_pred)
doubling_time_months = (1 / lr_model.coef_[0]) * 12

# --------------------------
# 第四步:生成第一张图 - 原始坐标系趋势图
# --------------------------
fig1 = plt.figure(figsize=(10, 6))
plt.scatter(df["year"], df["transistors"], color="#1f77b4", s=70, label="实际芯片数据")
plt.plot(df["year"], 2**y_pred, color="#ff4444", linewidth=2.5,
         label=f"拟合线(R²={r2_score_val:.3f},翻倍周期={doubling_time_months:.1f}个月)")
plt.xlabel("年份", fontsize=12)
plt.ylabel("晶体管数量(个)", fontsize=12)
plt.title("摩尔定律验证:原始坐标系下晶体管数量增长", fontsize=14)
plt.legend(loc="upper left")
plt.grid(True, alpha=0.3)
plt.savefig(f"{SAVE_DIR}moores_law_original_coords.png", bbox_inches='tight')
plt.close(fig1)

# --------------------------
# 第五步:生成第二张图 - 对数坐标系趋势图
# --------------------------
fig2 = plt.figure(figsize=(10, 6))
plt.scatter(df["year"], df["transistors"], color="#1f77b4", s=70, label="实际芯片数据")
plt.plot(df["year"], 2**y_pred, color="#ff4444", linewidth=2.5,
         label=f"线性拟合线(R²={r2_score_val:.3f},翻倍周期={doubling_time_months:.1f}个月)")
plt.yscale("log")
plt.xlabel("年份", fontsize=12)
plt.ylabel("晶体管数量(对数尺度)", fontsize=12)
plt.title("摩尔定律验证:对数坐标系下晶体管数量线性增长", fontsize=14)
plt.legend(loc="upper left")
plt.grid(True, alpha=0.3)
plt.savefig(f"{SAVE_DIR}moores_law_log_coords.png", bbox_inches='tight')
plt.close(fig2)

# --------------------------
# 第六步:生成第三张图 - 残差分析图
# --------------------------
fig3 = plt.figure(figsize=(10, 6))
residuals = y - y_pred
plt.scatter(df["year"], residuals, color="#2ecc71", s=70)
plt.axhline(y=0, color="#ff4444", linestyle="--", linewidth=2.5)
plt.xlabel("年份", fontsize=12)
plt.ylabel("残差(log2 晶体管数)", fontsize=12)
plt.title("摩尔定律验证:残差分析(随机分布=拟合有效)", fontsize=14)
plt.grid(True, alpha=0.3)
plt.savefig(f"{SAVE_DIR}moores_law_residual_analysis.png", bbox_inches='tight')
plt.close(fig3)

# --------------------------
# 第七步:终端输出保存提示
# --------------------------
print("="*80)
print("✅ 三张图片已全部生成(无字体警告),保存至实验楼项目目录!")
print("="*80)
print(f"1. 原始坐标系图:{SAVE_DIR}moores_law_original_coords.png")
print(f"2. 对数坐标系图:{SAVE_DIR}moores_law_log_coords.png")
print(f"3. 残差分析图:{SAVE_DIR}moores_law_residual_analysis.png")
print("="*80)
print(f"📊 核心验证结果:拟合优度R²={r2_score_val:.3f},翻倍周期={doubling_time_months:.1f}个月")

效果

图片描述

  • 上面是原始坐标系
  • 下面是指数坐标系

图片描述

  • 怎么体现残差呢?

残差 residuals

图片描述

  • 现在总共多少种回归类型了?

回归类型总结

  • 回归模型 我们已经学过了 这样几种
    1. 线性
    2. 二(多)阶多项式回归
    3. 幂律回归
回归类型 对应场景 核心数学关系
线性回归 伽利略斜面实验(sinθ) $a = k \cdot \sin\theta + b$
二阶多项式回归 单摆周期平方(T²) $T^2 = a \cdot L + b \cdot L^2 + c$
幂律回归 伽利略斜面路程(√L) $t = k \cdot L^{0.5} = k \cdot \sqrt{L}$
  • 这里面
    • 有匀速
    • 有加速
    • 有减速

分段回归

图片描述

  • 那么现在ai的token发展属于哪种回归呢?

总结

  • 下次再说!👋

  • 有没有爆炸式增长呢?🤔

  • 我们下次再说👋


  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。