通过感知机的对偶形式了解Gram矩阵

本文介绍了格拉姆矩阵的概念及其在图像风格捕捉中的应用。它不仅反映了各特征自身的特性,也揭示了特征间的相关性。通过对格拉姆矩阵的对比,可以度量不同图像之间的风格差异。

 

 

  格拉姆矩阵可以看做feature之间的偏心协方差矩阵(即没有减去均值的协方差矩阵),在feature map中,每个数字都来自于一个特定滤波器在特定位置的卷积,因此每个数字代表一个特征的强度,而Gram计算的实际上是两两特征之间的相关性,哪两个特征是同时出现的,哪两个是此消彼长的等等,同时,Gram的对角线元素,还体现了每个特征在图像中出现的量,因此,Gram有助于把握整个图像的大体风格。有了表示风格的Gram Matrix,要度量两个图像风格的差异,只需比较他们Gram Matrix的差异即可。

       总之, 格拉姆矩阵用于度量各个维度自己的特性以及各个维度之间的关系。内积之后得到的多尺度矩阵中,对角线元素提供了不同特征图各自的信息,其余元素提供了不同特征图之间的相关信息。这样一个矩阵,既能体现出有哪些特征,又能体现出不同特征间的紧密程度。

  

### 关于感知机对偶形式的推导 感知机是一种经典的线性分类模型,其目标是通过训练找到能够将数据集分开的超平面。对于感知机的学习算法,除了常见的原始形式外,还存在一种称为 **对偶形式** 的表达方式[^3]。 #### 原始形式回顾 在感知机的原始形式中,我们试图最小化一个基于误分类样本定义的目标函数 \(L(w, b)\),其中权重向量 \(w\) 和偏置项 \(b\) 是待优化参数。具体来说,给定一组训练样例 \((x_i, y_i)\),其中 \(y_i \in \{-1, +1\}\),感知机希望满足条件: \[ y_i (w^\top x_i + b) > 0 \] 如果某个样例被错误分类,则更新规则如下: \[ w \leftarrow w + \eta y_i x_i \] \[ b \leftarrow b + \eta y_i \] 这里,\(\eta\) 表示学习率[^1]。 --- #### 对偶形式的核心思想 为了更好地理解感知机对偶形式,我们需要引入一些关键概念。假设最终学到的权重向量可以表示为训练样本的线性组合: \[ w = \sum_{i=1}^{N} \alpha_i y_i x_i \] 这里的系数 \(\alpha_i\) 非零仅当对应的样本参与过权值调整过程(即该样本曾被误分类)。因此,在对偶形式下,我们的目标变为寻找这些系数 \(\alpha_i\) 而不是直接操作 \(w\) 和 \(b\)。 通过对上述关系代入到决策边界方程中,我们可以得到一个新的判定准则: \[ f(x) = sign\left( \sum_{i=1}^N \alpha_i y_i K(x_i, x) + b \right) \] 在这里,\(K(x_i, x_j) = x_i^\top x_j\) 称作核函数。尽管当前讨论的是线性情况下的内积运算,但在更复杂的场景中可以通过替换不同的核函数扩展至非线性问题[^2]。 --- #### 数学推导细节 以下是具体的数学推导步骤摘要: 1. 将损失函数重写为目标变量 \(w\) 及约束条件; 设计一个合适的凸二次规划问题并加入松弛因子处理不可分情形; 2. 应用拉格朗日乘数法构建增广后的目标函数,并考虑不等式约束的影响转换成标准形式; 3. 利用 KKT 条件消去显式的依赖于 \(w\) 参数的部分,从而获得只涉及 \(\alpha_i\) 的最优化子问题; 4. 解决这个简化版本的最大化任务即可恢复原来的分离面信息。 注意整个过程中涉及到大量矩阵运算技巧以及如何有效存储访问历史交互记录等问题都需要额外关注效率方面的考量[^4]。 --- ```python import numpy as np class PerceptronDual: def __init__(self, learning_rate=1e-3, max_iter=100): self.learning_rate = learning_rate self.max_iter = max_iter def fit(self, X, Y): n_samples, _ = X.shape # 初始化 alpha 和 bias self.alpha = np.zeros(n_samples) self.bias = 0. gram_matrix = np.dot(X, X.T) for t in range(self.max_iter): errors = False for i in range(n_samples): update = Y[i]*(np.sum(self.alpha * Y * gram_matrix[:, i]) + self.bias) if update <= 0: self.alpha[i] += self.learning_rate self.bias += self.learning_rate * Y[i] errors = True if not errors: break def predict(self, X_test): result = [] for xi in X_test: prediction = np.sign(np.sum([a*y*K(xi,x)+self.bias for a,y,K in zip(self.alpha,Y,X)])) result.append(prediction) return np.array(result) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

量子象限

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

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

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

打赏作者

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

抵扣说明:

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

余额充值