2017-10-08 2 views
1

Ich habe 2 Arrays: das erste Array enthält Bereiche von Wohnungen und der zweite seine Preise. Die Werte von Arrays bilden ein Diagramm und werden zur Berechnung der Ergebnisse einer Kostenfunktion verwendet. Die Hauptaufgabe besteht darin, den besten Parameter der Kostenfunktion zu finden, um das Ergebnis zu minimieren. Dies ist, wie die Kostenfunktion wie folgt aussieht:Der beste Weg, um eine Rate für eine Kostenfunktion zu finden

Es wurde vorgeschlagen, eine Schleife von 1 bis 10 000 und finden Sie die besten Parameter zu schaffen, die weniger Ergebnis hat. Die Komplexität dieses Algorithmus beträgt 10 000 * Größe der Arrays.

Ich schlug eine Idee vor, Unterschiede zwischen entsprechenden Elementen der Arrays zu berechnen und Ergebnisse in ein Array zu setzen. Dann finden Sie einen Durchschnitt aller Elemente dieses Arrays. Der erhaltene Durchschnittswert ist der Parameter, der ein besseres Ergebnis für unsere Kostenfunktion liefern sollte. Der Algorithmus ist viel effizienter als der vorherige und kann genauere Ergebnisse liefern.

Ich frage mich, ob mein Algorithmus anwendbar ist oder nicht?

+1

Können Sie näher erläutern, was diese Kostenfunktion ist? Ich bin mir nicht sicher, ob ich dem folge, was du sagst. – templatetypedef

+0

Leider funktioniert der Bild-Uploader von stackoverflow nicht ...Ich schaffte es nur einen Link zur Verfügung zu stellen: http://imageshack.com/a/img924/3743/b2v2LZ.png. In dieser Funktion: m - die Länge eines Arrays; x (i) - i Element des ersten Arrays; y (i) - i Element des 2. Arrays; a - der Parameter, den ich berechnen muss; –

+0

Was sind Theta_0 und Theta_1 hier? – templatetypedef

Antwort

1

Die Kostenfunktion, die Sie vorschlagen, ist der mittlere quadratische Fehler beim Anpassen einer linearen Funktion an eine Sammlung von Datenpunkten. Dies ist ein gut untersuchtes Problem, und tatsächlich gibt es eine geschlossene Lösung, die Ihnen den mathematisch optimalen Wert von a sagt, den Sie auswählen sollten. In diesem Sinne würde ich empfehlen, nicht entweder der hier vorgeschlagenen Lösungen zu verwenden und stattdessen nur Dinge direkt zu lösen.

Die Kostenfunktion, die Sie haben, ist eine Funktion rein von der Variable a, also die Ableitung in Bezug auf a nehmend, setzendiese Ableitung auf Null, und das Lösen sollte Ihnen die optimale Wahl von a geben.

Cost (a) = (1/2 M) Σ i = 0 (ax i - y i)

Cost '(a) = (1/2m) Σ i = 0 2 (ax i - y i ) x i

Cost '(a) = (1/2 M) Σ i = 0 (2ax i - 2x i y i)

Festlegen dieser Ausdruck auf 0 gesetzt und die Vereinfachung sagt uns, dass

0 = (1/2m) Σ i = 0 (2ax i - 2x i y i)

0 = Σ i = 0 (2ax i - 2x i y i)

0 = 2a Σ i = 0 x i -2 Σ i = 0 x i y i

a Σ i = 0 x i = Σ i = 0 x i y i

a = (Σ i = 0 x i y i)/(Σ i = 0 x i)

Sie sollten in der Lage sein, diese ziemlich leicht in O zu berechnen (n) durch eine Herstellung Einfacher Durchlauf über das Array und Berechnung des Zählers und Nenners

+0

Sind Sie sicher, dass Sie das richtige Derivat bekommen haben? Ich denke, sollte wie sein Kosten '(a) = (1/2m) Σi = 0 2 (ax-y) ( –

+0

) meine 2. Lösung falsch? –

+0

@DenisEvseev Nein, das wird nicht unbedingt funktionieren. Stellen Sie sich das so vor - Sie suchen nach einem Skalierungsfaktor, um das gesamte erste Array nach oben zu skalieren. Wenn Sie das erste und das zweite Array-Element paarweise abziehen, erfahren Sie sehr wenig über den Skalierungsfaktor, den Sie benötigen. Stellen Sie sich vor, die x sind in Billionen und die y in einstelligen Zahlen. Die Unterschiede werden schwindelerregend sein, aber das a, das du willst, ist in diesem Fall winzig. – templatetypedef

Verwandte Themen