Ce thème, la méthode des moindres carrés
C'est un peu difficile à comprendre même si vous lisez la phrase du problème, mais si vous lisez l'explication de l'exemple de sortie, * [Méthode du carré minimum -wikipedia](https://ja.wikipedia.org/wiki/%E6%9C%80%E5 Vous pouvez voir que% B0% 8F% E4% BA% 8C% E4% B9% 97% E6% B3% 95) * imagine une fonction linéaire avec une pente de «0». Tout d'abord, étant donné que la quantité de calcul est petite comme «-100 ≤ a [i] ≤ 100», elle peut être résolue franchement par une recherche complète.
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
Vient ensuite la solution mathématique.
Puisque la fonction linéaire y = ax + b
a un gradient ʻa = 0, alors
y = b`.
Exemple d'entrée 3 | a[0] | a[1] | a[2] |
---|---|---|---|
Les données | 4 | 2 | 5 |
Carré d'erreur |
Par conséquent, le «b» qui minimise la somme cumulée des carrés des erreurs peut être obtenu.
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
Des modules énumérables tels que map effectuent des opérations séquentielles sur chaque élément, mais les matrices effectuent des opérations sur tous les éléments à la fois.
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)
Il semble que la variable «min» ne puisse pas être utilisée.
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))))
Ce n'est qu'un usage rudimentaire.
Ruby(Recherche complète) | Ruby(Méthode du carré minimum) | Ruby(queue) | Python(Recherche complète) | Python(Méthode du carré minimum) | Python(numpy) | |
---|---|---|---|---|---|---|
Longueur du code | 169 Byte | 128 Byte | 174 Byte | 201 Byte | 122 Byte | 182 Byte |
Temps d'exécution | 10 ms | 7 ms | 17 ms | 23 ms | 18 ms | 151 ms |
Mémoire | 1916 KB | 1788 KB | 4604 KB | 2940 KB | 2940 KB | 12396 KB |
Site référencé
Recommended Posts