#matlab #octave
#matlab #octave
Вопрос:
Вот пример.
Это не работает—
m = size(X, 1); % Number of training examples
p = zeros(m, 1);
p = sigmoid(X * theta); % sigmoid returns a mx1 dimensional vector
for i = 1:m
if ( p(i) >= 0.5)
p(i) = 1; % overwrite whatever value in p(i)
endif
end
Работает следующее—
m = size(X, 1); % Number of training examples
p = zeros(m, 1);
sig = sigmoid(X * theta);
for i = 1:m
if ( sig(i) >= 0.5)
p(i) = 1;
endif
end
В первом примере приведены числа с плавающей запятой, а не 1 или 0.
Цель состоит в том, чтобы сохранить 1 в ‘p’ из m-строк для каждой записи, которая удовлетворяет условию. По логике программирования первый и второй должны давать одинаковый результат, поскольку я просто перезаписываю записи, которые соответствуют условию if, верно? Я что-то упускаю?
Комментарии:
1. Я удаляю метки
machine-learning
,neural-network
,logistic-regresion
потому что они не имеют никакого отношения к вопросу.
Ответ №1:
В вашем первом примере выполняется следующее: «вызовите sigmoid для X и замените все значения> 0.5 на 1»
m = size(X, 1);
p = zeros(m, 1);
## Here you overwrite your entire p vector do the line above has no effect
p = sigmoid(X * theta);
for i = 1:m
if ( p(i) >= 0.5)
p(i) = 1; % overwrite whatever value in p(i)
endif
end
Более простой, векторизованный способ был бы:
p = sigmoid(X * theta);
p(p>0.5) = 1;
Ваш второй пример инициализируется p
нулями и присваивает элементам значение 1, если sigmoid возвращает> 0,5. Который будет векторизован (да, действительно только одна строка …)
p = sigmoid(X * theta) >= 0.5;
Надеюсь, теперь вы понимаете свою логическую проблему
Комментарии:
1. На самом деле я пытаюсь перезаписать все содержимое p (т.Е. Нули) содержимым сигмоидальных значений. Независимо от того, что p до и после перезаписи имеет одинаковое измерение mx1. Итак, что влияет на перезапись в цикле for? Даже тогда замена каждого элемента должна дать вам тот же результат, что и во втором фрагменте кода.
2. вы не перезаписываете «каждый элемент» p в цикле for, только те, где выполняется условие in
if
.3. ОК. давайте просто скажем, что m = 5 и p = [0;0;15;20;55] ( после возвращения сигмовидной кишки). Это означает, что p (1) = 0, p (2) = 0, p (3) = 15, p (4) = 20, p (5) = 55. Теперь, используя цикл for, как указано выше, каждый элемент p, т. Е. p (i) , заменит на ‘1’, если p (i) больше 0,5. Теперь, во время цикла for , элементы p (3) p (4) и p (5) будут перезаписаныс ‘1’ таким образом, что p = [0;0;1;1;1]. Именно так я бы реализовал на других языках, таких как Python, если это массив. Не так ли?
4. Я вижу проблему с числами с плавающей запятой!
5. Я просто могу догадаться, что у вас есть какое-то базовое неправильное представление о том, как работают циклы или условные обозначения. Как вы думаете, почему Octave не будет вести себя здесь, как Python?