রিয়েল টাইমে গড় এবং স্ট্যান্ডার্ড বিচ্যুতি নির্ধারণ করা


31

রিয়েল টাইম অ্যাপ্লিকেশনের জন্য কোনও সংকেতের গড় এবং মানক বিচ্যুতি সন্ধান করার আদর্শ উপায় কী হবে। আমি নির্দিষ্ট সময়ের জন্য 3 টিরও বেশি মানক বিচ্যুতি যখন সিগন্যাল থাকত তখন আমি কোনও নিয়ামককে ট্রিগার করতে সক্ষম হতে চাই।

আমি ধরে নিচ্ছি যে কোনও ডেডিকেটেড ডিএসপি এটি খুব সহজেই করবে, তবে এমন কোনও "শর্টকাট" রয়েছে যার জন্য এত জটিল কিছু প্রয়োজন হতে পারে না?


আপনি কি সিগন্যাল সম্পর্কে কিছু জানেন? এটি কি স্থির?

@ টিম বলি এটি স্থির। আমার নিজের কৌতূহলের জন্য, কোনও অ-স্টেশনারি সংকেতের ব্যর্থতা কী হবে?
জোনস্কা

3
যদি এটি স্থির থাকে তবে আপনি কেবল চলমান গড় এবং মানক বিচ্যুতি গণনা করতে পারেন। সময়ের সাথে যদি গড় এবং স্ট্যান্ডার্ড বিচ্যুতি আলাদা হয় তবে বিষয়গুলি আরও জটিল হবে।

5
খুব সম্পর্কিত: en.wikipedia.org/wiki/...
ডঃ belisarius

উত্তর:


36

জেসন আর এর উত্তরের একটি ত্রুটি রয়েছে, যা নুথের "আর্ট অফ কম্পিউটার প্রোগ্রামিং" খণ্ডে আলোচনা করা হয়েছে। ২. সমস্যাটি যদি আসে যদি আপনার একটি স্ট্যান্ডার্ড বিচ্যুতি থাকে যা গড়ের একটি ছোট ভগ্নাংশ হয়: E (x ^ 2) - (E (x) ^ 2) এর গণনা ভাসমান পয়েন্ট গোলাকার ত্রুটির ক্ষেত্রে তীব্র সংবেদনশীলতায় ভোগে।

এমনকি আপনি এটি পাইথন স্ক্রিপ্টে চেষ্টা করে দেখতে পারেন:

ofs = 1e9
A = [ofs+x for x in [1,-1,2,3,0,4.02,5]] 
A2 = [x*x for x in A]
(sum(A2)/len(A))-(sum(A)/len(A))**2

আমি একটি উত্তর হিসাবে -128.0 পেয়েছি, যা স্পষ্টরূপে গণনাযোগ্যভাবে বৈধ নয়, যেহেতু গণিতের ভবিষ্যদ্বাণী করা হয় যে ফলাফলটি nonnegative হওয়া উচিত।

নথ চলমান গড় এবং স্ট্যান্ডার্ড বিচ্যুতি গণনার জন্য একটি পদ্ধতির (আমি আবিষ্কারকের নামটি মনে করি না) উদ্ধৃত করে যা এরকম কিছু হয়:

 initialize:
    m = 0;
    S = 0;
    n = 0;

 for each incoming sample x:
    prev_mean = m;
    n = n + 1;
    m = m + (x-m)/n;
    S = S + (x-m)*(x-prev_mean);

এবং তারপরে প্রতিটি পদক্ষেপের পরে, মানটি mহ'ল গড় এবং মানক বিচ্যুতিটি আপনার পছন্দের সংজ্ঞাটি কোনটির উপর নির্ভর করে sqrt(S/n)বা sqrt(S/n-1)নির্ভর করে তা গণনা করা যায় ।

উপরে আমি যে সমীকরণটি লিখছি তা নূথের তুলনায় কিছুটা আলাদা তবে এটি গণনার সমতুল্য।

যখন আমার আরও কয়েক মিনিট সময় থাকবে, আমি পাইথনের উপরের সূত্রটি কোড করব এবং দেখাব যে আপনি একটি অব্যক্ত উত্তর পেয়ে যাবেন (আশা করি সঠিক মানটির নিকটে)।


আপডেট: এটি এখানে।

test1.py:

import math

def stats(x):
  n = 0
  S = 0.0
  m = 0.0
  for x_i in x:
    n = n + 1
    m_prev = m
    m = m + (x_i - m) / n
    S = S + (x_i - m) * (x_i - m_prev)
  return {'mean': m, 'variance': S/n}

def naive_stats(x):
  S1 = sum(x)
  n = len(x)
  S2 = sum([x_i**2 for x_i in x])
  return {'mean': S1/n, 'variance': (S2/n - (S1/n)**2) }

x1 = [1,-1,2,3,0,4.02,5] 
x2 = [x+1e9 for x in x1]

print "naive_stats:"
print naive_stats(x1)
print naive_stats(x2)

print "stats:"
print stats(x1)
print stats(x2)

ফলাফল:

naive_stats:
{'variance': 4.0114775510204073, 'mean': 2.0028571428571427}
{'variance': -128.0, 'mean': 1000000002.0028572}
stats:
{'variance': 4.0114775510204073, 'mean': 2.0028571428571431}
{'variance': 4.0114775868357446, 'mean': 1000000002.0028571}

আপনি লক্ষ করবেন যে এখনও কিছু গোলাকৃতি ত্রুটি রয়েছে, তবে এটি খারাপ নয়, যেখানে naive_statsকেবল ছাগলছানা।


সম্পাদনা: সবেমাত্র বেলিসারিয়াসের মন্তব্যে উইকিপিডিয়াকে উদ্ধৃত করে নুথ অ্যালগরিদমের কথা উল্লেখ করা হয়েছে।


1
উদাহরণ কোড সহ বিশদ উত্তরের জন্য +1। যখন কোনও ভাসমান-পয়েন্ট বাস্তবায়নের প্রয়োজন হয় তখন এই উত্তরটি আমার উত্তরে উল্লিখিত অনুরোধের চেয়ে উচ্চতর।
জেসন আর

1
এটি একটি সি ++ বাস্তবায়নের জন্যও পরীক্ষা করতে পারে: johndcook.com/standard_deedia.html
রুই মার্কস

1
হ্যাঁ, এটা। তিনি নথের সঠিক সমীকরণগুলি ব্যবহার করেন। আপনি কিছুটা অপ্টিমাইজ করতে পারেন এবং প্রাথমিক পুনরাবৃত্তি বনাম পরের পুনরাবৃত্তিগুলির জন্য পরীক্ষা করা এড়াতে পারবেন যদি আপনি আমার পদ্ধতি ব্যবহার করেন।
জেসন এস

"ন্যুথ চলমান গড় গণনা করার জন্য একটি পদ্ধতির (আবিষ্কারকের নাম মনে করি না) উদ্ধৃত করেন" - এটি ওয়েলফোর্ডের পদ্ধতি , উপায় দ্বারা।
জেসন এস

যদি কেউ সহায়তা করতে সক্ষম হয় তবে আমি এটি সম্পর্কিত একটি প্রশ্ন পোস্ট করেছি: dsp.stackexchange.com/questions/31812/…
জোনাথন

13

রিয়েল টাইম অ্যাপ্লিকেশনের জন্য কোনও সংকেতের গড় এবং মানক বিচ্যুতি সন্ধান করার আদর্শ উপায় কী হবে। আমি নির্দিষ্ট সময়ের জন্য 3 টিরও বেশি মানক বিচ্যুতি যখন সিগন্যাল থাকত তখন আমি কোনও নিয়ামককে ট্রিগার করতে সক্ষম হতে চাই।

এ জাতীয় পরিস্থিতিতে সঠিক পন্থা সাধারণত একটি দ্রুততর ওজনযুক্ত চলমান গড় এবং মানক বিচ্যুতি গণনা করা। তাত্ক্ষণিকভাবে ওজনিত গড়তে, গড় এবং বৈকল্পিকের প্রাক্কলনটি সাম্প্রতিকতম নমুনার দিকে পক্ষপাতদুষ্ট হয় যা আপনাকে গত সেকেন্ডেরτ মধ্যে গড় এবং তারতম্যের অনুমান দেয় , যা সম্ভবত আপনি চান, সমস্ত নমুনার চেয়ে স্বাভাবিক গাণিতিক গড়ের চেয়ে কখনও দেখা.

ফ্রিকোয়েন্সি ডোমেনে একটি "তাত্পর্যপূর্ণ ওজনযুক্ত চলমান গড়" কেবল একটি আসল মেরু। সময় ডোমেনে প্রয়োগ করা সহজ।

সময় ডোমেন বাস্তবায়ন

আসুন meanএবং meansqসংকেতের বর্গক্ষেত্রের গড় এবং গড়ের বর্তমান অনুমান দিন। প্রতিটি চক্রের উপর, নতুন নমুনার সাহায্যে এই অনুমানগুলি আপডেট করুন x:

% update the estimate of the mean and the mean square:
mean = (1-a)*mean + a*x
meansq = (1-a)*meansq + a*(x^2)

% calculate the estimate of the variance:
var = meansq - mean^2;

% and, if you want standard deviation:
std = sqrt(var);

এখানে একটি ধ্রুবক যা চলমান গড়ের কার্যকর দৈর্ঘ্য নির্ধারণ করে। কীভাবে একটি নির্বাচন করবেন তা "বিশ্লেষণে" নীচে বর্ণিত হয়েছে।0<একটি<1একটি

অপরিহার্য প্রোগ্রাম হিসাবে উপরে যা প্রকাশ করা হয়েছে সেটিকে সংকেত-প্রবাহের চিত্র হিসাবেও চিত্রিত করা যেতে পারে:

এখানে চিত্র বর্ণনা লিখুন

বিশ্লেষণ

Yআমি=একটিএক্সআমি+ +(1-একটি)Yআমি-1এক্সআমিআমিYআমিz- র

এইচ(z- র)=একটি1-(1-একটি)z- র-1

আইআইআর ফিল্টারগুলি তাদের নিজস্ব ব্লকে সংশ্লেষ করে, চিত্রটি এখন এ জাতীয় দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

z- র=গুলিটিটিগুলি=1/টি1-(1-একটি)-গুলিটি=0গুলি=1টিলগ(1-একটি)

একটি

একটি=1-মেপুঃ{2πটিτ}

তথ্যসূত্র

  • সিমুলিঙ্ক ডায়াগ্রাম উত্সটি https://gist.github.com/1942771 থেকে ডাউনলোড করা যেতে পারে

1
একটিএকটি0 > a > 1

এটি জেসন আর এর পদ্ধতির অনুরূপ। এই পদ্ধতিটি কম নির্ভুল হবে তবে কিছুটা দ্রুত এবং মেমরিতে কম lower এই পদ্ধতির একটি সূচকীয় উইন্ডো ব্যবহার করে শেষ হয়।
schnarf

Woops! অবশ্যই আমি বোঝানো 0 < a < 1। যদি আপনার সিস্টেমে tmie নমুনা দেওয়া থাকে Tএবং আপনি গড় গড় ধ্রুবক চান tau, তবে চয়ন করুন a = 1 - exp (2*pi*T/tau)
নিবোট

আমার মনে হয় এখানে ভুল হতে পারে। একক-মেরু ফিল্টারগুলিতে ডিসিতে 0 ডিবি লাভ হয় না এবং যেহেতু আপনি লিনিয়ার ডোমেনে একটি ফিল্টার এবং স্কোয়ারড ডোমেনে একটি প্রয়োগ করছেন তখন লাভ <<<> এবং <<^ 2> এর ক্ষেত্রে ত্রুটি আলাদা। আমি আমার উত্তরে আরও বিস্তারিত জানাব
হিলমার

এটির ডিসি-তে 0 ডিবি লাভ রয়েছে। বিকল্প z=1(ডিসি) এর পরিবর্তে H(z) = a/(1-(1-a)/z)এবং আপনি 1. পান
নিবোট

5

এমবেডেড প্রসেসিং অ্যাপ্লিকেশনটিতে আমি আগে ব্যবহার করেছি এমন একটি পদ্ধতি হ'ল সুদের সংকেতের যোগফল এবং যোগফলের বর্ধনগুলি বজায় রাখা:

একজনএক্স,আমি=Σ=0আমিএক্স[]=একজনএক্স,আমি-1+ +এক্স[আমি],একজনএক্স,-1=0

একজনএক্স2,আমি=Σ=0আমিএক্স2[]=একজনএক্স2,আমি-1+ +এক্স2[আমি],একজনএক্স2,-1=0

আমিআমি

μ~=একজনএক্সআমিআমি+ +1

σ~=একজনএক্সআমি2আমি+ +1-μ~2

অথবা আপনি ব্যবহার করতে পারেন:

σ~=একজনএক্সআমি2আমি-μ~2

যা স্ট্যানডার্ড ডেভিয়েশন প্রাক্কলন পদ্ধতি উপর নির্ভর করে আপনি পছন্দ । এই সমীকরণগুলি বৈকল্পিক সংজ্ঞার উপর ভিত্তি করে :

σ2=(এক্স2)-((এক্স))2

আমি অতীতে এইগুলি সফলভাবে ব্যবহার করেছি (যদিও আমি কেবলমাত্র প্রকরণের অনুমানের সাথে সম্পর্কিত ছিল, প্রমিত বিচ্যুতি নয়), যদিও আপনাকে সংখ্যক সংখ্যক সংখ্যক প্রকারের সম্পর্কে সাবধানতা অবলম্বন করতে হবে যদি আপনি সংশ্লেষ করতে চলেছেন তবে একটি দীর্ঘ সময়; আপনি ওভারফ্লো চান না

সম্পাদনা: ওভারফ্লো সম্পর্কে উপরের মন্তব্য ছাড়াও, এটি লক্ষ করা উচিত যে ভাসমান-পয়েন্ট গাণিতিক প্রয়োগ করা হলে এটি সংখ্যারূপে দৃ rob় অ্যালগরিদম নয়, সম্ভাব্যভাবে আনুমানিক পরিসংখ্যানগুলিতে বড় ত্রুটি সৃষ্টি করে। সেক্ষেত্রে আরও ভাল পদ্ধতির জন্য জেসন এস এর উত্তরটি দেখুন।


1
একজনএক্স,আমি=এক্স[আমি]+ +একজনএক্স,আমি-1, একজনএক্স,0=এক্স[0]আমিএক্স

হ্যাঁ, এটি আরও ভাল। পুনরাবৃত্তির প্রয়োগ আরও সুস্পষ্ট করতে পুনরায় লেখার চেষ্টা করেছি।
জেসন আর

2
-1 যখন আমার কাছে যথেষ্ট পরিমাণে প্রতিনিধি থাকে: এতে সংখ্যাসূচক সমস্যা রয়েছে। নথ খণ্ড দেখুন। 2
জেসন এস

σμ2σ2=(এক্স2)-((এক্স))2

2
@ জেসনস: আমি একমত নই যে কৌশলটি সহজাতভাবে ত্রুটিযুক্ত, যদিও আমি আপনার বক্তব্যের সাথে একমত যে ভাসমান পয়েন্টে প্রয়োগ করার সময় এটি একটি সংখ্যাগতভাবে শক্তিশালী পদ্ধতি নয়। আমার আরও স্পষ্ট হওয়া উচিত ছিল যে আমি এটি একটি প্রয়োগে সফলভাবে ব্যবহার করেছি যা পূর্ণসংখ্যার গাণিতিক ব্যবহার করে । পূর্ণসংখ্যার (বা ভগ্নাংশের নির্দিষ্ট পয়েন্ট বাস্তবায়ন) পাটিগণিত যে সমস্যার দ্বারা চিহ্নিত করেছেন তাতে নির্ভুলতার ক্ষতি হয় না। সেই প্রসঙ্গে, এটি একটি উপযুক্ত পদ্ধতি যা প্রতি নমুনায় কম অপারেশন প্রয়োজন।
জেসন আর

3

উপরের পছন্দের উত্তরের মতো (জেসন এস), এবং নট (ভোল .২, পি ২৩২) থেকে নেওয়া সূত্র থেকেও প্রাপ্ত, কোনওটি কোনও মান প্রতিস্থাপনের জন্য একটি সূত্রও পেতে পারে, অর্থাৎ মুছে ফেলতে এবং এক ধাপে একটি মান যুক্ত করতে পারে । আমার পরীক্ষাগুলি অনুসারে, প্রতিস্থাপনটি দ্বি-পদক্ষেপ অপসারণ / সংস্করণ যুক্ত করার চেয়ে আরও ভাল নির্ভুলতা সরবরাহ করে।

নিচের কোড জাভা হয়, meanএবং sআপডেট ( "বিশ্বব্যাপী" সদস্য ভেরিয়েবল), হিসাবে একই mএবং sজেসনের পোস্টে উপরে। মানটি countউইন্ডোর আকারকে বোঝায় n

/**
 * Replaces the value {@code x} currently present in this sample with the
 * new value {@code y}. In a sliding window, {@code x} is the value that
 * drops out and {@code y} is the new value entering the window. The sample
 * count remains constant with this operation.
 * 
 * @param x
 *            the value to remove
 * @param y
 *            the value to add
 */
public void replace(double x, double y) {
    final double deltaYX = y - x;
    final double deltaX = x - mean;
    final double deltaY = y - mean;
    mean = mean + deltaYX / count;
    final double deltaYp = y - mean;
    final double countMinus1 = count - 1;
    s = s - count / countMinus1 * (deltaX * deltaX - deltaY * deltaYp) - deltaYX * deltaYp / countMinus1;
}

3

জেসন এবং নিবটের উত্তর একটি গুরুত্বপূর্ণ দিক থেকে পৃথক: জেসনের পদ্ধতিটি স্ট্যান্ড ডিভ গণনা করে পুরো সিগন্যালটির অর্থ দাঁড়ায় (যেহেতু y = 0), যখন নিবোট একটি "চলমান" গণনা, অর্থাৎ এটি ওজন থেকে সাম্প্রতিক নমুনাগুলির চেয়ে শক্তিশালী হয় সুদূর অতীত

যেহেতু অ্যাপ্লিকেশনটির জন্য স্ট্যান্ড ডিভ প্রয়োজন হয় এবং সময়ের ক্রিয়া হিসাবে এটি বোঝায় তাই নিবটের পদ্ধতি সম্ভবত আরও উপযুক্ত ((এই নির্দিষ্ট অ্যাপ্লিকেশনটির জন্য)। তবে আসল কৌতুকপূর্ণ অংশটি হ'ল সময় ওজন অংশটি সঠিকভাবে পাওয়া। নিবটের উদাহরণে একটি সাধারণ একক মেরু ফিল্টার ব্যবহার করা হয়।

[এক্স]এক্স[এন][এক্স2]এক্স[এন]2

লোপাস ফিল্টারটির পছন্দ আপনার সিগন্যাল সম্পর্কে যা জানেন এবং আপনার অনুমানের জন্য প্রয়োজনীয় সময় রেজোলিউশন দ্বারা পরিচালিত হতে পারে। লোয়ার কাটঅফ ফ্রিকোয়েন্সি এবং উচ্চতর অর্ডারের ফলে আরও ভাল নির্ভুলতা পাওয়া যাবে তবে ধীর সাড়া সময়।

জিনিসগুলিকে জটিল করতে আরও একটি ফিল্টার লিনিয়ার ডোমেন এবং অন্য স্কোয়ার ডোমেনে প্রয়োগ করা হয়। স্কোয়ারিং সিগন্যালের বর্ণালী সামগ্রীকে উল্লেখযোগ্যভাবে পরিবর্তন করে যাতে আপনি স্কোয়ার ডোমেনে একটি আলাদা ফিল্টার ব্যবহার করতে পারেন।

সময়ের ফাংশন হিসাবে কীভাবে গড়, rms এবং std dev অনুমান করা যায় তার একটি উদাহরণ এখানে।

%% example
fs = 44100; n = fs; % 44.1 kHz sample rate, 1 second
% signal: white noise plus a low frequency drift at 5 Hz)
x = randn(n,1) + sin(2*pi*(0:n-1)'*5/fs);
% mean estimation filter: since we are looking for effects in the 5 Hz range we use maybe a
% 25 Hz filter, 2nd order so it's not too sluggish
[b,a] = butter(2,25*2/fs);
xmeanEst = filter(b,a,x);
% now we estimate x^2, since most frequency double we use twice the bandwidth
[b,a] = butter(2,50*2/fs);
x2Est = filter(b,a,x.^2);
% std deviation estimate
xstd = sqrt(x2Est)-xmeanEst;
% and plot it
h = plot([x, xmeanEst sqrt(x2Est) xstd]);
grid on;
legend('x','E<x>','sqrt(E<x^2>)','Std dev');
set(h(2:4),'Linewidth',2);

1
আমার উত্তরের ফিল্টারটির সাথে মিল রয়েছে y1 = filter(a,[1 (1-a)],x);
নিবোট

1
চলমান পরিসংখ্যান এবং সামগ্রিক নমুনার পরিসংখ্যানের মধ্যে পার্থক্য সম্পর্কে ভাল পয়েন্ট। আমার বাস্তবায়ন চলমান উইন্ডোতে জড়ো হয়ে চলমান পরিসংখ্যান গণনা করতে সংশোধন করা যেতে পারে, যা দক্ষতার সাথেও করা যেতে পারে (প্রতিটি সময় পদক্ষেপে, প্রতিটি নমুনা থেকে উইন্ডো থেকে সরে যাওয়া সময়ের নমুনাটি বিয়োগ করুন)।
জেসন আর

নিবোত, দুঃখিত আপনি ঠিক বলেছেন এবং আমি ভুল ছিলাম। আমি এখনই এটি সংশোধন করব
হিলমার

1
এক্স এবং x ^ 2 এর জন্য পৃথক ফিল্টারিংয়ের পরামর্শের জন্য +1
নিবোট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.