问卷信息反馈的反编译

前提

我们的结果与研究方法有关;

1.就算同样是一个数据集也可能得出两个不同的结果。
2.由于数据随机生成的不同;对后面的结果影响可能更大。
3.由于因素的互相干扰,随意按照分布生成已经完全解决不了问题;那么必须在生成足够多的数据下检验甄别。
常见方法
1,首先要确定每个选项在问卷中的百分比;
例如A,0.3;B,0.7
方法:就是random<0.3取A,else取B
对于双选,需要AC就需要两重选择分配;
100%+cen%
2,对于何种方法下对应的结果
例如主成分分析的话,若根据结果反馈到需要得到的信息就非常复杂
解决方法:
在1满足的情况下实验得到需要的数据集。一般来说很快可以确定需要的数据集。
若要更加准确,需要更加满意的可能需要深层的分析,
方向:a,根据生成的部分数据集的方向,关联法则的分析;
例如确定其中1A2B同时出现,增加这样的一个条件可以有效增强数据集的可信性。
   b,根据得到的数据集结果进行部分有目的性的少量改变。
3,由于大部分由降维(PCI)主成分分析得到的结果就具有较强的可信性
  根据因素特征再做其他的分析也可以快速实用,例如,分类或者聚类的想法。

4,实现相关分析在特征间的联系

也就是通过做数据还能把两两因素的相关系数决定出来。

5,交互模式的实现
这里主要体现在人机交互的多和少上。用Excel或者spss做数据分析;
对于每个阶段都系要对数据集人工进行操作所以在第二个阶段就变得麻烦了。
所以这里需要提前熟悉统计学编译软件的应用,数据的自动输入;(这个操作我不知道指令...)
顺利提取运行结果及编译过程实现自动对对结果进行处理得到最终需要的信息。


具体实现
<层层递进的形式,先易后难,随着层次越来越高,自己的工作量可以慢慢减少>
1,单选项基本统计量的造假
这里并不是描述单个统计量的变化,所以不存在说构造runif(100,0,1)这是构造100个N[0,1]正太分布在R中的实现;
但是与问卷造假无关。我们只有实现ABCD各个百分比的多少;应用的基础函数为混合同余法产生的随机数random();
基本思路:若实现ABCD百分比分别为13,24,31,32---->(13,37,68,100)应该如何实现;
大数定律:随着构造量的增加,我们数据越来越接近预想的目标。
Gz1.java
2,增加一个难度,直接实现多选项目标
例如要总体实现A单个有A出现的概率有0.51
 AB有出现的概率为
数学方法推导和严格的预先目标实现;
条件1:所有的抽样实验中: 
A出现的概率为0.46; AB+A+AC+AD =0.46
B出现的概率为0.32; AB+BC+B+BD =0.32
C出现的概率为0.42;CA+CB+C+CD =0.32
D出现的概率为0.22;DA+DB+D+DC =0.22
  单条件实现:很明显若为这一层的实现非常简单;实现两层随机数的遍历:
第一层控制到ABCD加起来为100%(也可以为其他值);
第二层为ABCD的余数假期来为sum-100%;

条件2:由于有时候我们的目标分类除了ABCD,可能还有AC,BD,AD等的同时出现;<假设ABCD独立>

实现AB同时出现的概率为0.21         P(B|A) = P(AB)/P(A) 

所以我们的控制就是所有在A出现的时候控制B的概率即可。

实现CB同时出现的概率为0.08 P(B|C) = P(CB)/p(C)
..........................
**弊端:利用条件概率可能会出现选项腾空期在条件1中不满足。但是对于多个多选项的详细实现可以适当减少这个状况。
程序实现原理
先将A选项的条件满足再说;-随着B条件越来越多,最终的结果越来越单一。

这里的选项ABCD和很明显高于100但是小于200;若大于200一般需要三层;与二层同理;

以本题为例说说双项问题并实现

首先我们可以知道对于每个题最多每个选项出现一次,所以先在第一层把条件1中安排掉100%
ps:这里的设置可以根据我们的需要直观给出下面的执行步骤;但不是我介绍思想的重点;下面实现。
1,首先给A安排空间;在A上给B分配了部分空间-----AB>>>>>>>>其他的用条件概率实现
        2,剩下的给B开辟分配空间;在B上用了C的部分空间-------BC>>>>>>>>用条件概率实现其他
3,再剩下的给C开辟空间:在C上用了D的部分空间-------CD>>>>>>>>>>>>>>用条件概率实现其他
4,如果还有空间就应该只剩下单个D的。
3,多选项的相关性实现
例如因素1本来就与因素2 有关系,相关系数为0.6
这里根据双因素的例题举例,对于多因素,发挥你聪明的小脑袋自己想想。若不想如此,就如上面所说,
两个随机得到的序列生成结果再进行相关分析直到得到我们目标获得的序列组合结束。
实现因素1和因素2的联系
造假猜想方向1:例如每个A有0.6对应到B,每个B有0.6对应到C...
造假猜想方向2:由于相关分析都是线性的;关于本身对因素的处理也跟这个有关,例如,A因素通过量化后再和B做相关分析;和直接1234和1234建立相关分析,完全不同。了解上面的2思想,可以自主构造这个关系式和设计构造联系。

4,解答方法的完整反编译。略

附件:实现非常简单。

/*
    造假第一个;
*/
class Gz      {   
    public static void main(String[] args){
            gz(40);
        }
    //需求构造100个数据,abcd大概分配为13-24-31-32
    public static void gz(int n){
        String[] x1 = new String[n];
        for(int i=0;i<x1.length;i++){
            double oc = Math.random();
            if(oc<0.13){
                x1[i]="A";
            }else if(oc<0.37){
                x1[i]="B";
            }else if(oc<0.68){
                x1[i]="C";
            }else{
                x1[i]="D";
            }
        }
        printArray(x1);
        jianYan(x1);
    }
   public static void printArray(String [] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"	");
        }
        System.out.println();
    
   }
   public static void jianYan(String[] arr){
        int count_a=0;
        int count_b=0;
        int count_c=0;
        int count_d=0;
        for(int i=0;i<arr.length;i++){
            switch(arr[i]){
                case "A":
                     count_a++;
                     break;
                case "B":
                     count_b++;
                     break;
                case "C":
                     count_c++;
                     break;
                case "D":
                     count_d++;
                     break;
                default:
                    System.out.println("Why are you here?");
                    break;
             }
        }
         int s = count_a + count_b + count_c + count_d;
         double a = (double) count_a/s;
         double b = (double) count_b/s;
         double c = (double) count_c/s;
         double d = (double) count_d/s;
        System.out.println("A: "+a+"	"+"B: "+b+"	"+"C: "+c+"	"+"D: "+d);

   }
}
//造假第二个
/*
    按概率增加ABCD
    第一层中实现ABCD为

*/
class Gz2 {   
    public static void main(String[] args){
            gz(100);
        }
    //需求构造100个数据,abcd大概分配为13-24-31-32
    public static void gz(int n){
        String[] x1 = new String[n];
        for(int i=0;i<x1.length;i++){
            double oc = Math.random();
            if(oc<0.13){
                x1[i]="A";
            }else if(oc<0.37){
                x1[i]="B";
            }else if(oc<0.68){
                x1[i]="C";
            }else{
                x1[i]="D";
            }
        }
        for(int i =0;i<x1.length;i++){
            double occ  = Math.random();
            switch(x1[i]){
                case "A":
                    if(occ<0.17){
                            x1[i] = x1[i] +"B";//AB
                        }else if(occ<0.33){
                            x1[i] = x1[i] +"C";//AC 
                        }else if(occ<0.45){
                            x1[i] = x1[i]+"D";//AD
                        }
                    break;
                case "B":
                    if(occ<0.22){
                    x1[i] =x1[i]+"C";        //BC
                        }else if(occ<0.33){ 
                            x1[i] =x1[i]+"D";//BD
                        }
                    break;
                case "C":
                    if(occ<0.12){
                        x1[i] = x1[i]+"D";//CD
                }
            }
        }
        printArray(x1);
    }
   public static void printArray(String [] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"	");
        }
        System.out.println();    
   }
}
//造假3
/*
   A:0.56-------------------A,AB,AC,AD
   B:0.36-------------------B,BC,BD
   C:0.43-------------------C,CD
   D:0.41-------------------D
   第一层空间全部分给A;------------->        AB=0.12,AC=0.11;AD=0.08
   第二层空间全部分给剩下的B:------>B剩下0.25;       BC=0.09;BD=0.13; 
   第三层空间全部分给剩下的C:------>C剩下0.16;               CD=0.0;  
   第四层空间全部分给剩下的D:------>D剩下0.03;这里的0.1是D单独的
   根据要求,每一层的结果都会对应有相应的数值;应该根据需求严格计算。
   这里的假设独立,且都是这样弄下来,所以,可能造成情况D单独出现甚至C单独出现的缺失。
        随便尝试几次就了解了
*/
class   Zj{    
    public static void main(String[] args){
        zj2(200);
        }
    public static void zj2(int n){
        String[] s = new String[n];      
        for(int i=0;i<n;i++){
            double oc = Math.random();
            if(oc<0.56){
                double oc1 = Math.random();
                if(oc1<0.12){
                    s[i] = "AB";
                }else if(oc1<0.23){
                    s[i] = "AC";
                }else if(oc1<0.31){
                    s[i] = "AD";
                }else{
                   s[i] = "A";
                    }    
            }else if(oc<0.81){
                double oc2 = Math.random();
                if(oc2<0.09){
                    s[i] ="BC";
                }else if(oc2<0.22){
                    s[i] ="BD";
                }else {
                    s[i] = "B";
                }
            }else if(oc<0.97){
                s[i] = "C"; //这里CD为0;           
            }else{
                s[i] = "D";
            }       
         }
        printArray(s);   
  }
     public static void printArray(String[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+"	");
        }
        System.out.println();    
   }
}


原文地址:https://www.cnblogs.com/actanble/p/6713467.html