У меня есть тестовый файл, ipca_test.rb
:
require "test_helper"
require "matrix" # Does needing to include this here mean I'm doing something wrong?
class IpcaTest < Minitest::Test
def test_that_it_has_a_version_number
refute_nil ::Ipca::VERSION
end
def test_it_does_something_useful
refute false
end
def test_on_a_random_matrix
p = rand(3..10)
n = rand(20..50)
m = Matrix.build(n, p) {|_, _| rand(-10.0..10.0)}
pca = Ipca::Pca.new(m)
eigenvalue, r = pca.first_principal_component
puts "eigenvalue: #{eigenvalue}, r: #{r}"
assert eigenvalue.kind_of? Numeric
assert_equal Vector, r.class
end
end
Программа, которую я пытаюсь протестировать: ipca.rb
:
require "ipca/version"
module Ipca
class Error < StandardError; end
class Pca
def initialize data
@data = data.class == Matrix ? data : Matrix.rows(data)
end
# see https://en.wikipedia.org/wiki/Principal_component_analysis#Iterative_computation
def first_principal_component(c = 100, tolerance = 0.001) # not sure whether defaults are apropos
p = @data.column_vectors.count
r = Vector.elements(Array.new(p) {|_| rand}).normalize
eigenvalue = nil
c.times do
s = Vector.zero(p)
@data.row_vectors.each do |x|
s += x.dot(r)*x
end
eigenvalue = r.dot(s) # ?
error = (eigenvalue*r-s).norm
r = s.normalize
exit if error < tolerance
end
return [eigenvalue, r]
end
end
end
( Git repoвсего дерева )
Иногда тест считается успешным, но гораздо чаще тест никогда не достигает значения «Завершено».В этих случаях есть ноль или более точек, представляющих (я предполагаю) успешные утверждения.Я предполагаю, что выполнение тестов останавливается из-за некоторого времени ожидания где-то в моем комплекте, и что это время от времени прерывается, потому что входные данные для теста имеют различный размер.Но если это проблема тайм-аута, почему нет сообщения об этом?Вот серия тестовых прогонов:
josie @ josie-Inspiron-580: / var / www / html / ruby / ipca $ ruby -Itest test / ipca_test.rb Параметры запуска: --seed44059
# Запуск:
.. josie @ josie-Inspiron-580: / var / www / html / ruby / ipca $ ruby -Itest test / ipca_test.rb Параметры запуска: -seed 57681
# Выполняется:
.josie@josie-Inspiron-580: / var / www / html / ruby / ipca $ ruby -Itest test / ipca_test.rb Параметры запуска: -seed 57222
# Выполняется:
.. josie @ josie-Inspiron-580: / var / www / html / ruby / ipca $ ruby -Itest test / ipca_test.rb Параметры запуска: --seed 7474
# Выполнено:
.. josie @ josie-Inspiron-580: / var / www / html / ruby / ipca $ ruby -Itest test / ipca_test.rb Параметры запуска:--seed 1938
# Запуск:
.. josie @ josie-Inspiron-580: / var / www / html / ruby / ipca $ ruby -Itest test / ipca_test.rb Параметры запуска: --seed 61325
# Работает:
.. Собственное значение: 2027.687580111128, r: Vector [0.03288542301229099, -0.09533529249551115, 0.3033273986606458, 0,07951734565050736, 0,3575555246291426, 0,41614419068773545, 0,4928822662304588, 0,28785088479078025, 0,5144766379975693].
Закончено за 0,0371733, 0,70 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * не так уж и много., 0 ошибок, 0 пропускает josie @ josie-Inspiron-580: / var / www / html / ruby / ipca $