你是否在寻找数学建模比赛的突破点?数学建模进阶思路!
作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,帮助你全面理解并掌握如何解决类似问题。
详见文末
部分可视化(做了模糊处理,正文里的比这个更细致)
第一个问题是:根据附件1中的数据A和B,建立数学模型,对数据A进行某种变换,使得变换后的结果与数据B尽可能接近。计算变换后的结果与数据B的误差,并分析误差的来源(如数据噪声、模型偏差等)对结果的影响。
首先,我们需要理解问题的本质:
在进行建模之前,我们需要对数据进行探索,了解其基本特征和关系。例如:
由于附件1中的数据A和B没有具体给出,我们在这里假设数据A和数据B都是n维向量。
假设数据A和数据B之间的关系是线性的,我们可以建立一个线性变换模型:
B ′ = k ⋅ A + c B' = k \cdot A + c B′=k⋅A+c
其中,$ B’ $ 是变换后的结果,$ k $ 是缩放系数,$ c $ 是偏移量。我们的目标是找到最佳的 $ k $ 和 $ c $,使得 $ B’ $ 尽可能接近 $ B $。
为了找到最佳的 $ k $ 和 $ c $,我们可以使用最小二乘法。最小二乘法的目标是使误差平方和最小:
minimize ∑ i = 1 n ( B i ′ − B i ) 2 = ∑ i = 1 n ( k ⋅ A i + c − B i ) 2 \text{minimize} \quad \sum_{i=1}^{n} (B_i' - B_i)^2 = \sum_{i=1}^{n} (k \cdot A_i + c - B_i)^2 minimizei=1∑n(Bi′−Bi)2=i=1∑n(k⋅Ai+c−Bi)2
对 $ k $ 和 $ c $ 求偏导,并令偏导数为0,可以解出 $ k $ 和 $ c $。
定义误差平方和函数:
S ( k , c ) = ∑ i = 1 n ( k ⋅ A i + c − B i ) 2 S(k, c) = \sum_{i=1}^{n} (k \cdot A_i + c - B_i)^2 S(k,c)=i=1∑n(k⋅Ai+c−Bi)2
对 $ k $ 求偏导:
∂ S ∂ k = 2 ∑ i = 1 n ( k ⋅ A i + c − B i ) ⋅ A i = 0 \frac{\partial S}{\partial k} = 2 \sum_{i=1}^{n} (k \cdot A_i + c - B_i) \cdot A_i = 0 ∂k∂S=2i=1∑n(k⋅Ai+c−Bi)⋅Ai=0
对 $ c $ 求偏导:
∂ S ∂ c = 2 ∑ i = 1 n ( k ⋅ A i + c − B i ) = 0 \frac{\partial S}{\partial c} = 2 \sum_{i=1}^{n} (k \cdot A_i + c - B_i) = 0 ∂c∂S=2i=1∑n(k⋅Ai+c−Bi)=0
整理得到方程组:
{ k ∑ i = 1 n A i 2 + c ∑ i = 1 n A i = ∑ i = 1 n A i B i k ∑ i = 1 n A i + c ⋅ n = ∑ i = 1 n B i \begin{cases} k \sum_{i=1}^{n} A_i^2 + c \sum_{i=1}^{n} A_i = \sum_{i=1}^{n} A_i B_i \\ k \sum_{i=1}^{n} A_i + c \cdot n = \sum_{i=1}^{n} B_i \end{cases} {k∑i=1nAi2+c∑i=1nAi=∑i=1nAiBik∑i=1nAi+c⋅n=∑i=1nBi
解这个方程组即可得到 $ k $ 和 $ c $。
计算变换后的结果 $ B’ = k \cdot A + c $ 与数据B之间的误差。常用的误差度量包括:
如果线性模型无法很好地拟合数据A和数据B之间的关系,可以考虑更复杂的模型
给定数据集 A ∈ R n × m A \in \mathbb{R}^{n \times m} A∈Rn×m 和 B ∈ R n × m B \in \mathbb{R}^{n \times m} B∈Rn×m,目标是找到一个变换 T T T,使得变换后的数据 T ( A ) T(A) T(A) 与 B B B 尽可能接近。同时,计算变换后的误差,并分析误差来源。
假设变换 T T T 是一个线性变换,即存在矩阵 W ∈ R m × m W \in \mathbb{R}^{m \times m} W∈Rm×m,使得:
T ( A ) = A W T(A) = A W T(A)=AW
目标是找到矩阵 W W W 使得 T ( A ) T(A) T(A) 与 B B B 的误差最小化,即最小化:
min W ∥ A W − B ∥ F 2 \min_{W} \| A W - B \|_F^2 Wmin∥AW−B∥F2
其中 ∥ ⋅ ∥ F \|\cdot\|_F ∥⋅∥F 表示Frobenius范数。
上述最小二乘问题的解为:
W = ( A T A ) − 1 A T B W = (A^T A)^{-1} A^T B W=(ATA)−1ATB
当 A T A A^T A ATA 不可逆时,可以使用伪逆或正则化方法求解。
变换后的数据为:
B ^ = A W \hat{B} = A W B^=AW
误差矩阵为:
E = B ^ − B E = \hat{B} - B E=B^−B
总误差可以用Frobenius范数衡量:
Error = ∥ E ∥ F \text{Error} = \| E \|_F Error=∥E∥F
Frobenius范数:
∥ E ∥ F = ∑ i = 1 n ∑ j = 1 m ∣ e i j ∣ 2 \| E \|_F = \sqrt{\sum_{i=1}^n \sum_{j=1}^m |e_{ij}|^2} ∥E∥F=i=1∑nj=1∑m∣eij∣2
最小二乘解:
W = ( A T A ) − 1 A T B W = (A^T A)^{-1} A^T B W=(ATA)−1ATB
误差矩阵:
E = A W − B E = A W - B E=AW−B
首先,我们需要理解问题1的要求:
由于没有具体的数据文件,我们假设数据A和B都是二维数组(矩阵),并且它们的形状相同。我们可以尝试几种常见的变换方法:
B ≈ A * W + b
。由于问题中没有明确说明数据的具体形式,我们将采用最简单的线性变换方法,即最小二乘法来找到最佳的 W
和 b
。
B = A * W + b
,其中 W
是权重矩阵,b
是偏置项。W
和 b
。(m, n)
,则 W
的形状应该是 (n, n)
,b
的形状应该是 (m, n)
。但是通常在实际建模中,我们会将这个问题简化为多个独立的线性回归问题,即对B的每一列进行建模。B[:, i]
,我们可以使用A的所有列来预测它,即 B[:, i] ≈ A * W[:, i] + b[i]
。这样,我们可以为B的每一列拟合一个线性模型。import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 假设A和B是已经加载的numpy数组,形状为(m, n)
# 这里我们用随机数据模拟
m, n = 100, 5
A = np.random.rand(m, n)
B = np.random.rand(m, n)
# 存储变换后的A
A_transformed = np.zeros_like(A)
# 对B的每一列进行建模
for i in range(n):
model = LinearRegression()
model.fit(A, B[:, i])
A_transformed[:, i] = model.predict(A)
# 计算误差
mse = mean_squared_error(B, A_transformed)
print("均方误差 (MSE):", mse)
# 误差来源分析
# 1. 数据噪声:由于A和B都是随机生成的,本身包含噪声。
# 2. 模型偏差:我们使用的是线性模型,如果真实关系是非线性的,则模型无法捕捉这种关系。
# 在实际应用中,还需要考虑其他因素,比如数据采集的误差、模型的假设是否合理等。
问题2. 请分析附件2中给出的一组矿山监测数据,建立数据压缩模型,对附件2中的数据进行降维处理,计算压缩效率(包括但不限于压缩比、存储空间节省率等)。进一步建立数据还原模型,将降维后的数据进行还原,分析降维和还原对数据质量的影响,提供还原数据的准确度(MSE不高于0.005)和误差分析。(要求在保证还原数据的准确度的前提下,尽可能地提高压缩效率)
问题2的具体要求:
选择降维方法:主成分分析(PCA)是一种经典且广泛应用的降维方法,它通过线性变换将原始数据变换到新坐标系中,使得第一个新坐标轴(第一主成分)的方差最大,第二个新坐标轴(第二主成分)的方差次之,以此类推。PCA可以有效降低数据的维度并保留主要信息。
实施PCA:
确定主成分数量k:
数据还原:使用PCA的逆变换将降维后的数据还原到原始数据空间。
计算MSE:计算还原数据与原始数据之间的均方误差(MSE),确保MSE不高于0.005。
压缩比:原始数据大小与压缩后数据大小的比值。假设原始数据有n个样本,每个样本有m个维度,则原始数据大小为n×m。降维到k维后,压缩后数据大小为n×k,此外还需存储k个主成分(每个主成分是m维),大小为k×m。压缩比计算公式为:
压缩比 = n × m n × k + k × m \text{压缩比} = \frac{n \times m}{n \times k + k \times m} 压缩比=n×k+k×mn×m
如果n >> m,则压缩比近似为m/k。
存储空间节省率:
存储空间节省率 = 原始数据大小 − 压缩后数据大小 原始数据大小 × 100 % \text{存储空间节省率} = \frac{\text{原始数据大小} - \text{压缩后数据大小}}{\text{原始数据大小}} \times 100\% 存储空间节省率=原始数据大小原始数据大小−压缩后数据大小×100%
其中,压缩后数据大小包括降维后的数据大小和主成分的大小。
1.1 数据标准化
假设原始数据矩阵为 $ X \in \mathbb{R}^{n \times m} $,其中 $ n $ 为样本数,$ m $ 为特征数。首先对数据进行标准化处理,使得每个特征的均值为0,方差为1。标准化后的数据矩阵为 $ Z \in \mathbb{R}^{n \times m} $,其中:
Z i j = X i j − μ j σ j , i = 1 , … , n ; j = 1 , … , m Z_{ij} = \frac{X_{ij} - \mu_j}{\sigma_j}, \quad i = 1, \dots, n; \quad j = 1, \dots, m Zij=σjXij−μj,i=1,…,n;j=1,…,m
其中,$ \mu_j = \frac{1}{n} \sum_{i=1}^n X_{ij} $ 是第 $ j $ 个特征的均值,$ \sigma_j = \sqrt{\frac{1}{n} \sum_{i=1}^n (X_{ij} - \mu_j)^2} $ 是第 $ j $ 个特征的标准差。
1.2 计算协方差矩阵
标准化后的数据 $ Z $ 的协方差矩阵为:
Σ = 1 n Z T Z ∈ R m × m \Sigma = \frac{1}{n} Z^T Z \in \mathbb{R}^{m \times m} Σ=n1ZTZ∈Rm×m
1.3 计算特征值和特征向量
对协方差矩阵 $ \Sigma $ 进行特征值分解:
Σ = V Λ V T \Sigma = V \Lambda V^T Σ=VΛVT
其中,$ V \in \mathbb{R}^{m \times m} $ 是特征向量矩阵,每一列是一个特征向量;$ \Lambda = \text{diag}(\lambda_1, \dots, \lambda_m) $ 是特征值对角矩阵,特征值按降序排列:$ \lambda_1 \geq \lambda_2 \geq \dots \geq \lambda_m \geq 0 $。
1.4 选择主成分数量
选择前 $ k $ 个主成分,使得累计方差贡献率达到一定阈值(如95%)。累计方差贡献率为:
Cumulative Variance = ∑ i = 1 k λ i ∑ i = 1 m λ i \text{Cumulative Variance} = \frac{\sum_{i=1}^k \lambda_i}{\sum_{i=1}^m \lambda_i} Cumulative Variance=∑i=1mλi∑i=1kλi
或者,通过迭代选择 $ k $,使得还原后的数据MSE不高于0.005。
1.5 数据降维
选择前 $ k $ 个特征向量 $ V_k \in \mathbb{R}^{m \times k} $,将原始数据投影到主成分上,得到降维后的数据:
Z k = Z V k ∈ R n × k Z_k = Z V_k \in \mathbb{R}^{n \times k} Zk=ZVk∈Rn×k
2.1 数据还原
将降维后的数据 $ Z_k $ 还原到原始数据空间:
Z ^ = Z k V k T ∈ R n × m \hat{Z} = Z_k V_k^T \in \mathbb{R}^{n \times m} Z^=ZkVkT∈Rn×m
然后,将 $ \hat{Z} $ 反标准化,得到还原后的原始数据 $ \hat{X} $:
X ^ i j = Z ^ i j ⋅ σ j + μ j , i = 1 , … , n ; j = 1 , … , m \hat{X}_{ij} = \hat{Z}_{ij} \cdot \sigma_j + \mu_j, \quad i = 1, \dots, n; \quad j = 1, \dots, m X^ij=Z^ij⋅σj+μj,i=1,…,n;j=1,…,m
2.2 计算MSE
计算还原数据 $ \hat{X} $ 与原始数据 $ X $ 的均方误差(MSE):
MSE = 1 n m ∑ i = 1 n ∑ j = 1 m ( X i j − X ^ i j ) 2 \text{MSE} = \frac{1}{n m} \sum_{i=1}^n \sum_{j=1}^m (X_{ij} - \hat{X}_{ij})^2 MSE=nm1i=1∑nj=1∑m(Xij−X^ij)2
要求 $ \text{MSE} \leq 0.005 $。
3.1 压缩比
原始数据大小为 $ n \times m $,降维后数据大小为 $ n \times k $,另外需要存储 $ k $ 个主成分(每个主成分是 $ m $ 维),大小为 $ k \times m $。压缩比为:
Compression Ratio = n × m n × k + k × m = n m k ( n + m ) \text{Compression Ratio} = \frac{n \times m}{n \times k + k \times m} = \frac{n m}{k (n + m)} Compression Ratio=n×k+k×mn×m=k(n+m)nm
3.2 存储空间节省率
存储空间节省率为:
Storage Saving Rate = ( n × m ) − ( n × k + k × m ) n × m × 100 % = ( 1 − k ( n + m ) n m ) × 100 % \text{Storage Saving Rate} = \frac{(n \times m) - (n \times k + k \times m)}{n \times m} \times 100\% = \left(1 - \frac{k (n + m)}{n m}\right) \times 100\% Storage Saving Rate=n×m(n×m)−(n×k+k×m)×100%=(1−nmk(n+m))×100%
分析降维和还原过程中的误差来源,包括:
在进行PCA之前,通常需要对数据进行标准化处理,使每个特征均值为0,方差为1。设原始数据矩阵为 X ∈ R n × m X \in \mathbb{R}^{n \times m} X∈Rn×m,其中 n n n 是样本数, m m m 是特征数。标准化后的数据矩阵 X std X_{\text{std}} Xstd 为:
X std = ( X − μ ) / σ X_{\text{std}} = \left( X - \mu \right) / \sigma Xstd=(X−μ)/σ
其中 μ ∈ R m \mu \in \mathbb{R}^m μ∈Rm 是每个特征的均值向量, σ ∈ R m \sigma \in \mathbb{R}^m σ∈Rm 是每个特征的标准差向量,除法为逐元素除法。
标准化后数据的协方差矩阵 C ∈ R m × m C \in \mathbb{R}^{m \times m} C∈Rm×m 为:
C = 1 n − 1 X std T X std C = \frac{1}{n - 1} X_{\text{std}}^T X_{\text{std}} C=n−11XstdTXstd
对协方差矩阵 C C C 进行特征值分解:
C = V Λ V T C = V \Lambda V^T C=VΛVT
其中 Λ = diag ( λ 1 , λ 2 , … , λ m ) \Lambda = \text{diag}(\lambda_1, \lambda_2, \dots, \lambda_m) Λ=diag(λ1,λ2,…,λm) 是对角矩阵,对角线元素 λ i \lambda_i λi 是特征值, V ∈ R m × m V \in \mathbb{R}^{m \times m} V∈Rm×m 是特征向量矩阵,每一列是一个特征向量。
将特征值从大到小排序,选择前 k k k 个最大的特征值对应的特征向量,构成投影矩阵 W ∈ R m × k W \in \mathbb{R}^{m \times k} W∈Rm×k。降维后的数据 Z ∈ R n × k Z \in \mathbb{R}^{n \times k} Z∈Rn×k 为:
Z = X std W Z = X_{\text{std}} W Z=XstdW
使用投影矩阵 W W W 将降维后的数据 Z Z Z 还原到原始空间,得到 X ^ std ∈ R n × m \hat{X}_{\text{std}} \in \mathbb{R}^{n \times m} X^std∈Rn×m:
X ^ std = Z W T \hat{X}_{\text{std}} = Z W^T X^std=ZWT
将标准化后的数据还原为原始尺度:
X ^ = X ^ std ⊙ σ + μ \hat{X} = \hat{X}_{\text{std}} \odot \sigma + \mu X^=X^std⊙σ+μ
其中 ⊙ \odot ⊙ 表示逐元素乘法。
计算还原数据 X ^ \hat{X} X^ 与原始数据 X X X 的均方误差:
MSE = 1 n m ∑ i = 1 n ∑ j = 1 m ( X i j − X ^ i j ) 2 \text{MSE} = \frac{1}{n m} \sum_{i=1}^n \sum_{j=1}^m (X_{ij} - \hat{X}_{ij})^2 MSE=nm1i=1∑nj=1∑m(Xij−X^ij)2
假设原始数据 X ∈ R n × m X \in \mathbb{R}^{n \times m} X∈Rn×m 的大小为 n × m n \times m n×m,降维后数据 Z ∈ R n × k Z \in \mathbb{R}^{n \times k} Z∈Rn×k 的大小为 n × k n \times k n×k,投影矩阵 W ∈ R m × k W \in \mathbb{R}^{m \times k} W∈Rm×k 的大小为 m × k m \times k m×k。压缩比为:
压缩比 = n × m n × k + m × k \text{压缩比} = \frac{n \times m}{n \times k + m \times k} 压缩比=n×k+m×kn×m
存储空间节省率为:
存储空间节省率 = n × m − ( n × k + m × k ) n × m × 100 % \text{存储空间节省率} = \frac{n \times m - (n \times k + m \times k)}{n \times m} \times 100\% 存储空间节省率=n×mn×m−(n×k+m×k)×100%
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
# 读取数据
data = pd.read_excel('附件2.xlsx', header=None)
X = data.values
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 初始化PCA,设置主成分数量为k,这里假设k=2
k = 2
pca = PCA(n_components=k)
# 执行PCA降维
X_pca = pca.fit_transform(X_scaled)
# 还原数据
X_reconstructed = pca.inverse_transform(X_pca)
# 将标准化后的数据还原回原始尺度
X_reconstructed_original = scaler.inverse_transform(X_reconstructed)
# 计算MSE
mse = mean_squared_error(X, X_reconstructed_original)
# 压缩比和存储空间节省率计算
n, m = X.shape
original_size = n * m
compressed_size = n * k + k * m
compression_ratio = original_size / compressed_size
storage_saving = (original_size - compressed_size) / original_size * 100
print(f'MSE: {mse}')
print(f'Compression ratio: {compression_ratio}')
print(f'Storage saving (%): {storage_saving}')
sklearn.decomposition.PCA
进行降维。在这里,我们假设主成分数量 k=2
,但实际应用中需要根据累计方差贡献率或MSE要求来选择合适的 k
值。inverse_transform
方法将降维后的数据还原到原始特征空间,然后再将标准化后的数据还原到原始尺度。n x m
,压缩后数据大小为 n x k + k x m
,其中 n x k
是降维后的数据大小,k x m
是主成分的大小。k
值。可以通过迭代尝试不同的 k
值,直到满足MSE要求。k
值过大,虽然MSE会降低,但压缩效率也会降低。因此,需要在满足MSE要求的前提下,尽可能选择较小的 k
值。小天会给大家带来所有题目完整思路+完整代码+完整论文全解全析
其中更详细的思路、各题目思路、代码、成品论文等,可以点击下方名片: