C语言实现协方差矩阵

孤人 提交于 2020-01-25 05:36:48

最近在理解机器学习中的PCA降维算法,其中使用协方差矩阵。什么是些方差矩阵,这里不做多介绍。作为软件工程师,理解算法原理是一回事,没有亲自编码实践总觉得缺了什么。

现将自己C语言实现协方差矩阵代码如下

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

void TransposeMatrix(int *input, int rows, int cols, int *output)
{
    for(int row=0;row<rows;row++)
    {
        for(int col=0;col<cols;col++)
        {
            int sindex=row*cols + col;
            int dindex=col*rows + row;            
			printf("sindex=%d,dindex=%d\n",sindex,dindex);
            output[dindex]=input[sindex];
        }
    }
}
void PrintMatrix(int *array, int rows,int cols)
{
    int index=0;
    for(int row=0;row<rows;row++)
    {
        for(int col=0;col<cols;col++)
        {
            printf("%3d ",array[index++]);
        }
        printf("\n");
    }
}

/*协方差*/
void cov(int x[],int y[],int n,double *p)
{
    int i;
    double averx,avery,sumx=0,sumy=0;
    double sum=0;
    for(i=0;i<n;i++)
    {
        sumx+=x[i];
        sumy+=y[i];
    }
    averx=sumx/n;
    avery=sumy/n;
    for(i=0;i<n;i++)
        sum+=(x[i]-averx)*(y[i]-avery);
    *p=sum/(n-1);
}

int main(int argc, char *argv[])
{
    int row=10;
    int col=3;
	int *a=(int*)malloc(row*col*sizeof(int));
	int *b=(int*)malloc(row*col*sizeof(int));
	memset(a,0,row*col*sizeof(int));
	memset(b,0,row*col*sizeof(int));
    #if 0
	for(int i=0;i<row*col;i++)
	{
		a[i]=i;
	}
    #else
    a[0]=10;
    a[1]=15;
    a[2]=29;
    a[3]=15;
    a[4]=46;
    a[5]=13;
    a[6]=23;
    a[7]=21;
    a[8]=30;
    a[9]=11;
    a[10]=9;
    a[11]=35;
    a[12]=42;
    a[13]=45;
    a[14]=11;
    a[15]=9;
    a[16]=48;
    a[17]=5;
    a[18]=11;
    a[19]=21;
    a[20]=14;
    a[21]=8;
    a[22]=5;
    a[23]=15;
    a[24]=11;
    a[25]=12;
    a[26]=21;
    a[27]=21;
    a[28]=20;
    a[29]=25;
    
    #endif
    PrintMatrix(a,row,col);
    TransposeMatrix(a,row,col,b);
	printf("----------after TransposeMatrix------------\n");
    PrintMatrix(b,col,row);
    
    /*协方差矩阵*/
    for(int i=0;i<col;i++)
    {
        for(int j=0;j<col;j++)
        {
			double tmp;
			cov(b+i*row,b+j*row,row,&tmp);
			printf("[%d,%d] %f \n",i,j,tmp);
        }
    }
    
    free(a);
    free(b);
    return 0;
}

上面的结果与参考中使用matlab的结果一致:
[0,0] 108.322222
[0,1] 74.533333
[0,2] -10.088889
[1,0] 74.533333
[1,1] 260.622222
[1,2] -106.400000
[2,0] -10.088889
[2,1] -106.400000
[2,2] 94.177778

参考:
http://pinkyjie.com/2010/08/31/covariance/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!