Как кодировать причинно-следственные связи в прологе (как линейную функцию)
Предположим, что две переменные 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) )