零均值單位方差


這幾天在看文章的時候,看到這么一段話:

“First, we normalize the grayscale intensity in the eye region for each of the aligned facial images to zero mean and unit variance.”

意思就是第一步對眼睛的區域進行零均值單位方差。第一次知道還有這玩意。。

經過查閱matlab prestd函數就代表了這個意思:

試驗一下:

>> a=[1 2 3 4]

a =

     1     2     3     4

>> [pn m std]=prestd(a)
Warning: PRESTD is an obsolete function. 
> In obs_fcn at 18
  In prestd at 10 
          Use MAPSTD instead.
 

pn =

   -1.1619   -0.3873    0.3873    1.1619


m =

    2.5000


std =

    1.2910

>> 

其中pn代表已經零均值單位方差的矩陣,m代表a的均值  std代表a的方差

 

轉成C++代碼就應該是這樣:

    int a = 2;
    int b = 2;
    double  gray[2 * 2] = { 1,2,3,4 };
    double total = 0.0;
    for (int i = 0; i < b; i++)
    {
        for (int j = 0; j < a; j++)
        {
            total += (double)gray[i*a + j];
        }
    }
    double meanvalue = total / (a*b);
    //零均值單位方差
    double stdp = 0.0;
    for (int i = 0; i < b; i++)
    {
        for (int j = 0; j < a; j++)
        {
            double temp = gray[i*a + j];
            stdp += ((temp - meanvalue)*(temp - meanvalue));
        }
    }

    stdp = sqrt(stdp / (a*b));
    qDebug() << meanvalue << " " << stdp;
    for (int i = 0; i < b; i++)
    {
        for (int j = 0; j < a; j++)
        {
            double temp = gray[i*a + j];
            qDebug()<<i<<" "<<j<<" "<<(temp - meanvalue) / stdp;
        }
    }

咱們看一下結果輸出:

 

 

發現在方差的值就不一樣了。為什么呢,

原來方差還存在偏差的概念;

 double meanvalue = total / (a*b);//有偏差為n

 double meanvalue = total / (a*b-1);//無偏差的方差n-1
而matlab默認是無偏差的方差,所以我們只要用無偏差替換到有偏差就和metlab相對應了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM