Sonsuz ortalama alma?

Başlatan Maxim, 20 Ekim 2013, 09:56:25

muhittin_kaplan

İstenilene gore sonuc ortalamasi onemli degil. Ara degerlerde onemli keza sonsuz sekilde denmis. Yani 99.999uncu degerin ortalamasida onemli

z

Birer birer artiyorsa 99999 u da soylerim. Hani algoritmayi test etmek kolay olur o yuzden.

Yoksa islemcinin yapacagi yuvarlama,kesme, tasma hatalarindan dolayi kimin algoritmasi dogru sonuc veriyor bilinemezki.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

speak48

#32
algoritmanın açılımı
o4=(a+b+c+d)/4;
o5=(o4 * 4 + e) /  5


genelleme bu ama bize hızlandırılmışı lazım o yüzden 2^nin üslerindeki değerleri ortalama alıcaz

o8=(a+b+c+d+e+f+g+h)/8;

o8=(o4 * 4 + e + f + g + h)/8;

o8=(o4 * 4)/8  + (e+f+g+h)/8;
o8= o4 /2       +  toplam2/8
ortalama8=  ortalama4 >>1  + toplam2>> log2(8 );

sonraki hesaplıyacağımız ortalama 16 32 .... 2 nin katları
işlemler integer




hasankara

#33
dediğim gibi denklem bu S[n+1]=( n*S[n]  + adc) /(n+1)

burda  n*S[n] burası belki hafızaya sığmayacak hale gelebilir bu sefer  /(n+1) işlemini paranteze dağıtırsak, n*S[n] bu işlemi yapmadan önce n veya S[n] değerlerinden birisi bölme işlemine tabi tutulur ve sonra çarpım yapılırsa sığma problemi aşılır.

S[n+1]= n*(S[n] /(n+1))  + adc /(n+1) veya
S[n+1]= S[n]*( n/(n+1))  + adc /(n+1) şeklinde

bu seferde işin içine float giriyor yani hassasiyet hesaplamaları giriyor işin içine.

mesaj birleştirme:: 20 Ekim 2013, 17:04:09

1 mhz frekansında örnekler geliyor olsun 1 saniyede 1000000 örnek demek yaklaşık 2^20, her örnek 2^12 olsun . ikisini çarparsak 2^32 yani 32 bitlik bir değişkeni 1 saniye sonunda  taşırmayı başarabiliriz. atıyorum 128kb değişken saklayabilen bir mikrodenetleyicide 32000  tane 32 bitlik değişkenlerimiz var demektir. yani tüm değişkenleri yazılımsal olarak kaskat bağlarsak 2^32000 saniye boyunca tüm değişkenleri bu iş uğrunda harcayarak taşma olmadan tüm örnekleri hesaba katabiliriz.

yani uzun lafın kısası :D değişken taşması için, değişkenleri kaskat bağlarsak 0 hesap hata payı ile bahsettiğim şartlarda örnekleri hesaba katabiliriz.

berat23

ilk kez benim yazdığım algoritma istenileni yapar, taşma gibi bir sıkıntısı da yok. tek sorun kümülatif olduğundan dolayı ortalamanın anlamsızlaşması ki zaten bu problemin doğal durumu.

1nsane

#35
Sonsuz süreli ortalama alamazsınız sıfır kayıp ile.

Sayıların toplamı / sayı adedi

İkisinide bilmek zorundasınız. Donanım olarak limitleniyorsunuz. Bir nokta gelecek ve sayıların toplamını saklayamayacaksınız. Gene aynı şekilde kaçıncı sayıda olduğunuzuda.

mesaj birleştirme:: 21 Ekim 2013, 03:39:26

Diyelimki sınırsız kaynağımız var. O zamanda şudur :

Yeni ortalama = ((O anki ortalamanız X kaçıncı sayıda olduğunuz-1) + ölçüm) / kaçıncı sayıda olduğunuz

Örneklemek gerekirse
İlk sayı 1. ((0 x 0) + 1) / 1 = 1
İkinci sayınız 2 olsun. ((1 x 1) + 2) / 2 = 1.5
Üçüncü sayınız 3 ((1.5 x 2) + 3) / 3 = 2
Dördüncü sayınız 4 ((2 x 3) + 4) / 4 = 2.5
Beşinci sayınız 5 ((2.5 x 4) + 5) / 5 = 3
...

Dediğim gibi. Önceki ortalamayı bilmek lazım. Kaçıncı sayıda olduğunuzu bilmek lazım.

RTC uygulaması ile işler kolaylaşır. Kaçıncı ölçümde olduğunuzu bilirsiniz. Dakikalık, saatlik, günlük, haftalık... ortalamaları bir değişkende saklarsınız. Yeni dakikaya geçince dakika ortalamasını güncellersiniz. Yeni saate geçince saat ortalamasını. Kolaylık sağlar.

Maxim

arkadaşlar gerçekten elinize sağlık ilgilendiniz, teşekkürler.

fakat taktir edersinizki benim kafa karıştı, ortada anlaşabildiğiniz net bir sonuç çıkmadı
hatta birçok arkadaş olmaz diyor, bazıları işte çözüm bu diyor

ben şuna inanıyorum
bir şeyi yapmabilmenin birkaç farklı yöntemi vardır hep.

yanlış anlamadıysam @z üstadın çözümüde dahil olmak üzere
bütün çözümler ağır bir hafıza yükü gerektiren formüllere dayanıyor
haklı olarak geçmiş değer ve geçmiş zamanın bir şekilde akılda tutulması gerekmekte

şöyle birşeyin olabilitesi nedir sizce?
minimum değeri biriyoruz "0", max değerimizde belli "1023" 10bit yani, yada "5.0" volt
zamanıda bilelim, ortalama almaya başladığımız an atıyorum saat 10:32:25. saniye olsun ve bunu kayıt edelim
ve rtc saymaya devam ediyor.

X-Y ekseninde hayali yatay bir çizgi düşünelim
bu çizgimiz min-max -başlangıç zamanı ve o anki zamana göre yer değiştirsin
sanki eğri uydurma formülü gibi
bu şekilde tüm değerleri bilmek yerine bu bizim çizgimizin o anda denk geldiği yer sayesinde bir sonuca varılamazmı?
bağışlayın saçmalıyorda olabilirim

sonuçta iş görecek çözümü pic üzerinde kod oluşturmam gerekecek
ben proton plus kullanıcısıyım
protonda yeni bir yardımcı ek var NBitsMath diye
gerekirse çok çok büyük sayılar ile de çalışabilirim, açıklaması şöyle

With NBitsMath you can now calculate in values from 8 to 31 bytes wide as opposed to the 4 byte width of a Dword.
Thats a maximum calculation value of: 452,312,848,583,266,388,373,324,160,190,187,140,05 1,835,877,600,158,453,279,131,187,530,910,662,655.



Tagli

O zaman sadece tamsayılarla bile çalışabilirsin kolaylıkla. Çok da fazla hafıza gerekmeyecek. 8 byte'lık bir tamsayı 2^64 = 1.84e19 civarına kadar tutabilir. Şimdi bir de en fazla nereye kadar gidebileceğimize bakalım. Saniyede 1 milyon örnek alsak ve buna 10 gün devam etsek, tüm örnekler 1024 olsa bile (aslında en fazla 1023 olur) e6*24*3600*10*1024 = 8.85e14 yapıyor. Fazlasıyla yeterli. Örnek sayısı da 8.64e11 gibi olur. Bunun için de yine 5 veya 6 byte'lık bir tamsayı tanımlamak yeterli olur. Onsan sonra ne zaman gerekirse tek bir tamsayı bölmesi ile sonuç elde edilir. Elbette bölme sonunda yine ufak bir hata olacaktır ama en azından hatada birikme olmayacağı garanti edilebilir. Bence kayar noktalı sayılar kullanımı yerine böyle bir yöntem daha iyi çünkü kayar noktalı sayılar ile hata birikmesi olabileceğini düşünüyorum.
Gökçe Tağlıoğlu

berat23

Alıntı yapılan: Maxim - 21 Ekim 2013, 08:31:36
arkadaşlar gerçekten elinize sağlık ilgilendiniz, teşekkürler.

fakat taktir edersinizki benim kafa karıştı, ortada anlaşabildiğiniz net bir sonuç çıkmadı
hatta birçok arkadaş olmaz diyor, bazıları işte çözüm bu diyor

ben şuna inanıyorum
bir şeyi yapmabilmenin birkaç farklı yöntemi vardır hep.

yanlış anlamadıysam @z üstadın çözümüde dahil olmak üzere
bütün çözümler ağır bir hafıza yükü gerektiren formüllere dayanıyor
haklı olarak geçmiş değer ve geçmiş zamanın bir şekilde akılda tutulması gerekmekte

şöyle birşeyin olabilitesi nedir sizce?
minimum değeri biriyoruz "0", max değerimizde belli "1023" 10bit yani, yada "5.0" volt
zamanıda bilelim, ortalama almaya başladığımız an atıyorum saat 10:32:25. saniye olsun ve bunu kayıt edelim
ve rtc saymaya devam ediyor.

X-Y ekseninde hayali yatay bir çizgi düşünelim
bu çizgimiz min-max -başlangıç zamanı ve o anki zamana göre yer değiştirsin
sanki eğri uydurma formülü gibi
bu şekilde tüm değerleri bilmek yerine bu bizim çizgimizin o anda denk geldiği yer sayesinde bir sonuca varılamazmı?
bağışlayın saçmalıyorda olabilirim

sonuçta iş görecek çözümü pic üzerinde kod oluşturmam gerekecek
ben proton plus kullanıcısıyım
protonda yeni bir yardımcı ek var NBitsMath diye
gerekirse çok çok büyük sayılar ile de çalışabilirim, açıklaması şöyle

With NBitsMath you can now calculate in values from 8 to 31 bytes wide as opposed to the 4 byte width of a Dword.
Thats a maximum calculation value of: 452,312,848,583,266,388,373,324,160,190,187,140,05 1,835,877,600,158,453,279,131,187,530,910,662,655.


nkere aynı şeyden bahsetmeyisevmiyorum ama mesajım arada kaynadı galiba.benim söylediğim algoritmada sadece kaçıncı örneği aldığını ve bir önce hesapladığınız ortalamayı hatırlamanız lazım. öyle devasa toplamlar çarpımlar yok,sadece belirli bir sayıdan sonra değişim büyük değilse ortalamaya katkısı olmadığından bölme kısmı anlamsızlaşıyor ki zaten bu sonsuz ortalama almanın gerçek fiziksel problemi.

ilk ortalama;
(x1+x2)/2=m1

sonraki ortalamalar;
m2= m1+(x3-m1)/(gelen_sayının_sayısı)

algoritma bu. recursive biçimde hesaplanıyor. aslında tam istediğiniz gibi zira her sayı geldiğinde ortalamayı ne kadar değiştirdiğini hesaplıyor.

Tagli

berat23, mesajını daha önce de görmüştüm. z de aynı şeyi söylüyor zaten. Ancak bu yöntemi neden sevmediğimi daha önce belirttim. Hatta söz konusu olası sorunu sen de farketmişsin zaten.
Gökçe Tağlıoğlu

berat23

tagli, o durum yöntemin sorunu değil, sonsuz ortalama almanın sorunu.

Tagli

Elbette, örnek sayısı arttıkça yeni gelen değerin etkisinin 0'a yaklaşması beklenen bir durum. Ama bir sayfa önce bir örnek vermiştim, belki gözden kaçmıştır. 100 milyon tane 2048 ardından 100 milyon tane 4096 gelse bu 200 milyon sayının ortalamasının beklendiğinin aksine 3072 olmayacağını söylemiştim. Bu aslında çok da uç bir örnek değil. Saniyede 1 milyon örnek alınabilir, bunu destekleyen PIC modelleri var. Bu durumda 2 dakika içinde sonuçlar bozulmaya başlayabilir. Elbette bu durum kullanılan kayar noktalı sayının hassasiyeti ile ilgili ve bu konuda yanılıyor olabilirim. Belki 2 dakika sonra değil 2 saat sonra sorun çıkmaya başlayacak. Ama sistemin ne kadar çalışacağını bilmiyorum. Belki 10 gün çalışması gerekecek ama 2. günden sonra sorun çıkacak ve sonraki 8 günün değerleri ortalamaya katılmayacak, bilemem.

Özetle, oldukça rahat bir şekilde tamsayılar ile çalışmak mümkünken, kayar noktalı sayıların şu ya da bu şekilde kullanılmalarını riskli buluyorum.

Sayfalardır aynı şeyleri tekrarlayıp duruyoruz, aynı şeyler farklı kişiler tarafından tekrar tekrar dile getiriliyor. Kimse zaten çok da farklı birşey söylemiyor. Korkarım bu başlığa katabileceğim daha birşey kalmadı. Artık isteyen istediği gibi çözsün.
Gökçe Tağlıoğlu

1nsane

Bu kadar hassas ortalama ne tarz bir uygulama için lazımki?

Maxim

aslinda arkadaslar cok uç noktalarda dusunuyorlar.
mesela taglinin dedigi gibi saniyede 1 milyon ornek cok uçuk.

aslinda nerede kullanirim bilmiyorum
ama bu tarz bir algoritmaya ihtiyacim oldugunu dusundum.
uzun sureli gunler surebilecek log almada, performans yada verimlilik degerlendirmelerinde kullanirim.
bir sensor verisi, sicaklik yada pwm sinyalleri olabilir.

o yuzden saniyede 50 ornek bile cok bence
saniyede 20 bile yeterli olabilir cogu zaman

muhittin_kaplan

#44
test ettim 100 derinlikli bir kayan noktalı ortalama ile neredeyse aynı değerler alınıyor.


mesaj birleştirme:: 21 Ekim 2013, 21:54:47

vb.net ile 0-1023 arası sayılar rastgele üretilerek alınmış değerlerdir.

aritmatik ortalama değerleri:

işleme alınan Değer Sayısı (Burada Ölçüm Değeri): 5737
İşleme Alınan Değerlerin Toplamı: 2 938 630
Aritmatik Ortalama: 512,2244

Kayan Noktalı Ortalama (1000 derinlikli)
işleme alınan değerler toplamı: 513950
K.N. Ortalama:513,950





mesaj birleştirme:: 21 Ekim 2013, 21:57:31

rastgele sayı üretildiğinde 1000 den birden 3 e inebiliyor. adc ölçümünde bu olay pek yaşanmayacağından kayan nokta dahada sağlam çıkacaktır.

mesaj birleştirme:: 21 Ekim 2013, 22:15:36

Alıntı yapılan: Maxim - 21 Ekim 2013, 21:11:58
aslinda arkadaslar cok uç noktalarda dusunuyorlar.
mesela taglinin dedigi gibi saniyede 1 milyon ornek cok uçuk.

aslinda nerede kullanirim bilmiyorum
ama bu tarz bir algoritmaya ihtiyacim oldugunu dusundum.
uzun sureli gunler surebilecek log almada, performans yada verimlilik degerlendirmelerinde kullanirim.
bir sensor verisi, sicaklik yada pwm sinyalleri olabilir.

o yuzden saniyede 50 ornek bile cok bence
saniyede 20 bile yeterli olabilir cogu zaman

hocam bu hesapla saate 20*60*60=72000 kayıt alacaktır.

mesaj birleştirme:: 21 Ekim 2013, 22:17:09

Hepsi 1023 olsa 1023*72000=73 656 000 gibi bir değer yapıyor. (bir saatte)

mesaj birleştirme:: 21 Ekim 2013, 22:27:40

50 000 değer ile yapılan test. üstteki aritmatik ortalama alttaki ise Kayar noktalı.