2017-02-18 7 views
0

У меня есть матрица X с 3 колонками. Для пористого вопроса X=randn(5,3). Я хочу нормализовать столбцы X S.T. каждая колонка будет иметь значение 0 и 1 std. Я использую следующий код:Неверные значения std и ожидаемые значения

X=(X-mean(X))./std(X); 

Я получаю зЬй из 1. Мое значение, однако, очень небольшое значение, близкое к 0, но не обязательно 0. Я пытался играть немного с числами, чтобы найти объяснение:

X=1:15; 
X=reshape(X,[5 3]); 
mean(X-mean(X)); 

Который дает мне 0 значение для каждого столбца.

X=1:15; 
X=reshape(X,[5 3]); 
mean((X-mean(X))./std(X)); 

Какой нет. Но 0/что-то еще 0. Что мне не хватает?

  • Почему я не получаю 0 значений?
  • Являются ли значения, которые я получаю достаточно для нормализации алгоритма предварительного кластеризации?
+0

Вы действительно уверены, что написали код, который используете правильно? Копирование того, что у вас есть, дает ошибку несоответствия матрицы ... Среднее значение возвращает среднее значение для каждой строки, поэтому значение «X-mean (X)» недействительно ... – Philip

+0

Проверьте, есть ли локальные файлы, реализующие 'mean' и' std'. – Rotem

+0

@Philip Я уверен в коде. Я просто копирую и вставляю для проверки. 'mean (X)' дает строку со средним значением для каждого столбца. «X-mean (X)» вычитает среднее значение каждого столбца из каждого столбца. – havakok

ответ

3

Вот версия, которая делает то, что, как я думаю, вы пытаетесь сделать ... вам нужно реплицировать матрицу, потому что X-mean (X) недействительно (если вы используете стандартную реализацию) - вы не можете вычесть 1x3 из 5x3.

r = 5; c = 3; 
X=randn(r,c); 
Xm=repmat(mean(X),r,1); 
Xstd = repmat(std(X),r,1); 
Xn = (X-Xm)./Xstd; 
mean(Xn) 
std(Xn) 

Для меня это печатает

ans = 

    1.0e-16 * 

-0.6661   0 0.4441 


ans = 

    1.0000 1.0000 1.0000 

который, кажется, как именно то, что вы ищете ... обратите внимание на 1e-16 мультипликатора на средних значениях ... это, по существу, 0, с некоторой ошибкой с плавающей запятой.

+0

Я могу и вычесть 1x3 из 5x3 (я проверил vry carfully для правильных значений). Я получаю те же значения, которые вы получаете с моим кодом. Возможно, это производная от версий версий MATLAB. В любом случае мой вопрос касался вашего комментария «по существу 0». Можете ли вы любезно рассказать о том, почему мы не получаем определенные нули? – havakok

+1

Хм, вы определенно используете нестандартную реализацию, если это сработает для вас ... в любом случае числа с плавающей запятой не являются бесконечно точными. Проверьте [здесь] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken), [здесь] (http://stackoverflow.com/questions/2100490/floating-point-inaccuracy- примеры) и [здесь] (http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate) для разработки. Или просто «арифметическая ошибка с плавающей запятой» – Philip

+0

Разница может быть связана с ожиданиями «компьютерного зрения»?Я точно знаю, что ни у кого больше никогда не было функции 'mean()' или вычитания на этом мумине. – havakok