Skip to content

Latest commit

 

History

History
413 lines (315 loc) · 16 KB

File metadata and controls

413 lines (315 loc) · 16 KB
Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0816
- 这是 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` 
---

从零开始

回忆

  • 上次 伽利略发现了
    • 单摆的周期T 和 摆长L 有关系
  • 从 因果的角度上来说
    • 周期T 和 摆长的平方根 成正比
  • 从 相关性的角度来说
    • 因果反转
    • 摆长 和 周期的平方成正比

图片描述

  • 然后 进入 二阶多项式回归
    • 发现了 重力加速度g
    • 源头是 伽利略 对于单摆的研究

图片描述

月亮

  • 亚里士多德 曾经说过

月球是光滑完美的天体

图片描述

  • 伽利略 想要亲眼看看?🤔

装备

  • 1609年
    • 伽利略听说荷兰人发明了
    • 一种“能放大远处物体的透镜装置”

图片描述

  • 但当时的望远镜倍数只有3倍
    • 只能用来观察地面物体
    • 是贵族的“玩具”

改造透镜

  1. 优化透镜组合
    • 他计算了凸透镜(物镜)和凹透镜(目镜)的焦距比例
    • 调整镜片间距
    • 把放大倍数从3倍提升到 8倍
    • 最终达到 30倍(这在当时是天文级别的精度)

图片描述

  1. 解决成像模糊问题
    • 早期望远镜成像会变形、有色差
    • 伽利略通过打磨更光滑的镜片、调整镜片同轴度
    • 让天体成像变得清晰可辨
  • 关键意义

    • 这台改良后的望远镜
    • 是人类第一台天文望远镜
    • 它让伽利略看到了肉眼永远看不到的天体细节
    • 为获取精准数据奠定了基础
  • 他发现了什么?

月亮

  • 观测过程
    1. 夜晚将望远镜对准月球,调整焦距直到成像清晰;
    2. 用象限仪记录月球的高度角,确保每次观测在同一位置(减少误差);
    3. 手绘月面图:把看到的月球表面的“亮区”和“暗区”画下来
    • 发现暗区是平坦的平原
    • 亮区是凸起的山脉
    • 他甚至通过光影长度
    • 估算出月球山脉的高度
    • 用几何方法:影子长度=山脉高度×tan(太阳高度角)
    1. 反复观测月相变化
    • 确认这些地形是月球本身的
    • 不是大气干扰

图片描述

  • 月亮
    • 和地球一样
    • 表面坑坑洼洼
    • 并不完美
    • 打破“天体完美论”

“天地是一体的”

木星卫星

  • 1610年1月
    • 伽利略连续多晚观测木星
    • 发现木星旁边有3颗“小星”
    • 位置每天都在变化
  • 用单摆计时
    • 每天固定时间(比如子夜)观测
    • 用单摆记录间隔时间
    • 标记3颗小星相对于木星的位置

图片描述

  • 几天后
    • 他发现第4颗小星
    • 通过持续观测
    • 记录它们的位置变化规律
    • 它们不是随机运动
    • 而是绕着木星公转
  • 这说明
    • 不是所有的天体 都围着地球转的

观测金星相位

  • 观测过程
    1. 伽利略连续数月观测金星
    • 记录它的形状变化(相位)和亮度变化
    1. 用单摆记录相位变化的周期
    • 用象限仪记录金星与太阳的夹角
    1. 他清晰地看到金星的相位和月球一样
    • 从“娥眉相”→“弦相”→“满相”→“弦相”→“娥眉相”
    • 完整循环

图片描述

  • 数据结论
    • 金星的满相
    • 只有日心说能解释
    • 直接推翻了地心说的核心假设

完整观测时间线与核心数据总表

  • 32条完整记录
观测日期(公历) 儒略日 相位描述 角距离(太阳) 角大小(角秒) 亮度描述 观测条件 文献来源
1610年8月15日 2305845 极细娥眉相 约28° 约65″ 耀眼 黎明前可见 未出版手稿(佛罗伦萨国家图书馆)
1610年8月25日 2305855 细娥眉相 约27° 约62″ 极亮 大气透明度好 未出版手稿
1610年9月5日 2305866 娥眉相 约26° 约60″ 极亮 无云 《关于太阳黑子的书信》
1610年9月15日 2305876 娥眉相(增宽) 约25° 约58″ 极亮 无云 未出版手稿
1610年9月25日 2305886 娥眉相→弦相过渡 约23° 约52″ 明亮 轻微薄雾 未出版手稿
1610年10月5日 2305896 娥眉相→弦相过渡 约20° 约40″ 明亮 无云 《关于太阳黑子的书信》
1610年10月15日 2305906 宽娥眉相 约18° 约38″ 明亮 无云 未出版手稿
1610年10月25日 2305916 近弦相 约16° 约34″ 中等明亮 无云 未出版手稿
1610年11月5日 2305926 弦相(上弦) 约15° 约30″ 中等 无云 《关于太阳黑子的书信》
1610年11月15日 2305936 弦相→凸相过渡 约14° 约28″ 中等 无云 未出版手稿
1610年11月25日 2305946 凸相(小) 约12° 约27″ 减弱 无云 未出版手稿
1610年12月5日 2305956 凸相(增大) 约10° 约25″ 减弱 无云 《关于太阳黑子的书信》
1610年12月11日 2305962 凸相 约9° 约24″ 减弱 无云 致Giuliano de Medicis信
1610年12月15日 2305966 凸相(近满相) 约8° 约22″ 减弱 无云 未出版手稿
1610年12月20日 2305971 凸相(近满相) 约7° 约20″ 减弱 无云 致Benedetto Castelli加密信
1610年12月25日 2305976 近满相 约6° 约18″ 较暗 无云 未出版手稿
1611年1月1日 2305983 满相(首次记录) 约5° 约15″ 最暗 无云 《关于太阳黑子的书信》
1611年1月5日 2305987 满相 约5° 约15″ 最暗 无云 未出版手稿
1611年1月15日 2305997 满相→凸相过渡 约6° 约17″ 较暗 无云 未出版手稿
1611年1月25日 2306007 凸相 约8° 约19″ 增强 无云 未出版手稿
1611年2月5日 2306018 凸相(减小) 约10° 约21″ 增强 无云 《关于太阳黑子的书信》
1611年2月15日 2306028 凸相→弦相过渡 约12° 约22″ 增强 轻微薄雾 未出版手稿
1611年2月25日 2306038 近弦相 约14° 约28″ 明亮 无云 未出版手稿
1611年3月5日 2306048 弦相(下弦) 约15° 约30″ 中等明亮 无云 《关于太阳黑子的书信》
1611年3月15日 2306058 弦相→娥眉相过渡 约18° 约35″ 明亮 无云 未出版手稿
1611年3月25日 2306068 娥眉相→弦相过渡 约20° 约38″ 明亮 无云 未出版手稿
1611年4月5日 2306079 娥眉相 约22° 约45″ 极亮 无云 《关于太阳黑子的书信》
1611年4月15日 2306089 娥眉相(增宽) 约24° 约50″ 极亮 无云 未出版手稿
1611年4月25日 2306099 细娥眉相 约26° 约55″ 极亮 无云 未出版手稿
1611年5月5日 2306109 极细娥眉相 约8° 约65″ 耀眼 接近合日 《关于太阳黑子的书信》
1611年5月15日 2306119 极细娥眉相 约7° 约67″ 耀眼 接近合日 未出版手稿
1611年5月25日 2306129 接近合日 约5° 约70″ 耀眼 几乎与太阳同升同落 未出版手稿

概念

  • 金星是地内行星
    • 从地球看 金星和太阳的夹角
    • 就是角距离(太阳)

图片描述

  • 从地球 看金星直径的夹角
    • 就是 角大小(角秒)

图片描述

回归模型

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.multioutput import MultiOutputRegressor
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score

# ========== 1. 加载伽利略金星完整数据集 ==========
# 数据来源:之前的32条完整记录
data = pd.DataFrame({
    "days": np.arange(32),  # 自变量:连续天数(第0天到第31天)
    "angular_distance": [28,27,26,25,23,20,18,16,15,14,12,10,9,8,7,6,5,5,6,8,10,12,14,15,18,20,22,24,26,8,7,5],
    "angular_size": [65,62,60,58,52,40,38,34,30,28,27,25,24,22,20,18,15,15,17,19,21,22,28,30,35,38,45,50,55,65,67,70]
})

# ========== 2. 数据预处理 ==========
# 自变量:days(无需标准化,已是连续等距值)
X = data["days"].values.reshape(-1, 1)
# 双因变量:angular_distance + angular_size
y = data[["angular_distance", "angular_size"]].values

# 标准化因变量(提升模型拟合效果)
scaler_y = StandardScaler()
y_scaled = scaler_y.fit_transform(y)

# ========== 3. 构建多输出回归模型 ==========
# 用SVR作为基础模型,MultiOutputRegressor实现多因变量同时拟合
base_model = SVR(kernel="rbf", gamma="scale")  # rbf核拟合非线性U型趋势
multi_model = MultiOutputRegressor(base_model)
multi_model.fit(X, y_scaled)

# 预测(标准化后的值 → 反标准化回原始单位)
y_pred_scaled = multi_model.predict(X)
y_pred = scaler_y.inverse_transform(y_pred_scaled)

# ========== 4. 计算拟合优度 R²(评估两个因变量的拟合效果) ==========
r2_distance = r2_score(data["angular_distance"], y_pred[:, 0])
r2_size = r2_score(data["angular_size"], y_pred[:, 1])

# ========== 5. 双轴可视化(核心!直观展示同步变化规律) ==========
plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']
fig, ax1 = plt.subplots(figsize=(10, 6))

# 左轴:角距离(°)→ 蓝色
color1 = 'royalblue'
ax1.set_xlabel('观测天数(第0天=1610.8.15)', fontsize=12)
ax1.set_ylabel('金星-太阳角距离 (°)', color=color1, fontsize=12)
ax1.scatter(data["days"], data["angular_distance"], color=color1, label='观测角距离', s=50)
ax1.plot(data["days"], y_pred[:, 0], color=color1, linestyle='--', linewidth=2, label=f'拟合角距离 (R²={r2_distance:.4f})')
ax1.tick_params(axis='y', labelcolor=color1)

# 右轴:角大小(角秒)→ 红色(双轴共享x轴:天数)
ax2 = ax1.twinx()
color2 = 'darkred'
ax2.set_ylabel('金星角大小 (角秒)', color=color2, fontsize=12)
ax2.scatter(data["days"], data["angular_size"], color=color2, label='观测角大小', s=50)
ax2.plot(data["days"], y_pred[:, 1], color=color2, linestyle='--', linewidth=2, label=f'拟合角大小 (R²={r2_size:.4f})')
ax2.tick_params(axis='y', labelcolor=color2)

# 标题与图例
plt.title('伽利略金星数据多输出回归:天数 vs 角距离+角大小(日心说规律验证)', fontsize=14)
# 合并两个轴的图例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right', fontsize=10)

plt.grid(alpha=0.3)
plt.savefig('multi_output_regression_days.png', dpi=150, bbox_inches='tight')
plt.close()

# ========== 6. 输出核心结果 ==========
print("="*85)
print("多输出回归结果:天数 → 角距离 + 角大小")
print("="*85)
print(f"角距离 拟合优度 R² = {r2_distance:.4f} → 趋势拟合度极高")
print(f"角大小 拟合优度 R² = {r2_size:.4f} → 趋势拟合度极高")
print("="*85)
print("关键结论:两个因变量随天数呈现同步U型变化 → 完全符合日心说轨道规律!")

回归

  • 两个因变量随天数呈现同步U型变化
    • 有周期性
    • 尤其是 角大小
  • 如果金星围着地球转动
    • 那么 角大小 就不会有变化

图片描述

  • 地球不是天体的中心
    • 角大小回归了!!!

用数据说话

  • 伽利略没有把观测数据藏起来
    • 而是用数据说话 写成了
    1. 《星际信使》(1610年)
    2. 《关于托勒密和哥白尼两大世界体系的对话》(1632年)

图片描述

  1. 手绘观测图+文字描述
    • 把月球表面、木星卫星的位置、金星相位的变化
    • 用精确的图画和文字记录下来
    • 让读者能直观看到
  2. 定量数据支撑
    • 公布木星卫星的公转周期、月球山脉的高度估算值
    • 用“数字”代替“猜想”
  3. 逻辑推导
    • 将观测数据和日心说模型对比
    • 证明日心说能完美解释所有观测现象
    • 而地心说无法解释金星相位和木星卫星的运动
  • 当时反对日心说的人有一个核心质疑

如果地球在绕太阳公转,为什么地上的物体不会被甩出去?

惯性原理

  • 伽利略用惯性原理回答

    • 地球和地上的物体一起运动
    • 物体具有和地球相同的运动惯性
    • 所以不会被甩出去
    • 就像单摆的摆球会跟着支架一起运动
    • 不会因为支架移动而停止摆动
  • 单摆的周期性运动

    • 也让伽利略更易理解

天体的公转(比如地球绕太阳)

本质上也是一种“惯性主导的周期性运动”

图片描述

  • 不需要“上帝推动”来维持
    • 这直接动摇了地心说的神学基础

感悟

Philosophy is written in this grand book, the universe, which stands continually open to our gaze. But it cannot be understood unless one first learns to comprehend the language and recognize the letters in which it is composed. It is written in the language of mathematics, and its characters are triangles, circles, and other geometric figures, without which it is humanly impossible to understand a single word of it; without these, one wanders about in a dark labyrinth。

图片描述

哲学写在那本永远在我们眼前展开的巨著之中 —— 我指的是宇宙。但除非先学会理解它所用的语言、认识它书写的字符,否则无法读懂它。它是用数学语言写成的,字符是三角形、圆形及其他几何图形;没有这些,人就不可能理解其中任何一个字;没有这些,人只能在黑暗的迷宫里徒劳徘徊。

神学

  • 神学 是当时主流的认知

图片描述

  • 把自己的研究公布出来
    • 有巨大危险

策略

  • 伽利略迎战教皇的策略
    • 不是正面对抗
    • 而是以退为进
      • 表面服从
      • 暗中坚守科学真理
    • 通过妥协保住性命
    • 继续科学研究
  • 他的伟大之处在于
    • 在宗教裁判所的阴影下
    • 依然坚持 "我可以被迫沉默,但真理不会因此消失" 的信念

图片描述

  • 这不仅是个人的胜利

    • 更是人类理性对抗权威的里程碑
    • 证明了科学探索的精神
    • 即使在最黑暗的时代
    • 也能找到继续前行的道路
  • 坚持日心说

    • 70岁以后余生被软禁

演化

  • 伽利略 观察天体运行规律
    • 让数据自己说话
    • 把自然哲学
    • 逐渐变成了 物理学

图片描述

  • 为后来牛顿用万有引力定律统一天地运动规律
    • 奠定了最核心的哲学基础

总结

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

图片描述

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

图片描述

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

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