上周我读过一篇论文,建议将MDP作为推荐系统的替代解决方案, 该论文的核心是MDP方面的推荐过程,即状态,行动,转换概率,奖励函数等。
如果我们假设单用户系统简单,那么状态看起来像k-tuples (x1, x2, .. , xk)
,其中最后一个元素xk代表用户购买的最后一个项目。
例如,假设我们当前状态为(x1, x2, x3)
,这意味着用户按时间顺序购买了x1,然后是x2,然后是x3。现在如果他购买x4,新状态将是(x2, x3, x4)
。
现在,本文建议的是,这些状态转换是由动作触发的,其中动作是“向用户推荐项目x_i”。但问题是这样的行动可能导致不止一个州。
例如,如果我们当前的状态是(x1, x2, x3)
,并且操作是“向用户推荐x4”,则可能的结果可能是两个中的一个:
用户接受x4的推荐,新状态为(x2, x3, x4)
用户忽略x4的推荐(即购买其他东西),新状态将是任何状态(x2, x3, xi)
,其中xi!= x4
我的问题是,MDP实际上是否支持触发两个或更多不同状态的相同操作?
更新。我认为行动应该被表述为“得到项目x_i的推荐并接受它”和“获得项目x_i的推荐并拒绝它”而不是简单地“得到项目x_i的推荐”
答案 0 :(得分:0)
基于this Wikipedia article,是的,确实如此。
我不是这方面的专家,因为我只是查看了这个概念,但看起来好像一组状态和一组动作没有固有的关系。因此,多个状态可以链接到任何动作(或不链接),反之亦然。因此,一个动作可以导致两种或更多种不同的状态,并且每种结果都有一个特定的概率。
请注意,在您的示例中,您可能必须拥有一组所有可能的状态(似乎它可能是无限的)。进一步......基于我所阅读的内容,你的州也许不应该记录过去的历史。似乎你可以通过保留链本身的记录来记录历史记录 - 而不是//Model
class Person : INotifyPropertyChanged
{
//Properties with notification
}
//Views
abstract class View
{
//Base class for all views
public abstract void SetDataSource(object source);
protected virtual void Refresh();
public abstract void Show();
}
//Data grid view
class DataGridView : View
{
private Controller _controller = null;
private System.Windows.Forms.DataGrid _grid = new System.Windows.Forms.DataGrid();
public DataGridView(Controller controller)
{
_controller = controller;
}
public override void SetDataSource(object dataSource)
{
_grid.DataSource = dataSource;
}
public override void Show()
{
}
protected override void Refresh
{
_grid.Refresh();
}
}
//Controllers
abstract class Controller
{
//Base controller
public abstract void Init();
public abstract void Show();
public abstract void ViewChanged(object args);//To receive view changes
}
//Person presenter
class PersonGridController : Controller
{
private DataGridView _view = new DataGridView(this);
private BindingList<Person> _persons = new BindingList<Person>();
public override void Init()
{
//Initialize persons
//Optional, start thread/timer to update persons in background
}
public override void Show()
{
_view.SetDataSource(_persons);
_view.Show();
}
public override void ViewChanged(object args)
{
//Based on arguments, perform filter, edit, save, etc.
}
}
作为一个状态,你有更像(x1, x2, x3, xi)
的东西 - 通过动作链接的四个状态。 (抱歉这个符号。我希望这个概念有意义。)这样,你的州代表购买的选择(因此是有限的)。