最近在理解机器学习中的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/
来源:CSDN
作者:weixin_41815482
链接:https://blog.csdn.net/weixin_41815482/article/details/104050006