Как кодировать причинно-следственные связи в прологе (как линейную функцию)

Предположим, что две переменные X и Y причинно и линейно связаны, так что увеличение X приводит к увеличению Y (например, расстояние перемещения для автомобилей и их расход топлива). И X, и Y являются векторами N наблюдений (в примере N отдельных автомобилей).

Способ представления такого отношения - простое линейное уравнение Yi = a + bXi, которое описало бы отношение в выборке из N случаев, где i = 1, 2, ..., N. Здесь a и b - константы, в то время как Y и X являются переменными.

Есть ли у вас какие-либо предложения, как это можно представить в Прологе? Моя догадка что-то вроде causes(cause(travelDistance), effect(fuelConsumption), a(0.5), b(1.23))., Однако здесь, по-видимому, не хватает кода, который утверждает, что связь конкретно находится между i-м значением X и i-м значением Y (расстояние в пути автомобиля и расход топлива в этом автомобиле).

Есть идеи? Заранее спасибо!

/ JC

2 ответа

Решение

Основываясь на ваших предложениях, я думаю, что этот код отвечает на мой оригинальный вопрос. Спасибо!

:-use_module(library(clpfd)).

causes(
          var(
              name(distance),
              value(Distance)
          ),
          var(
              name(fuelConsumption),
              value(FuelConsumption)
          )
)
:-
FuelConsumption #= 5 + 2 * Distance.

И пример запроса:

?-causes(var(name(N), value(V)), var(name(fuelConsumption), value(3))).

Который дает N = distance,V = -1

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

Если я не понял ваш вопрос, я думаю, что проблема, которую вы описываете здесь, является плохо определенной / плохо описанной проблемой. Насколько я понимаю, у вас есть набор данных X и Y, которые следуют линейным отношениям, и вы хотите либо "сделать вывод", что X вызывает Y в отсутствие какой-либо другой информации, либо просто иметь способ описать это случай с помощью предиката. Проблема в том, что коррелированный набор данных никогда не сможет дать вам эту информацию сам по себе.

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

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

В хронологической модели, если вы можете установить "когда" происходит событие, вы можете сделать вывод о причинности с помощью очень простого правила "и X предшествует Y". Например, если считается, что "X = перемещение" имеет место до "Y = измерение топлива", то вы можете установить причинность, используя логику предикатов, показав, что:

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

В контрфактической модели у вас нет никакой информации о хронологии событий, но у вас есть информация об альтернативных событиях. Поэтому причинно-следственная связь "X вызывает Y" определяется его контрфактуальностью, т. Е. Если вы можете показать, что "если бы X не произошло, Y бы не произошло" (или, что то же самое, ¬X подразумевает ¬Y).

Осложняющим фактором в контрфактивной модели является то, что она допускает концепцию "ответственности", т. Е. Если и X, и ¬X могут привести к Y, то оба они, как говорят, являются потенциальными причинами Y. Однако в контексте набора данных Вы, вероятно, можете обойти это, сказав, что "если для ВСЕХ событий X, результатом будет Y, тогда как для ВСЕХ событий ¬X не обязательно верно, что результатом будет Y, тогда мы можем сделать вывод, что X вызывает Y". Итак, в вашем конкретном примере вы могли бы создать такой мир, чтобы

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

Затем вы можете установить, что "путешествие" как событие "вызывает" расход топлива в линейной модели по отношению к пройденному расстоянию, показывая, что:

  • Всякий раз, когда у вас есть событие "путешествия", пройденное расстояние действительно соответствует расходу топлива в соответствии с вашей линейной моделью.
  • Всякий раз, когда у вас есть событие "сифонирования", пройденное расстояние "не обязательно" соответствует расходу топлива в соответствии с этой моделью.

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

Например, если мы говорим о событиях, которые происходят в строгом хронологическом порядке, хронологическая причинность может выглядеть примерно так (в прологоподобном псевдокоде):

%%%%%%%%%%%%%%%%%%
%%% facts database
%%%%%%%%%%%%%%%%%%

% eventtype/1: defines type of event
eventtype('travel')
eventtype('fuel_measurement') % ... etc

% eventtime/2: defines timepoints by index and a record of actual time
eventtime(1, "12:02am")
eventtime(2, "12:03am") % ... etc

% event/3: ['event type', 'time', 'related measurement']
event( [eventtype('travel'),           eventtime(1, _), 50km] )
event( [eventtype('fuel-measurement'), eventtime(2, _), 5L  ] ) % ... etc

%%%%%%%%%%%%%
%%% relations
%%%%%%%%%%%%%

immediately_precedes( event(X), event(Y) ) :- 
  get_eventtime_index(X, Xind),
  get_eventtime_index(Y, Yind),
  plus_one(Xind, Yind).   % assumes all above helper predicates are suitably defined elsewhere

is_linearly_related( event(X), event(Y) ) :- 
  get_measurement(X, Xmeas), 
  get_measurement(Y, Ymeas), 
  Model is a + b * Xmeas, 
  Ymeas = Model.

iscausal( eventtype(Xtype), eventtype(Ytype) ) :-   % expressed as pseudocode
  forall: 
    [event(X), event(Y)], 
    X = [Xtype, Xtime, Xmeas], 
    Y = [Ytype, Ytime, Ymeas], 
    immediately_precedes( event(X), event(Y) )
  it applies that:
    is_linearly_related( event(X), event(Y) )
Другие вопросы по тегам