Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 105761 сообщений
Cообщения с меткой

математика - Самое интересное в блогах

Следующие 30  »
rss_knitting_club

Золотое сечение

Суббота, 25 Марта 2017 г. 15:19 (ссылка)

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

http://feedproxy.google.com/~r/KnittingClub/~3/MdVC5uqspGI/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Veta_160

Математика - это нескучно

Суббота, 25 Марта 2017 г. 19:41 (ссылка)


Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Запуск проекта Нерепетитор

Пятница, 24 Марта 2017 г. 20:16 (ссылка)

Некоторое время назад мы открыли пилот математической онлайн-школы Нерепетитор, основанной на идее «динамических» курсов. Их формат отличается от традиционных МООС тем, что для каждой выбранной темы предлагается «минимальная обучающая траектория», т.е. путь обучения, начинающийся с азов, и содержащий самое необходимое. Подробно об этой идее, с теоретической точки зрения, написано в предыдущей статье. Теперь практическая (немного упрощенная) реализация опубликована, и ей можно пользоваться (весь контент бесплатный).



Курсы имеют две особенности:


  1. По выбранной теме вы получаете минимальный курс, собранный из «квантов обучения»: коротких текстовых фрагментов, видеороликов и расчетов, слабо связанных между собой.

  2. Акцент на практику: почти для каждой темы есть лабораторная работа, подготовленная в математическом редакторе Mathcad или Mathcad Express.



Соответственно, для более эффективного обучения желательно иметь на компьютере программу Mathcad. В некоторых темах используются старые версии Mathcad (2000/2001/11...15), а в некоторых — новый Mathcad Prime, бесплатную версию которого Mathcad Express можно загрузить с сайта разработчика. В частности, редактора Mathcad Express достаточно для тем школьной алгебры, учебник по которой можно также скачать целиком.



Таким образом, для того чтобы открыть нужный курс:


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

  2. После того, как название темы из оглавления возникнет в верхнем текстовом поле, нажмите кнопку Показать курс.







Простите нам несколько недоработок. Во-первых, вас может смутить, что, единожды выбранный флажок нельзя снять, но это сделано нарочно: в будущем, мы надеемся, что можно будет собирать составные курсы из нескольких выбранных тем. Пока этой возможности нет, и выбирается та тема, флажок возле которой выбран последним. Во-вторых, пока не работает ввод темы с клавиатуры. В-третьих, указать можно единственное средство обучения – Mathcad. В-четвертых, тех тем, которые отмечены звездочкой, пока просто нет. Если проект будет развиваться дальше, все это появится.



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







Все материалы лабораторных работ есть, как в формате Mathcad, так и в PDF (чтобы можно было смотреть их без установки Mathcad, но в этом случае, «живых расчетов», т.е. интерактивности, конечно, не будет).







Пример использования динамических курсов и Mathcad Express для обучения — в коротком ролике.






Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/324816/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
judiczek

Считаем от 1 до 10. Точка за точкой

Пятница, 24 Марта 2017 г. 15:17 (ссылка)

Это цитата сообщения Ksu11111 Оригинальное сообщение

Считаем от 1 до 10. Точка за точкой








1.

01-rvVosYXFc4E (494x700, 184Kb)



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Алексей_Козырев

Поля пшеничные... чудесных макарон

Пятница, 24 Марта 2017 г. 13:23 (ссылка)

Признаться, задачка в учебнике по математике для 2 класса, одобренном МинОбразом, поставила меня вечером в тупик...

Но сёдни пятница, так что предлагаю "Поставить вопрос и решить задачу" (последнее задание)

Потом-то я этот отрывок во "Врунгеле" нашел, но, не зная истории, хрен чо там сформулируешь Бедные дети А кому щас легко?



Метки:   Комментарии (1)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Предсказываем будущее с помощью библиотеки Facebook Prophet

Четверг, 23 Марта 2017 г. 14:01 (ссылка)



Прогнозирование временных рядов — это достаточно популярная аналитическая задача. Прогнозы используются, например, для понимания, сколько серверов понадобится online-сервису через год, каков будет спрос на каждый товар в гипермаркете, или для постановки целей и оценки работы команды (для этого можно построить baseline прогноз и сравнить фактическое значение с прогнозируемым).



Существует большое количество различных подходов для прогнозирования временных рядов, такие как ARIMA, ARCH, регрессионные модели, нейронные сети и т.д.



Сегодня же мы познакомимся с библиотекой для прогнозирования временных рядов Facebook Prophet (в переводе с английского, "пророк", выпущена в open-source 23-го февраля 2017 года), а также попробуем в жизненной задаче – прогнозировании числа постов на Хабрехабре.





Библиотека



Согласно статье Facebook Prophet, был разработан для прогнозирования большого числа различных бизнес-показателей и строит достаточно хорошие default'ные прогнозы. Кроме того, библиотека дает возможность, изменяя человеко-понятные параметры, улучшать прогноз и не требует от аналитиков глубоких знаний устройства предсказательных моделей.



Давайте немного обсудим, как же работает библиотека Prophet. По сути, это additive regression model, состоящая из следующих компонент:



$y(t) = g(t) + s(t) + h(t) + \epsilon_{t}$




  1. Сезонные компоненты $s(t)$ отвечают за моделирование периодических изменений, связанных с недельной и годовой сезонностью. Недельная сезонность моделируется с помощью dummy variables. Добавляются 6 дополнительных признаков, например, [monday, tuesday, wednesday, thursday, friday, saturday], которые принимают значения 0 и 1 в зависимости от даты. Признак sunday, соответствующий седьмому дню недели, не добавляют, потому что он будут линейно зависеть от других дней недели и это будет влиять на модель.

    Годовая же сезонность моделируется рядами Фурье.

  2. Тренд $g(t)$ — это кусочно-линейная или логистическая функция. С линейной функцией все понятно. Логистическая же функция вида $g(t) = \frac{C}{1+exp(-k(t-b))}$ позволяет моделировать рост с насыщением, когда при увеличении показателя снижается темп его роста. Типичный пример — это рост аудитории приложения или сайта.

    Кроме всего прочего, библиотека умеет по историческим данным выбирать оптимальные точки изменения тренда. Но их также можно задать и вручную (например, если известны даты релизов новой функциональности, которые сильно повлияли на ключевые показатели).

  3. Компонента $h(t)$ отвечает за заданные пользователем аномальные дни, в том числе и нерегулярные, такие как, например, Black Fridays.

  4. Ошибка $\epsilon_{t}$ содержит информацию, которая не учтена моделью.



Подробнее про алгоритмы можно прочитать в публикации Sean J. Taylor, Benjamin Letham "Forecasting at scale".



В этой же публикации представлено и сравнение mean absolute percentage error для различных методов автоматического прогнозирования временных рядов, согласно которому Prophet имеет существенно более низкую ошибку.





Давайте сначала разберемся, как оценивается качество моделей в статье, а затем перейдем к алгоритмам, с которыми сравнивали Prophet.



MAPE (mean absolute percentage error) — это средняя абсолютная ошибка нашего прогноза. Пусть $y_{i}$ — это показатель, а $\hat{y_{i}}$ — это соответствущий этой величине прогноз нашей модели. Тогда $e_{i} = y_{i} - \hat{y_{i}}$ — это ошибка прогноза, a $p_{i} =\frac{e_{i}}{y_{i}}$ — это относительная ошибка прогноза.



$MAPE = mean(|p_{i}|)$



MAPE часто используется для оценки качества, поскольку эта величина относительная и по ней можно сравнивать качество даже на различных наборах данных.



Кроме того, бывает полезно смотреть и на абсолютную ошибку MAE - mean average error, чтобы понимать, на сколько ошибается модель в абсолютных величинах.



$MAE = mean(|e_{i}|)$



Cтоит сказать пару слов о тех алгоритмах, с которыми сравнивали Prophet в публикации, тем более, большинство из них очень простые и их часто используют как baseline:




  • naive — наивный прогноз, когда мы прогнозируем все последующие значения последней точкой;

  • snaive - seasonal naive — такой прогноз подходит для данных с явно выраженной сезонностью. Например, если мы говорим о показатели с недельной сезонностью, то для каждого последующего понедельника мы будем брать значение за последний понедельник, для вторника — за последний вторник и так далее;

  • mean — в качестве прогноза берется среднее значение показателя;

  • arima - autoregressive integrated moving average — подробности на wiki;

  • ets - exponential smoothing — подробности на wiki.



Практика



Установка



Для начала необходимо установить библиотеку. Библиотека Prophet доступна для python и R. Я предпочитаю python, поэтому использовала именно его. Для python библиотека ставится с помощью PyPi следующим образом:



pip install fbprophet


Под R у библиотеки есть CRAN package. Подробные инструкции по установке можно найти в документации.



Данные



В качестве показателя для предсказания я выбрала количество постов, опубликованных на Хабрахабре. Данные я взяла из учебного конкурса на Kaggle "Прогноз популярности статьи на Хабре". Тут рассказано подробнее о соревновании и курсе машинного обучения, в рамках которого оно проводится.



Код для предобработки данных
import pandas as pd

habr_df = pd.read_csv('howpop_train.csv')
habr_df['published'] = pd.to_datetime(habr_df.published)
habr_df = habr_df[['published', 'url']]

aggr_habr_df = habr_df.groupby('published')[['url']].count()
aggr_habr_df.columns = ['posts']

aggr_habr_df = aggr_habr_df.resample('D').apply(sum)


Для начала посмотрим на данные и построим time series plot за весь период. На таком длинном периоде удобнее смотреть на недельные точки.



Для визуализации я как обычно буду использовать библиотеку plot.ly, которая позволяет строить в python интерактивные графики. Подробнее про нее и визуализацию в целом можно почитать в статье Открытый курс машинного обучения. Тема 2: Визуализация данных c Python.



Код для визуализации
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
from plotly import graph_objs as go

# инициализируем plotly
init_notebook_mode(connected = True)

# опишем функцию, которая будет визуализировать все колонки dataframe в виде line plot
def plotly_df(df, title = ''):
data = []

for column in df.columns:
trace = go.Scatter(
x = df.index,
y = df[column],
mode = 'lines',
name = column
)
data.append(trace)

layout = dict(title = title)
fig = dict(data = data, layout = layout)
iplot(fig, show_link=False)

plotly_df(aggr_habr_df.resample('W').apply(sum), title = 'Опубликованные посты на Хабрахабре')




Построение прогноза



Библиотека Prophet имеет интерфейс похожий на sklearn, сначала мы создаем модель, затем вызываем у нее метод fit и затем получаем прогноз. На вход методу fit библиотека принимает dataframe с двумя колонками:




  • ds — время, поле должно быть типа date или datetime,

  • y — числовой показатель, который мы хотим предсказывать.



Для того чтобы измерить качество полученного прогноза, уберем из обучения последний месяц данных и будем предсказывать его. Создатели советуют делать предсказания по нескольким месяцам данных, в идеале – год и более (в нашем случае есть несколько лет истории для обучения).



#импортируем библиотеку
from fbprophet import Prophet

predictions = 30

# приводим dataframe к нужному формату
df = aggr_habr_df.reset_index()
df.columns = ['ds', 'y']

# отрезаем из обучающей выборки последние 30 точек, чтобы измерить на них качество
train_df = df[:-predictions]


Далее создаем объект класса Prophet (все параметры модели задаются в конструкторе класса, для начала возьмем default'ные параметры) и обучаем его.



m = Prophet()
m.fit(train_df)


С помощью вспомогательной функции Prophet.make_future_dataframe создаем dataframe, который содержит все исторические временные точки и еще 30 дней, для которых мы хотели построить прогноз.



Для того, чтобы построить прогноз вызываем у модели функцию predict и передаем в нее полученный на предыдущем шаге dataframe future.



future = m.make_future_dataframe(periods=predictions)
forecast = m.predict(future)


В библиотеке Prophet есть встроенные средства визуализации, которые позволяют оценить результат построенной модели.



Во-первых, метод Prophet.plot отображает прогноз. Честно говоря, в данном случае такая визуализация не очень показательна. Основной вывод из этого графика, который я сделала — в данных много outlier'ов. Однако если при прогнозировании будет меньше исторических точек, то по ней можно будет что-нибудь понять.



m.plot(forecast)




Вторая функция Prophet.plot_components, на мой взгляд, гораздо более полезная. Она позволяет посмотреть отдельно на компоненты: тренд, годовую и недельную сезонность. Если при построении модели были заданы аномальные дни/праздники, то они также будут отображаться на этом графике.



m.plot_components(forecast)




На графике видно, что Prophet хорошо хорошо подстроился под рост числа постов "ступенькой" в начале 2015-го. По недельной сезонности можно сделать вывод, что меньше постов приходится на воскресенье и понедельник. На графике годовой сезонности ярче всего выделяется провал активности в Новогодние каникулы, также виден спад и на майских праздниках.



Оценка качества модели



Давайте оценим качество алгоритма и посчитаем MAPE для последних 30 дней, которые мы предсказывали. Для расчета нам нужны наблюдения $y_{i}$ и прогнозы для них $ \hat{y_{i}}$.



Для начала посмотрим на объект forecast, который генерирует библиотека. На самом деле это dataframe, в котором есть вся необходимая нам информация для прогноза.



print(', '.join(forecast.columns))


ds, t, trend, seasonal_lower, seasonal_upper, trend_lower, trend_upper, yhat_lower, yhat_upper, weekly, weekly_lower, weekly_upper, yearly, yearly_lower, yearly_upper, seasonal, yhat


Прежде чем продолжить, нам нужно объединить forecast с нашими исходными наблюдениями.



cmp_df = forecast.set_index('ds')[['yhat', 'yhat_lower', 'yhat_upper']].join(df.set_index('ds'))


Напомню, что мы изначально отложили данные за последний месяц, чтобы построить прогноз на 30 дней и измерить качество получившейся модели.



import numpy as np
cmp_df['e'] = cmp_df['y'] - cmp_df['yhat']
cmp_df['p'] = 100*cmp_df['e']/cmp_df['y']
print 'MAPE', np.mean(abs(cmp_df[-predictions:]['p']))
print 'MAE', np.mean(abs(cmp_df[-predictions:]['e']))


В результате мы получили качество около 37.35%, а в среднем в прогнозе модель ошибается на 10.62 поста.



Визуализация



Давайте сделаем свою визуализацию построенной Prophet модели: с фактическими значениями, прогнозом и доверительными интервалами.



Во-первых, я хочу оставить данные за меньший период, чтобы они не превращались в месиво точек. Во-вторых, хочется показывать результаты модели только за тот период, на котором мы делали предсказание — мне кажется, так график будет более читаемым. В-третьих, сделаем график интерактивным с помощью plot.ly.



Код для визуализации

# функция для визуализации построенного прогноза
def show_forecast(cmp_df, num_predictions, num_values):
# верхняя граница доверительного интервала прогноза
upper_bound = go.Scatter(
name='Upper Bound',
x=cmp_df.tail(num_predictions).index,
y=cmp_df.tail(num_predictions).yhat_upper,
mode='lines',
marker=dict(color="444"),
line=dict(width=0),
fillcolor='rgba(68, 68, 68, 0.3)',
fill='tonexty')

# прогноз
forecast = go.Scatter(
name='Prediction',
x=cmp_df.tail(predictions).index,
y=cmp_df.tail(predictions).yhat,
mode='lines',
line=dict(color='rgb(31, 119, 180)'),
)

# нижняя граница доверительного интервала
lower_bound = go.Scatter(
name='Lower Bound',
x=cmp_df.tail(num_predictions).index,
y=cmp_df.tail(num_predictions).yhat_lower,
marker=dict(color="444"),
line=dict(width=0),
mode='lines')

# фактические значения
fact = go.Scatter(
name='Fact',
x=cmp_df.tail(num_values).index,
y=cmp_df.tail(num_values).y,
marker=dict(color="red"),
mode='lines',
)

# последовательность рядов в данном случае важна из-за применения заливки
data = [lower_bound, upper_bound, forecast, fact]

layout = go.Layout(
yaxis=dict(title='Посты'),
title='Опубликованные посты на Хабрахабре',
showlegend = False)

fig = go.Figure(data=data, layout=layout)
iplot(fig, show_link=False)

show_forecast(cmp_df, predictions, 200)


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





Визуально прогноз модели, кажется достаточно хорошим и разумным. Скорее всего такая низкая оценка качества объясняется аномальным высоким количеством постов 13 и 17 октября и снижением активности с 7 октября.

Также по графику можно сделать вывод, что большинство точек лежат внутри доверительного интервала.



Сравнение с ARIMA моделью



На глаз прогноз получился вполне разумным, но давайте сравним его с классической моделью SARIMA - Seasonal autoregressive integrated moving average с недельным периодом.



На Хабрахабре уже есть несколько статей про ARIMA-модели, всем интересующимся советую почитать их: Построение модели SARIMA с помощью Python+R и Анализ временных рядов с помощью python.



Для построения прогноза я также вдохновлялась учебными материалами курса Прикладные задачи анализа данных на Сoursera, в котором подробно описаны ARIMA-модели и как их строить на python.



Стоит отметить, что построение ARIMA модели требует гораздо больших затрат по сравнению с Prophet: нужно исследовать исходный ряд, привести его к стационарному, подобрать начальные приближения и потратить немало времени на подбор гипер-параметров алгоритма (на моем компьютере модель подбиралась почти 2 часа).



Но в данном случае усилия были не напрасны и предсказание SARIMA получилось более точным: MAPE=16.54%, MAE=7.28 поста. Лучшая модель с параметрами: D=1, d=1, Q=1, q=4, P=1, p=3.





Но и Prophet, конечно же, можно еще потюнить. Например, если предсказывать в этой библиотеке не исходный ряд, а после преобразования Бокса-Кокса, нормализующего дисперсию ряда, то мы получим прирост качества: MAPE=26.79%, MAE=8.49 поста.



Код для прогноза ряда с преобразованием Бокса-Кокса
from scipy import stats
import statsmodels.api as sm

def invboxcox(y,lmbda):
if lmbda == 0:
return(np.exp(y))
else:
return(np.exp(np.log(lmbda*y+1)/lmbda))

train_df2 = train_df.copy().fillna(14)
train_df2 = train_df2.set_index('ds')
train_df2['y'], lmbda_prophet = stats.boxcox(train_df2['y'])

train_df2.reset_index(inplace=True)

m2 = Prophet()
m2.fit(train_df2)
future2 = m2.make_future_dataframe(periods=30)

forecast2 = m2.predict(future2)
forecast2['yhat'] = invboxcox(forecast2.yhat, lmbda_prophet)
forecast2['yhat_lower'] = invboxcox(forecast2.yhat_lower, lmbda_prophet)
forecast2['yhat_upper'] = invboxcox(forecast2.yhat_upper, lmbda_prophet)

cmp_df2 = forecast2.set_index('ds')[['yhat', 'yhat_lower', 'yhat_upper']].join(df.set_index('ds'))

cmp_df2['e'] = cmp_df2['y'] - cmp_df2['yhat']
cmp_df2['p'] = 100*cmp_df2['e']/cmp_df2['y']
np.mean(abs(cmp_df2[-predictions:]['p'])), np.mean(abs(cmp_df2[-predictions:]['e']))


Итог



Мы познакомились с open-source библиотекой Prophet и ее использованием для предсказания временных рядов на практике.

Я бы не стала говорить, что эта библиотека творит чудеса и идеально предсказывает будущее. В нашем случае прогноз получился хуже стандартной SARIMA. Однако, библиотека Prophet достаточно удобная, легко кастомизируется (чего только стоит возможность добавления заранее известных аномальных дней), поэтому ее полезно иметь в своем аналитическом toolbox'e.



Полезные ссылки



Немного материалов для более глубокого изучения библиотеки Prophet и предсказаний временных рядов, в общем:




Original source: habrahabr.ru.

https://habrahabr.ru/post/323730/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Считаем до трёх: два

Среда, 23 Марта 2017 г. 02:42 (ссылка)

Троичные вычисления





Итак, продолжаю цикл статей о разработке троичного вычислителя. В прошлый раз мы познакомились с самым базовым элементом: троичным (де-)мультиплексором, а также на его базе построили полу- и полный сумматор. В этот раз речь пойдёт о ячейках памяти.



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



Итак, вот список опубликованных статей цикла (будет обновляться):







Напоминаю, что единственным строительным блоком вычислителя будет троичный мультиплексор. Вот фотография оригинального тримукса дизайна Александра Шабаршина и моего исполнения на поверхностном монтаже. Одна такая плата несёт на себе два троичных (де-)мультиплексора:











Мой вариант тримукса для поверхностного монтажа задумывался для относительно лёгкого воспроизведения «на коленке»: плата хоть и двухсторонняя, но содержит всего 12 переходных отверстий. К слову сказать, на форуме nedopc.org пробегал вариант для сквозного монтажа без единого переходного отверстия:







Впрочем, он по-прежнему требует сверлить отверстия для выводов микросхем, так что мой вариант экономичнее :)



trimuxIO





Моя цель — не теоретизирование, но постройка вполне осязаемой железки. На данный момент я обзавёлся некоторым количеством мультиплексоров, которые испытываю на макетках. В прошлый раз все входы испытываемых схем из себя представляли джамперы на макетках, а выходы набор светодидов на той же самой макетке. Это довольно неудобно (особенно перетыкать входы), поэтому я усмотрел у Александра примерно такой дизайн одного входа-выхода:







Каждый вход-выход несёт на себе один трёхпозиционный переключатель, который по умолчанию (среднее положение) слегка подтянут к 0V. Если пин используется для индикации выхода тримукса, то переключатель должен быть оставлен в среднем положении, и тогда тримукс перетянет слабую подтяжку к 0V. Эмиттерный повторитель обеспечивает надёжную индикацию даже самых слабых сигналов.



Если же пин нужно использовать на вход, то переключатель может быть подключен либо к +5V, либо к -5V. Резистор на 150Ohm защищает схему от короткого замыкания.



Тест-плата входов-выходов несёт на себе 9 абсолютно одинаковых схем:







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







Здесь три входа: C, A, B и один выход Q.



Статическая ячейка памяти (троичный триггер с запоминанием по уровню)





Давайте подключим два мультиплексора (напоминаю, они влезают на одну платку тримукса) следующим образом:







Давайте договоримся о терминологии: тактируемые триггеры делятся на управляемые уровнем и управляемые фронтом. Сейчас мы говорим об управлении уровнем, а это означает, что при одном уровне тактового сигнала C (-1 или 1) триггер воспринимает входные сигналы (A или B, соответственно), а при другом (0) не воспринимает и остаётся в неизменном положении.

Наша схема представляет собой два мультиплексора, второй мультиплексор представляет собой просто прозрачный буфер, а первый (в зависимости от тактового сигнала C) выдаёт на вход второго либо А, либо B, либо сам выход буфера! Это означает следующее поведение: при C=-1 выход Q замыкается на вход A, при C=1 выход Q замыкается на вход B, а при C=0 выход Q поддерживается постоянным и входы A и B просто игнорируются. В тексте это может быть сумбурно, поэтому посмотрите следующее видео:









Динамическая ячейка памяти: троичный триггер с управлением фронтом





В отличие от управления уровнем, при управлении фронтом разрешение на переключение триггера даётся только в момент перепада тактового сигнала. В остальное время независимо от уровня тактового сигнала триггер не воспринимает входные сигналы и остаётся в неизменном состоянии.



Экскурс в хорошо изученную область



Давайте на минутку совершим путешествие в двоичный (бррр) мир, чтобы было чуть понятнее. В русскоязычной литературе ко всем подобным схемам применяется слово «триггер» (поправьте меня, я маску-то только нашёл). Двоичный триггер с управлением по уровню называется gated D-latch. Грубо говоря, у него есть два входа: D (данные) и E (enable). Единственный выход Q равен D если E=1, и сохраняет своё значение если E=0.







Триггер со срабатыванием по уровню (flip-flop) может быть построен из двух обычных защёлкок (gated D-latch) и одного инвертера:







Эта схема называется Master-slave edge-triggered D flip-flop.



Назад в троичный мир или терра (почти) инкогнита





Если мы хотим получить срабатывание по фронту тактирующего сигнала, мы точно так же, как и в двоичном мире, можем использовать две троичные защёлки и один эквивалент двоичного инвертера, как на этой схеме:







Наша динамическая ячейка памяти имеет два входа: C и Am; она имеет один выход Qs. В двоичном мире инвертер генерирует второй сигнал со сдвинутой фазой, который тактирует ведомую защёлку. В нашей троичной схеме тактирующий сигнал расщепляется на два: min(C,0) и max(C,0), каждый из которых тактирует свою защёлку. Для того, чтобы сигнал Am дошёл до выхода Qs, нам необходимо подряд два восходящих фронта на сигнале C:







Обратите внимание, что сразу после включения схемы до того, как сигнал С заметёт от минус единицы до единицы, выходной сигнал Qs имеет неопределённое значение. Инициализируйте свои переменные :)

К слову, обратите внимание, что и у ведущей, и у ведомой защёлок один из входов не используется. Это можно применить для быстрой инициализации памяти, но об этом в следующий раз.



Вот соответствующиее видео работы ячейки памяти с динамическим управлением:









Заключение





Мы рассмотрели два варианта ячеек памяти. Ячейка памяти с динамическим управлением — это основной элемент троичного счётчика, который мы рассмотрим в следующий раз. Потом поговорим про АЛУ и тому подобное. Разумеется, получить даже один килотрит памяти подобным образом — весьма затратное (если делать «на коленке») занятие, но поскольку у меня железяка будет предназначена для демонстрационных целей и с гораздо меньшим количеством памяти, то это не так и страшно.



Enjoy!
Original source: habrahabr.ru.

https://habrahabr.ru/post/324650/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Считаем до трёх: два

Среда, 23 Марта 2017 г. 02:42 (ссылка)

Троичные вычисления





Итак, продолжаю цикл статей о разработке троичного вычислителя. В прошлый раз мы познакомились с самым базовым элементом: троичным (де-)мультиплексором, а также на его базе построили полу- и полный сумматор. В этот раз речь пойдёт о ячейках памяти.



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



Итак, вот список опубликованных статей цикла (будет обновляться):







Напоминаю, что единственным строительным блоком вычислителя будет троичный мультиплексор. Вот фотография оригинального тримукса дизайна Александра Шабаршина и моего исполнения на поверхностном монтаже. Одна такая плата несёт на себе два троичных (де-)мультиплексора:











trimuxIO





Моя цель — не теоретизирование, но постройка вполне осязаемой железки. На данный момент я обзавёлся некоторым количеством мультиплексоров, которые испытываю на макетках. В прошлый раз все входы испытываемых схем из себя представляли джамперы на макетках, а выходы набор светодидов на той же самой макетке. Это довольно неудобно (особенно перетыкать входы), поэтому я усмотрел у Александра примерно такой дизайн одного входа-выхода:







Каждый вход-выход несёт на себе один трёхпозиционный переключатель, который по умолчанию (среднее положение) слегка подтянут к 0V. Если пин используется для индикации выхода тримукса, то переключатель должен быть оставлен в среднем положении, и тогда тримукс перетянет слабую подтяжку к 0V. Эмиттерный повторитель обеспечивает надёжную индикацию даже самых слабых сигналов.



Если же пин нужно использовать на вход, то переключатель может быть подключен либо к +5V, либо к -5V. Резистор на 150Ohm защищает схему от короткого замыкания.



Тест-плата входов-выходов несёт на себе 9 абсолютно одинаковых схем:







А вот так плата входа-выхода может быть подключена для тестирования, например, статической ячейки памяти:







Здесь три входа: C, A, B и один выход Q.



Статическая ячейка памяти (троичный триггер с запоминанием по уровню)





Давайте подключим два мультиплексора (напоминаю, они влезают на одну платку тримукса) следующим образом:







Давайте договоримся о терминологии: тактируемые триггеры делятся на управляемые уровнем и управляемые фронтом. Сейчас мы говорим об управлении уровнем, а это означает, что при одном уровне тактового сигнала C (-1 или 1) триггер воспринимает входные сигналы (A или B, соответственно), а при другом (0) не воспринимает и остаётся в неизменном положении.

Наша схема представляет собой два мультиплексора, второй мультиплексор представляет собой просто прозрачный буфер, а первый (в зависимости от тактового сигнала C) выдаёт на вход второго либо А, либо B, либо сам выход буфера! Это означает следующее поведение: при C=-1 выход Q замыкается на вход A, при C=1 выход Q замыкается на вход B, а при C=0 выход Q поддерживается постоянным и входы A и B просто игнорируются. В тексте это может быть сумбурно, поэтому посмотрите следующее видео:









Динамическая ячейка памяти: троичный триггер с управлением фронтом





В отличие от управления уровнем, при управлении фронтом разрешение на переключение триггера даётся только в момент перепада тактового сигнала. В остальное время независимо от уровня тактового сигнала триггер не воспринимает входные сигналы и остаётся в неизменном состоянии.



Экскурс в хорошо изученную область



Давайте на минутку совершим путешествие в двоичный (бррр) мир, чтобы было чуть понятнее. В русскоязычной литературе ко всем подобным схемам применяется слово «триггер» (поправьте меня, я маску-то только нашёл). Двоичный триггер с управлением по уровню называется gated D-latch. Грубо говоря, у него есть два входа: D (данные) и E (enable). Единственный выход Q равен D если E=1, и сохраняет своё значение если E=0.







Триггер со срабатыванием по уровню (flip-flop) может быть построен из двух обычных защёлкок (gated D-latch) и одного инвертера:







Эта схема называется Master-slave edge-triggered D flip-flop.



Назад в троичный мир или терра (почти) инкогнита





Если мы хотим получить срабатывание по фронту тактирующего сигнала, мы точно так же, как и в двоичном мире, можем использовать две троичные защёлки и один эквивалент двоичного инвертера, как на этой схеме:







Наша динамическая ячейка памяти имеет два входа: C и Am; она имеет один выход Qs. В двоичном мире инвертер генерирует второй сигнал со сдвинутой фазой, который тактирует защёлку-раба. В нашей троичной схеме тактирующий сигнал расщепляется на два: min(C,0) и max(C,0), каждый из которых тактирует свою защёлку. Для того, чтобы сигнал Am дошёл до выхода Qs, нам необходимо подряд два восходящих фронта на сигнале C:







Вот соответствующиее видео работы ячейки памяти с динамическим управлением:









Заключение





Мы рассмотрели два варианта ячеек памяти. Ячейка памяти с динамическим управлением — это основной элемент троичного счётчика, который мы рассмотрим в следующий раз. Enjoy!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/324650/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

На рынке корову мужик продавал (вычислительное решение)

Среда, 22 Марта 2017 г. 21:48 (ссылка)

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



Для начала давайте попытаемся узнать, есть ли вообще способ действовать на рынке без убытка для себя. Единственная причина убытков содержится в необходимости нести расходы на содержание коров. Понятное дело, что продавец применяет максимально бережливую стратегию, когда в стойле у него находиться не более чем одна корова, и только после ее продажи он заказывает следующую. Применяя такой подход, нужно продавать имеющуюся корову первому же покупателю, принадлежащему любому классу, рентабельному с точки зрения Мужика. Остается решить, какие классы признать рентабельными. Для примера возьмем два класса покупателей: представители первого пусть появляются в среднем 3 раза за час и дают 1 рублей, а представители второго – 2 раза и дают 7. Не сложно смекнуть, что продавая только первому классу, можно заработать 3 руля на каждый час простоя, только второму классу покупателей – 14 рублей, а если продавать любому представителю из этих классов, то 14+3 рубля на каждый час оплаченного простоя коровы. Действительно, в среднем придет 3+2 покупателя на час простоя, при этом в среднем 3 из них будут из первого класса, а 2 из второго. Из этих рассуждений можно заключить, что оптимальной по прибыли бережливая стратегия будет тогда, когда корову продают любому покупателю, дающему неотрицательную надбавку к закупочной цене. Если величина средней прибыли час меньше стоимости прокорма, то вряд ли имеет смысл оставаться на рынке.



Давайте теперь перейдем к дискретному по времени аналогу. Чтобы получить хорошее приближение, разобьем ось времени на столь малые одинаковые промежутки, чтобы их величина не превосходила 1/10 времени доставки коров из деревни и при этом вероятность появится хотя бы одному покупателю, не важно, какого класса, за такой промежуток не превосходила все ту же 1/10. Напрашивается еще условие, которое каким-то образом должно ограничивать размер ошибки дискретизации траты на относительно дорогой прокорм, как, например, в случае с очень богатым и редко появляющимся покупателем и постоянно имеющейся возможности при желании очень быстро продать корову по закупочной цене. Однако условие выбора столь малого промежутка, что в его течение в среднем появляется 1/10 покупателя, ограничивает оперативность реакции на лишнюю корову, делая дальнейшее уменьшение временного промежутка нецелесообразным.

Следующий этап построения аналогии состоит в переходе от независимых пуассоновских потоков к зависимым дискретным потокам покупателей. Пусть в непрерывной модели вероятности появится за бесконечно малый промежуток времени покупателям каждой категории относились как a: b: …: h, а вероятность появится хотя бы одному покупателю в промежутке времени, полученном при разбиении, равнялась p, тогда в дискретной модели в начале каждого шага будем проводить однократное испытание Бернули на «Успех» с вероятностью p, и в случае «Успеха» — какое-нибудь испытание с множеством несовместных исходов: одним для каждого класса покупателей и таким же отношением вероятностей между исходами. В силу того, что в непрерывной модели вероятность появиться сразу двум покупателям в течение одного промежутка разбиения по сравнению с вероятностью появления в точности одному была крайне низкой, построенная таким образом дискретная модель, даже не смотря на зависимость между потоками, будет давать хорошее приближение.



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

В описанной схеме функционирования рынка состояние Мужика на момент принятия решения полностью описывается

1) количеством имеющихся у него в стойле коров,

2) распределением всех заказанных им коров по ближайшим r ходам,

3) наличием и классом покупателя на текущем ходу.

Я должен здесь особо подчеркнуть, что в 2) важно не только суммарное количество коров в заказе, но и их распределение по ближайшим ходам, на которые заказ уже невозможен.



Гипотетически Мужик имеет счетное количество возможных состояний, однако кажется вполне очевидным, что существует такое количество коров M, иметь в заказе, сверх которого, не выгодно независимо от распределения их доставки по r ближайшим ходам. В результате количество состояний, которые действительно участвуют в игре при сколько-нибудь оптимальной стратегии, оказывается конечным.

Еще одно почти очевидное утверждение, используемое ниже, состоит в следующем: давайте расширим класс допустимых стратегий, позволив мужику действовать еще и опираясь на случайные эксперименты, наподобие подбрасывания монетки. Такие стратегии в теории игр называются смешенными и позволяют не дать возможности оппоненту, достаточно хорошо изучив стиль вашей игры, сделать свою стратегию более эффективной. Кажется достаточно правдоподобным, что поскольку в описанном эксперименте нет оппонента, то заменив в любой оптимальной стратегии все результаты подбрасывания монетки на «орла», вы не ухудшите саму стратегию.



Перейду, наконец, к описанию алгоритма. Вычертим на бумаге отдельно все допустимые состояния Мужика на начало тура, когда коровы уже прибыли, и в его конце перед принятием решения с общим количеством имеющихся и заказанных коров не превышающих M. Нашей целью будет доопределить между этими состояниями направленные ребра с хитро подобранными стоимостями, чтобы для решения задачи можно было применить алгоритм поиска замкнутого потока единичной мощности (входящий в каждую вершину поток равен потоку, исходящему из нее, сумма по всем вершинам интенсивностей входящих потоков равна 1). Итак, рассмотрим какое-нибудь состояние на начало хода. Из него проведем направленные ребра к состояниям, возможным в его конце. Каждое такое ребро соответствует классу пришедшего клиента либо их полному отсутствию. Припишем этим ребрам веса, равные их вероятностям и стоимости равные величине затрат на прокорм. Теперь рассмотрим состояния, соответствующие моменту перед принятием решения о продаже и заказе. Для каждой пары (величина заказа, продать/нет) вычертим стрелку в состояние, к которому приведут эти действия. Этим стрелкам мы не будем приписывать фиксированный вес, а их стоимость положим равной величине цены заказа минус величина стоимости заказа. Для большинства практических приложений, по всей видимости, можно заказывать не более одной коровы за раз.

Сведем задачу к анализу марковских цепей. Выбору стратегии при таком подходе соответствует приписывание в каждой вершине, соответствующей состоянию на конец хода, вероятностного веса всем исходящим из нее ребрам. Найдя предельное распределение вероятностей (в невырожденных случаях все вершины достижимы и непериодичны), определим предельный вероятностный поток и по нему — мощность дохода или убытков. Стратегия будет оптимальной, если она максимизирует мощность дохода.

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

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/324632/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Ksu11111

Шаг в математику 5-7 лет

Среда, 22 Марта 2017 г. 14:25 (ссылка)






1.

01-0Bo4wh5yroU (493x700, 255Kb)



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Ksu11111

Учимся считать для детей от 3 до 5 лет

Среда, 22 Марта 2017 г. 14:19 (ссылка)






1.

01-iq2kPo4FVfY (522x700, 277Kb)



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Ksu11111

Учимся решать комбинаторные задачи. Математика 3 класс

Среда, 22 Марта 2017 г. 13:35 (ссылка)






1.

01-NJcMjlfLIfc (530x700, 288Kb)



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<математика - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda