zoukankan      html  css  js  c++  java
  • 求助——数据处理问题

      大家好,本人算法菜鸟一枚,有个处理数据的问题想了好几天,也初步写了一点代码,总达不到理想的效果,希望高手们指点。


      背景与数据细节这里先略过(考虑到公司数据的保密性与表达的无必要性)。

      遇到的问题可以简单地归结到两个公式上面:

      1、K= A1*Px

      2、K= It+(1-Jt)*Kt-1

      公式中变量及要求说明:

      1、目前收集的数据是从1978年到2012年,计算时需要选定某一年为基年,然后以该基年的数据为起点开始往下计算某些属性值。如基年选定1978,则以1978年的数据为起点,一直计算到2012,同理,若基年为1995,则以1995年的数据为起点,一直计算到2012。

      2、上面提到以基年为起点能算到一些属性值,如A, I,易知这两个属性变量均为向量,元素个数为最新数据年份-基年+1,如基年为1995,则个数为2012-1995+1 = 18,It表示第t年的I值,t范围[1,18]。但还有些属性值需要通过两个不定因素的迭代计算得到,如K:K0A1P有关,这里的P为第一个不定因素,变化范围[4.0,5.5],亦是迭代的第一层。

      写过代码的朋友都清楚,这一层迭代只要一个for循环即可完成,这里给出Matlab代码,基年假定为1995。

    1 for Px = 4.0:0.1:5.5
    2      K(1,1) = A(1,1)*Px;  % Matlab中(i,j)表示取矩阵或向量的第i行,第j列元素,这里的变量均为列向量
    3      for t = 2:18         % 后面年份K值的计算
    4          K(t,1) = I(t,1)+(1-J(t,1))*K(t-1,1);
        end
    5 end

      若在Px这个迭代过程中加入最优解评判标准,则可知对于某一个基年,Px最优取值只有一个(假定评判时没有相同的最优结果),也可以说Px参数只针对基年,和后面年份无直接关系。如1995对应4.5,1998对应4.7,这个没有什么难处,也很好理解。


      问题就在于第二个不定因素:J。在计算最优解过程中,J参数和基年无关,但和后面年份相关且每年对应的J值均在范围[0.1,0.23]。

      说到这,本人的本能反应是在第一层迭代中加入J的多层迭代,如基年为2010,则还需加入2011,2012这两年的J值迭代过程。代码如下:

    for Px = 4.0:0.1:5.5
         K(1,1) = A(1,1)*Px;  % Matlab中(i,j)表示取矩阵或向量的第i行,第j列元素,这里的变量均为列向量
         for J1 = 0.1:0.001:0.23
             for J2 = 0.1:0.001:0.23
                J = [1,J1,J2]';      % 符号'表示行向量转为列向量,第一个元素无效,只做占位用,因为需从基年的下一年开始计算
                for t = 2:3          % 后面年份K值的计算
                    K(t,1) = I(t,1)+(1-J(t,1))*K(t-1,1);
                    % 最优解评判过程在此处
                end
            end
        end
    end        

      表面上看,问题解决了,至少在不管最优解能否满足实际需求的前提下。但是仔细一想,忽略了至关重要的一点——最新年份与基年的变动性。看下面列出的几种可能的情况就能知道问题所在:

      1、上述代码中的例子,基年为2010,最新年份为2012,则迭代嵌套为两层;

      2、最初提到的基年为1978,最新年为2012,需35层;

      3、后面提到的基年1995,最新年为2012,需18层;

      4、用户提供的数据也许最新年份为2013或2014等,同样,基年选择1999或2005等;面对这种最新年份与基年都不确定的情况,不定因素J的迭代过程该如何实现?

      本人的能力确实想不出好的方法,目前能做到的只是能确定迭代的次数,如最新年份为2015,基年选取为2000,则迭代嵌套为2015-2000 = 15层。

      提醒一点,确定了层数之后不管其大小如何,是可以实现,如30层就写30个for循环。随着最新年份与基年的变动,层数也跟着变,但是怎么让实现过程也相应地等价层数呢?

      换句话说,上面的疑问即是:

      1、若层数为2,则为两个for循环;

      2、若层数为10,则对应十个for循环;

      3、但是数据的最新年份由统计时间或要求决定,基年选择也不能事先确定,怎么做到:根据用户的数据与基年的选择情况,实现相应的J迭代?

      

  • 相关阅读:
    Oracle11g工具
    Oracle数据库中scott用户的所有表结构
    Oracle数据库手动解锁scott用户
    Oracle数据库实例的删除和安装
    Oracle数据库的安装
    Oracle数据库发展历史
    禁止浏览器中双击选中元素的解决方法
    Window 设置pm2开机自启动服务
    通过node创建web服务器----express插件打包上线
    vue项目优化----通过externals加载外部CDN资源
  • 原文地址:https://www.cnblogs.com/tgyf/p/3758202.html
Copyright © 2011-2022 走看看