Genera la distribuzione della quantità di oggetti per raggiungere l'obiettivo per ciascun attributo

4

Il problema

Supponiamo di avere un elenco di oggetti di lunghezza variabile contenente una lista a lunghezza fissa di numeri decimali positivi come attributi.

Esempio JSON

[
    {a: 0.1, b: 0.6, c: 0.0},
    {a: 1.0, b: 1.3, c: 0.2},
    {a: 1.2, b: 0.1, c: 0.3},
    {a: 0.2, b: 0.2, c: 0.5},
    {a: 0.8, b: 0.2, c: 0.6}
]

Crea una distribuzione di quantità per moltiplicare ciascuno degli attributi degli oggetti per rendere il prodotto di somma di tutti gli oggetti moltiplicato per la distribuzione equivale a 1 . Voglio utilizzare il minor numero possibile di oggetti per creare il totale, piuttosto che usare piccole quantità di ogni oggetto.

Se la distribuzione era [1, 1, 1, 1, 1] , il risultato sarebbe {a: 3.3, b: 2.4, c: 1.6} perché dovremmo semplicemente sommare ciascuno degli attributi poiché sono tutti moltiplicati per 1 .

Una soluzione

Una distribuzione perfetta in questo caso sarebbe [0, 0.5, 0, 1.5, 0.25] che produce {a: 1, b: 1, c: 1} .

Creazione di un algoritmo

Voglio creare un algoritmo che risolva questo numero per insiemi di dati molto più grandi con più attributi.

Primo tentativo

Il mio primo tentativo era di iniziare con un valore arbitrario e aggiungere abbastanza per portare solo un attributo a 1 . Quindi trova la corrispondenza più vicina per gli attributi mancanti. A questo punto vorrei sottrarre dalle quantità per consentire che la nuova quantità venisse aggiunta senza superare il 1 in qualsiasi categoria. Scegliere le giuste quantità per abbassare era difficile.

Secondo tentativo (rimozione del limite)

Ho quindi pensato di rimuovere il limite di 1 e di fare in modo che l'algoritmo si fermasse quando tutti i prodotti di somma erano relativamente uguali. In questo modo aumentando la quantità di uno diminuisce la quantità relativa di tutti gli altri. Speriamo di eliminare i cattivi valori, facendo in modo che abbiano poco significato sul risultato finale. Probabilmente avrei bisogno di un valore di cutoff per assicurarmi di non finire con un po 'di tutto.

Nel nostro esempio, ho trovato che la distribuzione [0, 2, 0, 6, 1] ha dato come risultato {a: 4, b: 4, c: 4} . Dividendo la distribuzione per 4 , ho ottenuto una distribuzione perfetta di [0, 0.5, 0, 1.5, 0.25] .

Altre soluzioni e amp; Miglioramenti

Sto cercando suggerimenti per miglioramenti, preoccupazioni o soluzioni alternative a questo problema. Ci sono problemi correlati in modo da poter fare più ricerche su potenziali soluzioni?

    
posta Evan Kennedy 13.01.2016 - 21:21
fonte

1 risposta

1

(Algoritmo suggerimento)

L'esempio che hai postato sembra equivalente alla soluzione del seguente sistema lineare, con 2 variabili libere nelle soluzioni, ad esempio, utilizzando l'eliminazione gaussiana:

0.1 v + 1.0 w + 1.2 x + 0.2 y + 0.8 z = 1.0 (for vector "a")
0.6 v + 1.3 w + 0.1 x + 0.2 y + 0.2 z = 1.0 (for vector "b")
0.0 v + 0.2 w + 0.3 x + 0.5 y + 0.6 z = 1.0 (for vector "c")

Ci saranno 2 variabili libere e 3 fisse per un'infinità di soluzioni in generale, perché si tratta di un sistema sotto-specificato di 5 incognite che appaiono solo in 3 equazioni.

Ci sono risposte su Math Overflow per un sistema simile in cui n (numero di incognite) è maggiore di m (il numero di equazioni).

Rilevante anche: Modulo Trasformazione su riga Echelon

'HTH,

    
risposta data 01.10.2016 - 07:05
fonte

Leggi altre domande sui tag