• 加入kendall进入计算


    #include<stdio.h>
    #include<stdlib.h>
    //kendall相关系数 
    //传入两个数组,以及数组元素个数,计算这两个数组元素的Kendall相关性
    double kendall(double X[],double Y[],int line)
    {
    
        /*
            int **edge;
            edge=(int **)malloc(G->vexnum*sizeof(int *));
            for(int i=0; i<G->vexnum; i++)
            {
                edge[i]=(int *)malloc(G->vexnum*sizeof(int));
            }
            */
        double info1[line];
        int info2[line];
        double info3[line];
        int info4[line];
        for(int i=0; i<line; i++)
        {
            info1[i]=0.0;
            info2[i]=0;
            info3[i]=0.0;
            info4[i]=0;
        }
        int k=0;
        for(int j=0; j<line; j++)
        {
            int judge=0;
            if(k>0)
            {
                for(int m=0; m<k; m++)
                {
                    if( Y[j]==info1[m])
                    {
                        judge=1;
                    }
                }
            }
            if(judge==0)
            {
                info1[k]=Y[j];
                int n=1;
                for(int m=j+1; m<line; m++)
                {
                    if(Y[m]==Y[j])
                        n++;;
                }
                info2[k]=n;
                k++;
            }
        }
        int k2=0;
        for(int j=0; j<line; j++)
        {
            int judge=0;
            if(k2>0)
            {
                for(int m=0; m<k2; m++)
                {
                    if( X[j]==info3[m])
                    {
                        judge=1;
                    }
                }
            }
    
            if(judge==0)
            {
                info3[k2]=X[j];
                int n=1;
                for(int m=j+1; m<line; m++)
                {
                    if(X[m]==X[j])
                        n++;;
                }
                info4[k2]=n;
                k2++;
            }
        }
        int C=0,D=0;
        double N1=0.0,N2=0.0;
        for(int i=0; i<line; i++)
        {
            if(i<k)
            {
                N2+=0.5*info2[i]*(info2[i]-1);
            }
            if(i<k2)
            {
                N1+=0.5*info4[i]*(info4[i]-1);
            }
            for(int j=i+1; j<line; j++)
            {
                if((X[i]>X[j]&&Y[i]>Y[j])||(X[i]<X[j]&&Y[i]<Y[j]))
                    C++;
                else if((X[i]>X[j]&&Y[i]<Y[j])||(X[i]<X[j]&&Y[i]>Y[j]))
                    D++;
            }
        }
        double N3=line*(line-1)/2.0;
        double kendall=((C-D)*1.0)/sqrt((N3-N1)*(N3-N2));//eb和rb
        return kendall;
    }
    
    
    //对rate和ec和degree进行排序
    //str传入需要排序的文件,line传入文件行数即节点数
     void sortByRate(char* str,int line){
         FILE* fp;
        
         float ex;//用于rate和ec的比较
         int ex1;//用于degree的比较
         int temp;
        int a;
        float b;
        float c;
        int d;
        int i=0;
        int j=0;
        int p=0;
        //用于排序的degeree,ec,rate
        int degree[2000];
        float ec[2000];
        int kcore[2000];
        float rate[2000];
        
        //记录节点真实的degeree,ec,rate
        int degree1[2000];
        float ec1[2000];
        int kcore1[2000];
        float rate1[2000];
    //记录节点变化
        int dflag[2000];
        int eflag[2000];
        int kflag[2000];
        int rflag[2000];
    
        fp=fopen(str,"r");
        char buf[1024];
        char StrLine[1024];
        if((fp=fopen(str,"r"))==NULL)
        {
        perror("faile to read");
        exit(1);
        }
    int max=0;
    while(!feof(fp))//因为行数等于边数,则读取行数个就可以把其他的节点的连接读完
        {
    
    fgets(StrLine,1024,fp);
    sscanf(StrLine,"%d%f%d%f",&a,&b,&d,&c);
    
         degree[i]=a;
         ec[i]=b;
         rate[i]=c;
         kcore[i]=d;
    
         degree1[i]=a;
         ec1[i]=b;
         kcore1[i]=d;
         rate1[i]=c;
        
        i++;
        
        
        }
    
    
    //对感染率排序
        for( p=0;p<line;p++)
        {
        rflag[p]=p;
        }
         for(i=0;i<line;i++){
             for( j=0;j<line-i-1;j++){
                 if(rate[j]<rate[j+1]){
                    temp=rflag[j];
                    rflag[j]=rflag[j+1];
                    rflag[j+1]=temp;
                     
                    ex=rate[j];
                    rate[j]=rate[j+1];
                    rate[j+1]=ex;
                     }
                
            
                                        }
                                 }
    //对度排序
    for( p=0;p<line;p++)
        {
        dflag[p]=p;
        
        }
         for(i=0;i<line;i++){
             for( j=0;j<line-i-1;j++){
                 if(degree[j]<degree[j+1]){
                    temp=dflag[j];
                    dflag[j]=dflag[j+1];
                    dflag[j+1]=temp;
                     
                    ex1=degree[j];
                    degree[j]=degree[j+1];
                    degree[j+1]=ex1;
                     }
                
            
                                        }
                                 }
    //对kcore进行排序
     for( p=0;p<line;p++)
        {
        kflag[p]=p;
        
        }
         for(i=0;i<line;i++){
             for( j=0;j<line-i-1;j++){
                 if(kcore[j]<kcore[j+1]){
                    temp=kflag[j];
                    kflag[j]=kflag[j+1];
                    kflag[j+1]=temp;
                     
                    ex1=kcore[j];
                    kcore[j]=kcore[j+1];
                    kcore[j+1]=ex1;
                     }
                
            
                                        }
                                 }
    //对特征向量中心性排序
    for( p=0;p<line;p++)
        {
        eflag[p]=p;
        }
         for(i=0;i<line;i++){
             for( j=0;j<line-i-1;j++){
                 if(ec[j]<ec[j+1]){
                    temp=eflag[j];
                    eflag[j]=eflag[j+1];
                    eflag[j+1]=temp;
                     
                    ex=ec[j];
                    ec[j]=ec[j+1];
                    ec[j+1]=ex;
                     }
                
            
                                        }
                                 }
        /*
        //比较数值所属节点从大往小排
        for(int k=0;k<line;k++)
        {
        
        printf("%d ",eflag[k]);
        }
        //比较的数值从大往小排
        printf("
    -------
    ");
        for( int k=0;k<line;k++)
        {
            printf("%f ",ec[k]);
        
        }
        
        */
        //计算kendall(进行比较的参数,进行比较的参数,个数)
        double q=kendall(degree1,rate1,2000);
        printf("%f ",q); 
        //计算相关性
        //节点比例依次从0.05到0.2(i=比例*2000)
        FILE* fp2;
        char* str2="E:\data_set\relative.txt";//写入结果的文件 
        fp2=fopen(str2,"w");
         for(int nodeNum=10;nodeNum<=400;nodeNum=nodeNum+10){
        float i;
        i=nodeNum/2000.0;//nodeNum占总个数的比例 
        int k=0;
        float x1=0;
        float x2=0;
        float num1=0;
        float num2=0;
        float num3=0;
        //按照度 
         for( k=0;k<nodeNum;k++)
        {
        x1+=ec1[dflag[k]];
        }
        for( k=0;k<nodeNum;k++)
        {
        x2+=ec[k];
        }
        num1=1.0-(x1/x2);
        //printf("degree is: %f 
    ",1.0-(x1/x2));
        
    
        //按照ec 
         for( k=0;k<nodeNum;k++)
        {
        x1+=ec1[eflag[k]];
        }
        for( k=0;k<nodeNum;k++)
        {
        x2+=ec[k];
        }
        num2=1.0-(x1/x2);
        //printf("the ec is: %f 
    ",1.0-(x1/x2));
          
          //按照kcore 
         for( k=0;k<nodeNum;k++)
        {
        x1+=ec1[kflag[k]];
        }
        for( k=0;k<nodeNum;k++)
        {
        x2+=ec[k];
        }
        num3=1.0-(x1/x2);
        
        
        fprintf(fp2,"%.3f        %f        %f         %f
    ",i,num1,num2,num3);
        
        
        
    }
     } 
    
    
    int main(){
        
        char* str="E:\data_set\result2b.txt";//传入的文件必须没有空格 
        
        
        sortByRate( str,2000);
        
        return 0;
    }

    #include<stdio.h>#include<stdlib.h>//kendall相关系数 //传入两个数组,以及数组元素个数,计算这两个数组元素的Kendall相关性double kendall(double X[],double Y[],int line){
        /*        int **edge;        edge=(int **)malloc(G->vexnum*sizeof(int *));        for(int i=0; i<G->vexnum; i++)        {            edge[i]=(int *)malloc(G->vexnum*sizeof(int));        }        */    double info1[line];    int info2[line];    double info3[line];    int info4[line];    for(int i=0; i<line; i++)    {        info1[i]=0.0;        info2[i]=0;        info3[i]=0.0;        info4[i]=0;    }    int k=0;    for(int j=0; j<line; j++)    {        int judge=0;        if(k>0)        {            for(int m=0; m<k; m++)            {                if( Y[j]==info1[m])                {                    judge=1;                }            }        }        if(judge==0)        {            info1[k]=Y[j];            int n=1;            for(int m=j+1; m<line; m++)            {                if(Y[m]==Y[j])                    n++;;            }            info2[k]=n;            k++;        }    }    int k2=0;    for(int j=0; j<line; j++)    {        int judge=0;        if(k2>0)        {            for(int m=0; m<k2; m++)            {                if( X[j]==info3[m])                {                    judge=1;                }            }        }
            if(judge==0)        {            info3[k2]=X[j];            int n=1;            for(int m=j+1; m<line; m++)            {                if(X[m]==X[j])                    n++;;            }            info4[k2]=n;            k2++;        }    }    int C=0,D=0;    double N1=0.0,N2=0.0;    for(int i=0; i<line; i++)    {        if(i<k)        {            N2+=0.5*info2[i]*(info2[i]-1);        }        if(i<k2)        {            N1+=0.5*info4[i]*(info4[i]-1);        }        for(int j=i+1; j<line; j++)        {            if((X[i]>X[j]&&Y[i]>Y[j])||(X[i]<X[j]&&Y[i]<Y[j]))                C++;            else if((X[i]>X[j]&&Y[i]<Y[j])||(X[i]<X[j]&&Y[i]>Y[j]))                D++;        }    }    double N3=line*(line-1)/2.0;    double kendall=((C-D)*1.0)/sqrt((N3-N1)*(N3-N2));//eb和rb    return kendall;}

    //对rate和ec和degree进行排序//str传入需要排序的文件,line传入文件行数即节点数 void sortByRate(char* str,int line){     FILE* fp;         float ex;//用于rate和ec的比较     int ex1;//用于degree的比较     int temp;    int a;    float b;    float c;    int d;    int i=0;    int j=0;    int p=0;    //用于排序的degeree,ec,rate    int degree[2000];    float ec[2000];    int kcore[2000];    float rate[2000];        //记录节点真实的degeree,ec,rate    int degree1[2000];    float ec1[2000];    int kcore1[2000];    float rate1[2000];//记录节点变化    int dflag[2000];    int eflag[2000];    int kflag[2000];    int rflag[2000];
        fp=fopen(str,"r");    char buf[1024];    char StrLine[1024];    if((fp=fopen(str,"r"))==NULL)    {    perror("faile to read");    exit(1);    }int max=0;while(!feof(fp))//因为行数等于边数,则读取行数个就可以把其他的节点的连接读完    {
    fgets(StrLine,1024,fp);sscanf(StrLine,"%d%f%d%f",&a,&b,&d,&c);
         degree[i]=a;     ec[i]=b;     rate[i]=c;     kcore[i]=d;
         degree1[i]=a;     ec1[i]=b;     kcore1[i]=d;     rate1[i]=c;        i++;            }

    //对感染率排序    for( p=0;p<line;p++)    {    rflag[p]=p;    }     for(i=0;i<line;i++){         for( j=0;j<line-i-1;j++){             if(rate[j]<rate[j+1]){                temp=rflag[j];                rflag[j]=rflag[j+1];                rflag[j+1]=temp;                                 ex=rate[j];                rate[j]=rate[j+1];                rate[j+1]=ex;                 }                                                        }                             }//对度排序for( p=0;p<line;p++)    {    dflag[p]=p;        }     for(i=0;i<line;i++){         for( j=0;j<line-i-1;j++){             if(degree[j]<degree[j+1]){                temp=dflag[j];                dflag[j]=dflag[j+1];                dflag[j+1]=temp;                                 ex1=degree[j];                degree[j]=degree[j+1];                degree[j+1]=ex1;                 }                                                        }                             }//对kcore进行排序 for( p=0;p<line;p++)    {    kflag[p]=p;        }     for(i=0;i<line;i++){         for( j=0;j<line-i-1;j++){             if(kcore[j]<kcore[j+1]){                temp=kflag[j];                kflag[j]=kflag[j+1];                kflag[j+1]=temp;                                 ex1=kcore[j];                kcore[j]=kcore[j+1];                kcore[j+1]=ex1;                 }                                                        }                             }//对特征向量中心性排序for( p=0;p<line;p++)    {    eflag[p]=p;    }     for(i=0;i<line;i++){         for( j=0;j<line-i-1;j++){             if(ec[j]<ec[j+1]){                temp=eflag[j];                eflag[j]=eflag[j+1];                eflag[j+1]=temp;                                 ex=ec[j];                ec[j]=ec[j+1];                ec[j+1]=ex;                 }                                                        }                             }    /*    //比较数值所属节点从大往小排    for(int k=0;k<line;k++)    {        printf("%d ",eflag[k]);    }    //比较的数值从大往小排    printf(" ------- ");    for( int k=0;k<line;k++)    {        printf("%f ",ec[k]);        }        */    //计算kendall(进行比较的参数,进行比较的参数,个数)double q=kendall(degree1,rate1,2000);printf("%f ",q);     //计算相关性//节点比例依次从0.05到0.2(i=比例*2000)FILE* fp2;char* str2="E:\data_set\relative.txt";//写入结果的文件 fp2=fopen(str2,"w");     for(int nodeNum=10;nodeNum<=400;nodeNum=nodeNum+10){    float i;    i=nodeNum/2000.0;//nodeNum占总个数的比例     int k=0;    float x1=0;    float x2=0;    float num1=0;    float num2=0;    float num3=0;    //按照度      for( k=0;k<nodeNum;k++)    {    x1+=ec1[dflag[k]];    }    for( k=0;k<nodeNum;k++)    {    x2+=ec[k];    }    num1=1.0-(x1/x2);    //printf("degree is: %f ",1.0-(x1/x2));    
        //按照ec      for( k=0;k<nodeNum;k++)    {    x1+=ec1[eflag[k]];    }    for( k=0;k<nodeNum;k++)    {    x2+=ec[k];    }    num2=1.0-(x1/x2);    //printf("the ec is: %f ",1.0-(x1/x2));        //按照kcore      for( k=0;k<nodeNum;k++)    {    x1+=ec1[kflag[k]];    }    for( k=0;k<nodeNum;k++)    {    x2+=ec[k];    }    num3=1.0-(x1/x2);            fprintf(fp2,"%.3f%f%f %f ",i,num1,num2,num3);            } } 

    int main(){    char* str="E:\data_set\result2b.txt";//传入的文件必须没有空格         sortByRate( str,2000);    return 0;}

  • 相关阅读:
    .net 中文显示乱码问题(Chinese display with messy code)
    Compare the value of entity field.
    人见人爱A^B 题解
    人见人爱A-B 题解
    全局变量
    第39级台阶 题解
    马虎的算式 题解
    做题技巧
    inline用法
    queue函数用法
  • 原文地址:https://www.cnblogs.com/miaobo/p/12870721.html
Copyright © 2020-2023  润新知