Re: [semi-OT] "media pesata ... convergiuta" ?

From: Soviet_Mario <SovietMario_at_CCCP.MIR>
Date: Tue, 08 Nov 2016 20:13:15 +0100

Il 04/11/2016 21.58, ADPUF ha scritto:
> Soviet_Mario 21:45, mercoledì 2 novembre 2016:
>
>> Ho una domanda, probabilmente semi OT (dovrei farla su
>> matematica, ma non frequento quel NG e non mi ci voglio
>> iscrivere solo x 1 3D), ed è relativa a un tipo di media
>> pesata a pesi "auto-adattivi", che non è difficile definire
>> in modo "RICORSIVO", ma che chiederei se si possa calcolare
>> analiticamente (non so se il termine sia corretto, ma con
>> ciò intendo una formula non ricorsiva, semplicemente)
>>
>> Allora, supponiamo di avere dati da mediare, e supponiamo
>> che per qualche ragione si sappia che i dati lontani dalla
>> media, quale che sia, contengano un maggiore errore e vadano
>> sottopesati, diciamo "col senno del poi", mentre i dati
>> vicini alla media, quale che sia, contengano un minore
>> errore e vadano sovrapesati, diciamo "col senno del poi". I
>> dati in questione non sono misure fisiche per cui si possa
>> ritenere costante l'errore né casuale, diciamo, ma appunto
>> l'errore sia viziato quando i dati sono agli estremi.
>
>
> La media aritmetica minimizza lo scarto quadratico medio, ossia
> dà maggior peso (linearmente) agli scarti grandi rispetto a
> quelli piccoli.
>
> Cioè uno scarto pari a 2 "pesa" come quattro scarti pari a 1.
>
> Ma la media aritmetica è facile da calcolare, si somma e si
> divide per N (O(N)).
>
> Se vuoi un indicatore che "pesa" gli scarti lontani come quelli
> vicini puoi usare la mediana, che minimizza la somma
> degli "scarti assoluti".
>
> Però per calcolarla devi ordinare i dati, che è più faticoso
> (O(N^2) mi pare, o O(Nlog(N))?).
>
>
>> faccio un ulteriore assunto ma non so SE e QUANTO importante
>> : la distribuzione dei dati sia sufficientemente SIMMETRICA
>> rispetto alla media.
>>
>> quindi ogni dato avrà un coefficiente (normalizzato a 1),
>> che per lo step J della ricorsione avrebbe un aspetto simile
>> a alfa_n = ABS(val_n - media_j) / range_mezzi
>>
>> dove range_mezzi è il valore max.-min.
>
>
> Ma qui mi pare che il peso sia proporzionale allo scarto, non
> il contrario.
>

chiedo scusa, quando scrivevo il post non avevo ancora
buttato giù una sola riga di codice e ho tentato di intuire.
Non sono assolutamente in grado di ragionare in modo
astratto e formale. Bizzarramente quando mi metto a
ragionare in modo procedurale, a istruzioni, riesco a
risolvere spesso persino problemi che nemmeno ho capito con
precisione.
Ovviamente il codice è diverso, e a questo punto lo posto a
scanso di equivoci (mi gira come Macro di Word sotto VBA
versione 2003)
Purtroppo mi inserisce a capi automatici da rimuovere

''
-----------------------------------------------------------------------------------------------------------------------------------------
Private Function FzMediaConvergente(ByRef Valori() As
Double, ByRef Media As Double, ByVal NumIteraz As Integer,
ByRef Log As String) As Boolean
FzMediaConvergente = False
If (NumIteraz < 1) Then Exit Function
If ((UBound(Valori()) - LBound(Valori()) + 1) < 3) Then Exit
Function
Dim Iter As Integer, J As Integer
Dim AritmMedia As Double, TmpMedia As Double
Dim Denom As Double, CoeffPeso As Double, SumPesi As Double
Dim Minim As Double, Maxim As Double, MaxDistance As Double
Denom = 1# / CDbl((UBound(Valori()) - LBound(Valori()) + 1))
'' prescansione per valori estremanti
Minim = 1E+100
Maxim = -1E+100
For J = LBound(Valori()) To UBound(Valori())
     If (Valori(J) > Maxim) Then Maxim = Valori(J)
     If (Valori(J) < Minim) Then Minim = Valori(J)
Next J
AritmMedia = 0#
For Iter = 0 To NumIteraz
     If (AritmMedia = 0#) Then
         For J = LBound(Valori()) To UBound(Valori())
             AritmMedia = AritmMedia + Valori(J)
         Next J
         AritmMedia = AritmMedia * Denom
     Else
         AritmMedia = Media
     End If
     MaxDistance = Abs(Maxim - AritmMedia)
     If (Abs(AritmMedia - Minim) > MaxDistance) Then
MaxDistance = Abs(AritmMedia - Minim)
     TmpMedia = 0#
     SumPesi = 0#
     For J = LBound(Valori()) To UBound(Valori())
         CoeffPeso = 1# - Abs(Valori(J) - AritmMedia) /
MaxDistance
         SumPesi = SumPesi + CoeffPeso
         TmpMedia = TmpMedia + CoeffPeso * Valori(J)
     Next J
     Media = TmpMedia / SumPesi
     Log = Log & CStr(Media) & vbCrLf
Next Iter
FzMediaConvergente = True
End Function
''
-----------------------------------------------------------------------------------------------------------------------------------------

''
-----------------------------------------------------------------------------------------------------------------------------------------
Public Sub TryMediaConvergente()
Dim Valori(0 To 7) As Double
Valori(0) = 2.4
Valori(1) = 3.6
Valori(2) = 3.7
Valori(3) = 3.8
Valori(4) = 4.5
Valori(5) = 4.5
Valori(6) = 5.1
Valori(7) = 5.7
Dim Media As Double
Dim Geom As Double
Dim J As Integer, Log As String

If (FzMediaConvergente(Valori(), Media, 50, Log) = False)
Then Exit Sub

Geom = 1#
For J = LBound(Valori()) To UBound(Valori())
     Geom = Geom * Valori(J)
Next J
Geom = Geom ^ (1# / 8#)

Call MsgBox(Log, , "Media Convergente vs geometrica : " &
vbCrLf & CStr(Media) & " vs " & CStr(Geom))
End Sub
''
-----------------------------------------------------------------------------------------------------------------------------------------



>
>> Si possono anche trovare altri fattori di peso variabile
>> adattivo, tanto poi vengono normalizzati, ma questo mi
>> pareva tra i più lineari
>>
>> media_J+1 = sum_da_1_a_n (alfa_n * dato_n)
>>
>> (non mi ricordo se si deve dividere la sommatoria per n, ma
>> siccome i pesi alfa sono normalizzati, probabilmente no ...
>> boh ! Intuitelo :))
>>
>>
>> Ora la mia domanda sarebbe. Ammettendo di iterare
>> all'infinito, ottenendo medie ogni volta diverse, esiste
>> (si, no, sempre, talvolta, mai ...) una convergenza della
>> media ? A naso direi che deve convergere, perché anche i
>> pesi mi pare che si stabilizzerebbero, ma nn sono sicuro
>>
>> Ammesso che converga, esiste qualche formula analitica che
>> consentirebbe di calcolare questa media "convergiuta" ?
>>
>> Al momento non ho tempo di scrivere codice, ma magari prima
>> o poi proverò a computare esempi col PC.
>>
>> Nel frattempo se avete qualche idea a prescindere, ditemela.
>
>
> Penso che dipenda tutto dalla formula usata per calcolare
> il "peso".

si quella citata era assurda

alla fine funge con

CoeffPeso = 1# - Abs(Valori(J) - AritmMedia) / MaxDistance

Tuttavia i dubbi che ha espresso Giorgio Bibbiani relativi
all'opportunità di renderla più ripida o più piatta con
esponenti (o perché no, anche altre coppie di operatori
inversi) rimane.
La mia scelta è stata quella della linearità in assenza di
capire perché dovesse non andare bene, diciamo, e nel timore
che la ricorsione mi causasse effetto "interesse composto"
con esponenti non unitari.

>
> Con pesi "normali" dovrebbe convergere verso un
> valore "centrale".
>
> Ma dimostrare è difficile...

si ... più che altro mi interessava se esistesse già un
qualche tipo di media, analiticamente calcolabile in una
sola passata invece che in modo ricorsivo, equivalente.
Ma non conosco molte medie prefabbricate, ergo non saprei dire

>
>


-- 
1) Resistere, resistere, resistere.
2) Se tutti pagano le tasse, le tasse le pagano tutti
Soviet_Mario - (aka Gatto_Vizzato)
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Received on Tue Nov 08 2016 - 20:13:15 CET

This archive was generated by hypermail 2.3.0 : Fri Nov 08 2024 - 05:09:56 CET