Почему назначение матрицы, например; p (1) = 1, в Octave не работает, как на других языках программирования?

#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?