Python中的迭代比例拟合

2025年3月5日 | 阅读 4 分钟

迭代比例拟合 (IPF),通常被称为 RAS 方法,是一种用于修改框架条目以便行和列总和匹配预定义标准的计算方法。该过程通常用于统计、经济学和可能性表分析,尤其是在处理具有预定边际分布的分类数据时。

IPF 通过迭代调整矩阵的行和列来工作,确保在每个步骤中行总和和列总和匹配。该方法一直进行到收敛,此时框架同时满足行和列的总和标准。

理解过程

让我们想象一个包含一些联列表数据的矩阵。IPF 计算的目标是修改此矩阵,以便

  • 行总和与一组目标行总和进行比较。
  • 列总和与一组目标列总和进行比较。

在每次迭代中,我们执行两个步骤:

  • 调整行:按比例缩放每一行,使其总和等于目标行总和。
  • 修改列:按比例缩放每一列,使其总和等于目标列的总和。

该策略会重复进行,直到矩阵收敛到所需的行和列总和。

迭代比例拟合的步骤

  1. 起始设置:从一个非负矩阵 A 和两个向量开始:R 用于目标行总和,C 用于目标列总和。
  2. 行缩放:按比例缩放每一行 i,使其行中各分量的总和等于 Ri。这可以通过将该行的每个分量乘以 Ri 并除以该行的当前总和来完成。
  3. 列缩放:在调整行之后,按比例缩放每一列 j,使其列中各分量的总和等于 Cj。与行缩放不同,列中的每个分量都乘以 Cj 并除以该列的当前总和。
  4. 收敛:重复步骤 2 和 3,直到矩阵收敛;此时行和列的总和接近目标值。

该策略对于处理诸如生成具有已知边际总和的可能性表之类的问题至关重要但又非常有效。

Python 实现迭代比例拟合

以下是 Python 中 IPF 的一个简单实现:Python

代码

输出

 
[[4.31112405 2.68885401]
[4.68887595 7.31114599]]   

代码详解

  1. 输入数据:该函数接受三个输入:
  2. matrix:需要调整的初始矩阵。
  3. Target_rows:目标行总和。
  4. Target_columns:目标列总和。
  5. 行缩放:在每次迭代中,使用 matrix.sum(axis=1) 计算当前行总和,并根据目标行总和与当前行总和的比例来缩放每一行。
  6. 列缩放:在修改行之后,我们使用 matrix.sum(axis=0) 计算列总和,并根据目标列总和与当前列总和的比例来缩放每一列。
  7. 收敛检查:在调整行和列之后,我们使用 np.allclose 来确定平衡后的矩阵的行和列总和是否接近目标总和。如果接近,则循环终止,并返回矩阵。
  8. 输出:该函数返回具有提供的行和列总和的已调整矩阵。

迭代比例拟合的应用

  1. 联列表调整:确保联列表中行和列的总和与指定的总和匹配。
  2. 人口合成:在交通建模中,IPF 用于创建与统计数据匹配的工程人口。
  3. 平衡经济表:经济表用于调整投入和产出。

IPF 的优点

  1. 简单性:该算法易于实现,使用了诸如逐元素乘法和求和之类的基本矩阵运算。
  2. 适应性:它可以处理小型和大型数据集。它可以缩放任何矩阵(方形或矩形)以适应行和列的限制。
  3. 保证可行性:IPF 确保在足够多的迭代次数后,矩阵将具有合适的行和列总和。

迭代比例拟合是一种简单而有效的方法,用于调整矩阵以匹配行和列的总和。它通常应用于各种领域,包括统计学、经济学、社会科学和医疗研究。虽然在某些情况下该过程可能需要几次迭代才能收敛,但其适应性和保证的可行性使其成为各种实际应用的重要工具。

在 Python 中实现 IPF 允许您有效地处理需要将数据调整为匹配特定约束的实际问题。当处理联列表并确保行和列的总和与期望值匹配时,这种方法非常方便。