Python实战:5分钟搞定高斯核函数可视化(附完整代码)
最近在辅导几位刚入门机器学习的朋友时,我发现一个挺普遍的现象:大家啃得动线性回归、逻辑回归的公式,但一碰到“核函数”,尤其是“高斯核函数”,就有点云里雾里了。教科书上那些无穷维映射、正定核的数学证明,固然严谨,但对初学者建立直观感受帮助有限。其实,理解核函数,尤其是高斯核,最有效的方式不是死磕公式,而是亲手把它画出来,看看它到底长什么样,感受一下它如何“扭曲”空间。
这篇文章就是为你准备的,如果你正处在对支持向量机(SVM)或核方法感到好奇却又有点畏惧的阶段。我们将完全避开复杂的理论推导,聚焦于实战:如何用Python中最基础的NumPy和Matplotlib库,在短短几分钟内,生成清晰、美观的高斯核函数及其基函数图像。通过可视化,你会直观地看到,一个简单的数学形式如何创造出复杂的决策边界,从而理解它为何是处理非线性问题的利器。我们将从零开始,一步步写出代码,并解释每一行代码背后的意图,确保你不仅能复制粘贴,更能真正掌握。
1. 环境准备与核心概念速览
在开始敲代码之前,我们花几分钟把核心装备和核心思想理顺。你不需要高深的数学背景,只需要对Python有最基础的了解,知道如何安装库和运行脚本就行。
你需要准备的环境非常简单:
- Python 3.6+:这是我们的工作语言。
- NumPy:用于高效的数值计算,特别是数组操作和数学函数。
- Matplotlib:用于绘制一切图表,是我们的“画笔”。
如果你使用Anaconda,这些库通常已经预装。如果没有,打开你的终端或命令提示符,一行命令就能搞定:
pip install numpy matplotlib
现在,让我们用最直白的话理解高斯核函数(也叫径向基函数,RBF)。你可以暂时忘掉“映射到高维空间”这个抽象说法。想象一下,你有一堆混在一起的红豆和绿豆(非线性可分的数据)。在二维平面上,你找不到一条直线把它们完美分开。高斯核函数的作用,就好比给你一个智能的透镜。当你透过这个透镜去看这些豆子时,空间被“弯曲”和“拉伸”了,原本挤在一起的豆子,在新的视角下(高维空间的特征),变得可以用一个平面(超平面)轻松隔开。
这个“透镜”的数学形式就是: K(x, y) = exp(-γ * ||x - y||²) 其中,||x - y|| 是两点之间的欧氏距离,γ (gamma) 是一个大于0的参数,它控制着透镜的“焦距”。γ 越大,透镜的聚焦能力越强,影响范围越窄;γ 越小,透镜越“散光”,影响范围越广。这个公式的妙处在于,它通过计算数据点之间的相似度(距离越近,相似度越高,函数值越接近1;距离越远,相似度越低,函数值越接近0)来隐式地完成了复杂的空间变换。
提示:在后续的SVM等算法中,你会经常遇到另一个参数
C和γ。C控制模型对错误分类的惩罚力度,而γ则直接控制高斯核的“宽度”,两者共同决定了模型的复杂度。
理解了核心思想后,我们进入实战环节。我们的目标是画出两类图:一是单个的基函数(就像构成透镜的一个个微小镜片),二是完整的核函数(透镜的整体效果)。
2. 绘制高斯基函数:理解“基本组成单元”
高斯核函数可以被看作是由无数个高斯基函数叠加而成的。每个基函数都以一个特定的样本点为中心。绘制基函数,能帮助我们理解这个“透镜”是由什么“材料”构成的。
我们先来绘制一维情况下的基函数。假设我们在区间[-5, 5]上选取了5个等间距的中心点。每个中心点上“放置”一个高斯形状的“小山丘”。代码和思路如下:
import numpy as np
import matplotlib.pyplot as plt
# 设置图像显示中文(可选)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 1. 定义高斯基函数
def gaussian_basis(x, center, gamma=1.0):
"""
计算一维高斯基函数的值。
参数:
x: 输入值(可以是一个数或NumPy数组)
center: 基函数的中心点
gamma: 控制函数宽度的参数,gamma越大,函数越“瘦高”
返回:
高斯基函数在x处的值
"""
return np.exp(-gamma * (x - center) ** 2)
# 2. 创建数据点
x_plot = np.linspace(-5, 5, 500) # 在[-5,5]区间生成500个平滑的点
centers = np.linspace(-4, 4, 5) # 5个中心点,从-4到4均匀分布
gamma = 0.5 # 设置一个gamma值,你可以调整它看效果
# 3. 绘制每一个基函数
plt.figure(figsize=(10, 6))
for i, center in e

4379

被折叠的 条评论
为什么被折叠?



