Nano Hash - криптовалюты, майнинг, программирование

Положительная и отрицательная ось Y шкалы Log10 в Matlab

Привет, у меня проблема: у меня есть набор данных, который колеблется от -10 ^ 3 до 10 ^ 3.

Мне нужно иметь возможность отображать это как с логарифмической шкалой, но полулогика не может отображать отрицательные значения

Скажем, например, мои данные:

x = [-3,-2,-1,0,1,2,3];
y = [-1000,-100,-10,1,10,100,1000];

(или вообще y=sign(x).*10.^abs(x);)

Как я могу построить это в MATLAB с логарифмической шкалой? Если возможно, было бы здорово, если бы деления логарифмической шкалы также располагались на оси Y.

09.01.2014

  • для log(x) x не может быть меньше 0. 09.01.2014
  • @NKN Я хорошо знаю, но я вычисляю журнал разницы между двумя переменными, которые могут варьироваться от 0 до 1000. В целом разница положительная, но мне нужно иметь возможность отображать время, когда это не так. 09.01.2014
  • если это две положительные переменные, то почему вы просто не наносите их друг на друга? 09.01.2014
  • Вы должны решить, что делать со своими значениями, чтобы все они стали положительными (добавьте к ним 10^3?). В противном случае забудьте о журнале 09.01.2014

Ответы:


1

Используйте свои фактические данные в качестве меток, но масштабируйте нанесенные данные с помощью log10.

% data
x = -3:0.1:3;
y = sign(x).*10.^abs(x);

% scaling function
scale = @(x) sign(x).*log10(abs(x));

N = 7;    % number of ticks desired

% picking of adequate values for the labels
TickMask = linspace(1,numel(y),N);
YTickLabels = y(TickMask);

% scale labels and plotdata, remove NaN ->inconsistency, do you really want that?
YTick = scale( YTickLabels );
Y = scale(y);

YTick(isnan(YTick)) = 0;
Y(isnan(Y)) = 0;

% plot
plot(x,Y)
set(gca,'YTick',YTick,'YTickLabels',YTickLabels)
grid on

Для N = 7:

введите здесь описание изображения

Для N = 11

введите здесь описание изображения


Как найти допустимое значение для N?

Следующая функция (спасибо gnovice) вернет все возможные значения, которые вы можете выбрать для N:

n = numel(x);
N = find(rem(n./(1:n), 1) == 0) + 1;

о метках в полулогическом стиле: добавив следующую строку перед сюжетом:

YTickLabels = cellfun(@(x) ['10^' num2str(x)], num2cell(YTick),'UniformOutput',false)

вы могли бы, по крайней мере, добиться чего-то вроде этого: введите здесь описание изображения начать для вас.

09.01.2014
  • Так или иначе, чтобы получить маркеры логарифмической шкалы, которые показаны полулогией? 09.01.2014
  • нет, потому что семилогия этим не занимается. Логарифм для отрицательных значений не определен (для действительных чисел). То, что вы хотите, математически непоследовательно, поэтому требуется YTick(isnan(YTick)) = 0;. 09.01.2014
  • на самом деле это как-то возможно. Первая идея, которую вы можете найти в моем последнем редактировании. 10.01.2014

  • 2

    Причина, по которой вы не можете построить логарифмическую ось, пересекающую ноль, заключается в том, что это не имеет смысла! Поскольку логарифмическая шкала обычно отображается, например, как. 100 - 10 - 1 - 1/10 - 1/100 - ..., вам потребуется бесконечное количество места, чтобы ось пересекала ноль.

    10.01.2014

    3

    Как насчет этого:

    x=logspace(-3,3);
    y=sign(x).*10.^abs(x);
    loglog(x,y)
    

    введите здесь описание изображения

    09.01.2014
  • 10^-3 не то же самое, что -10^3 10.01.2014
  • @shkristensen Я не использовал y = [-1000,-100,-10,1,10,100,1000]; Я использовал общую формулу, которую она хочет построить. и, конечно, я знаю, что 10 ^ -3 не -10 ^ 3. 10.01.2014

  • 4

    @thewaywewalk уже дал прекрасное решение. Тот, который я предлагаю, - это улучшение эпсилон. Если вы сделаете два изменения (a) Определите новую функцию MATLAB signia, которая в основном извлекает знак перед числом.

    function value = signia(x)
    if(x>=0)
        value = '';
    else
        value = '-';
    end
    

    и (б) сделать это небольшое изменение, которое вместо

    YTickLabels = cellfun(@(x) ['10^' num2str(x)], num2cell(YTick),'UniformOutput',false)
    

    ты используешь

    YTickLabels = cellfun(@(x) [signia(x) '10^{' num2str(x) '}'], num2cell(YTick),'UniformOutput',false);
    

    (обратите внимание на фигурные скобки), вы получите улучшение в отображении делений Y. Я получил следующее. введите здесь описание изображения

    20.03.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..