Dieses Thema ist die Methode der kleinsten Quadrate
Es ist ein wenig schwer zu verstehen, selbst wenn Sie die Problemstellung lesen, aber wenn Sie die Erklärung des Ausgabebeispiels lesen, * [Minimum square method -wikipedia](https://ja.wikipedia.org/wiki/%E6%9C%80%E5 Sie können sehen, dass% B0% 8F% E4% BA% 8C% E4% B9% 97% E6% B3% 95) * sich eine lineare Funktion mit einer Steigung von "0" vorstellt. Erstens, da der Rechenaufwand so klein wie "-100 ≤ a [i] ≤ 100" ist, kann er offen durch vollständige Suche gelöst werden.
ruby.rb
n = gets.to_i
a = gets.split.map(&:to_i)
min = Float::INFINITY
a.min.upto(a.max) do |x|
b = a.map{|y| (x - y) ** 2}.inject(:+)
min = b if min > b
end
puts min
Als nächstes kommt die mathematische Lösung. Da die lineare Funktion "y = ax + b" eine Steigung von "a = 0" hat, ist "y = b".
Eingabebeispiel 3 | a[0] | a[1] | a[2] |
---|---|---|---|
Daten | 4 | 2 | 5 |
Fehlerquadrat |
Daher kann das "b" erhalten werden, das die kumulative Summe der Quadrate der Fehler minimiert.
ruby.rb
n = gets.to_i
a = gets.split.map(&:to_i)
b = (a.inject(:+).to_f / n).round
min = a.map{|x| (x - b) ** 2}.inject(:+)
puts min
Aufzählbare Module wie Map führen sequentielle Operationen für jedes Element aus, Matrizen führen jedoch Operationen für alle Elemente gleichzeitig aus.
ruby.rb
require 'matrix'
n = gets.to_f
a = Matrix[(gets.split.map(&:to_i))]
b = (a.inject(:+) / n).round
min = a - Matrix[(Array.new(n, b))]
puts (min * min.row_vectors[0])[0]
python.py
import sys
n = int(input())
a = list(map(int, input().split()))
m = sys.maxsize
for x in range(min(a), max(a) + 1):
b = sum([(x - y) ** 2 for y in a])
if m > b:
m = b
print(m)
Es scheint, dass die Variable "min" nicht verwendet werden kann.
python.py
n = int(input())
a = list(map(int, input().split()))
b = round(sum(a) / n)
m = sum([(x - b) ** 2 for x in a])
print(m)
numpy.py
import numpy as np
n = int(input())
a = np.array([list(map(int, input().split()))], dtype = np.int32)
b = np.around(np.sum(a) / n)
m = a - b
print(int(np.sum(np.power(m, 2))))
Es ist nur eine rudimentäre Verwendung.
Ruby(Volle Suche) | Ruby(Minimum-Quadrat-Methode) | Ruby(Warteschlange) | Python(Volle Suche) | Python(Minimum-Quadrat-Methode) | Python(numpy) | |
---|---|---|---|---|---|---|
Codelänge | 169 Byte | 128 Byte | 174 Byte | 201 Byte | 122 Byte | 182 Byte |
Ausführungszeit | 10 ms | 7 ms | 17 ms | 23 ms | 18 ms | 151 ms |
Erinnerung | 1916 KB | 1788 KB | 4604 KB | 2940 KB | 2940 KB | 12396 KB |
Referenzierte Site
Recommended Posts