设为首页 收藏本站
查看: 1238|回复: 0

[经验分享] 使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(七)

[复制链接]

尚未签到

发表于 2016-11-7 10:23:39 | 显示全部楼层 |阅读模式
  假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的功能。
  上一篇中介绍的是如何通过DMX来创建挖掘模型,这一篇讲简单介绍如何通过编程的方式来创建挖掘模型。
  通过编程的方式主要通过AMO来实现,分析服务的所有跟架构相关的实现,包括多维数据集和数据挖掘,都通过这个接口实现。
  AMO对象树包含了支持多维数据集和数据挖掘所有的对象模型,在我这篇随笔中可以详细看到它的结构。
  对象的结构稍微复杂一些,但我们关注的有三个部分:
DSC0000.png

  通过这两个对象连接到分析服务数据库并且操作分析服务数据库实例。
DSC0001.png

  然后通过DataSource以及DataSourceView创建数据源连接和数据源视图。
DSC0002.png

  然后通过MiningStructrue下的对象体系和MiningModel来创建挖掘结构和挖掘模型,可以留意到Column是自包含的结构,这主要是考虑到了挖掘结构中的嵌套模型。
  通过以上的对象模型我们可以观察到,这些对象跟我们在Visual Studio中创建一个数据挖掘项目都是相对应的,在一个正常的过程中我们都会按照下面的套路进行操作:

  • 创建项目(实际上部署之后对应的就是一个数据库)
  • 创建数据源
  • 创建数据源视图
  • 创建挖掘结构(定义数据结构)
  • 创建挖掘模型(挖掘算法等)
  以下将简单演示如何通过AMO来创建数据挖掘项目。
  打开Visual Studio,此篇用到的版本是2010,对应的数据库是SQL Server 2012。在Visual Studio中创建一个控制台项目,然后右键单击References文件夹,选择Add Reference…
DSC0003.png

  点击Browse找到AMO对象所对应的dll文件。
DSC0004.png

  这个文件通常在如下的位置:
  C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Assemblies
  
  接下来回到控制台代码中,首先需要加入AMO对象的引用。
  using Microsoft.AnalysisServices;
  
  然后,通过如下的代码连接到分析服务实例。
  Server SSASServer = new Server();
  SSASServer.Connect(@".");
  
  创建分析服务数据库。
  #region Create database
  string strDataBaseName = "DMAMO";
  Console.WriteLine("Check database: " + strDataBaseName);
  if (SSASServer.Databases.Contains(strDataBaseName))
  {
  SSASServer.Databases.Remove(strDataBaseName);
  Console.WriteLine("Database " + strDataBaseName + " already exists, droped.");
  }
  Database db = new Database(strDataBaseName, strDataBaseName);
  SSASServer.Databases.Add(db);
  db.Update();
  #endregion
DSC0005.png

  上面代码运行完毕后,会看到在对应的分析服务实例下已经创建了一个空的数据库。
  
  创建数据源。
  #region DataSource
  RelationalDataSource rds = new RelationalDataSource("DMDataSource", Utils.GetSyntacticallyValidID("DMDataSource", typeof(Database)));
  rds.ConnectionString = @"Data Source=.;Initial Catalog=AdventureWorksDW2012;Provider=SQLNCLI11.1;Integrated Security=SSPI;Application Name=SSASDEMO;";
  rds.ImpersonationInfo = new ImpersonationInfo("wade", "iamfromcnblogs");
  db.DataSources.Add(rds);
  db.Update(UpdateOptions.ExpandFull);
  #endregion
DSC0006.png

  留意到数据源对象的ImpersonationInfo属性,它的设置对应如下图的设置。在本机开发的时候,为了方便我们通常将其设置成为一个管理员账号。
DSC0007.png

  
  创建数据源视图。
  #region Data Source View
  DataSet dset = new DataSet();
  SqlConnection sqlconn = new SqlConnection(@"Data Source=.;Initial Catalog=AdventureWorksDW2012;Integrated Security=SSPI;Application Name=SSASDEMO;");
  //Line Items
  SqlDataAdapter daLineItems = new SqlDataAdapter("SELECT [OrderNumber],[LineNumber],[Model] FROM [vAssocSeqLineItems]", sqlconn);
  daLineItems.FillSchema(dset, SchemaType.Mapped, "vAssocSeqLineItems");
  dset.Tables["vAssocSeqLineItems"].ExtendedProperties.Add("TableType", "View");
  //Orders
  SqlDataAdapter daOrders = new SqlDataAdapter("SELECT [OrderNumber],[CustomerKey],[Region],[IncomeGroup] FROM [vAssocSeqOrders]", sqlconn);
  daOrders.FillSchema(dset, SchemaType.Mapped, "vAssocSeqOrders");
  dset.Tables["vAssocSeqOrders"].ExtendedProperties.Add("TableType", "View");
  //Relationship
  DataRelation relateProductSubCate = new DataRelation("Rel", dset.Tables["vAssocSeqOrders"].Columns["OrderNumber"], dset.Tables["vAssocSeqLineItems"].Columns["OrderNumber"]);
  dset.Relations.Add(relateProductSubCate);
  DataSourceView dsv = new DataSourceView("DMDSV", "DMDSV");
  dsv.DataSourceID = "DMDataSource";
  dsv.Schema = dset.Clone();
  db.DataSourceViews.Add(dsv);
  db.Update(UpdateOptions.ExpandFull);
  #endregion
DSC0008.png

  创建数据源视图是一个比较复杂的过程,表需要对应一个一个的对象,而且关系也要一一创建,最后需要把用到的表都通过DataSet对象加载进来,然后再通过clone方法将其设置成数据源视图的架构。
DSC0009.png

  
  创建挖掘结构。
  #region Mining Structure
  MiningStructure ms = new MiningStructure("MSOrder", "MSOrder");
  db.MiningStructures.Add(ms);
  ms.Source = new DataSourceViewBinding("DMDSV");
  ScalarMiningStructureColumn scOrderNumber = ms.Columns.Add("OrderNumber", "OrderNumber");
  scOrderNumber.IsKey = true;
  scOrderNumber.Type = MiningStructureColumnTypes.Text;
  scOrderNumber.Content = MiningStructureColumnContents.Key;
  scOrderNumber.KeyColumns.Add("vAssocSeqOrders", "OrderNumber", OleDbType.WChar);
  ScalarMiningStructureColumn scModel = ms.Columns.Add("Model", "Model");
  scModel.IsKey = true;
  scModel.Type = MiningStructureColumnTypes.Text;
  scModel.Content = MiningStructureColumnContents.Key;
  scModel.KeyColumns.Add("vAssocSeqLineItems", "Model", OleDbType.WChar);
  TableMiningStructureColumn tcLineItems = new TableMiningStructureColumn("SeqLineitems", "SeqLineitems");
  tcLineItems.ForeignKeyColumns.Add("vAssocSeqLineItems", "OrderNumber");
  tcLineItems.Columns.Add(scModel);
  ms.Columns.Add(tcLineItems);
  ms.Update();
  #endregion
DSC00010.png

  挖掘结构的创建实际上也是把数据源视图中定义的架构映射成数据挖掘结构的一个过程。需要通过对应的MiningColumn对象根据数据源视图把需要用到的字段映射进来。
  
  创建挖掘模型,其中通过枚举属性Algorithm来设置挖掘模型根据挖掘结构采用的是哪种挖掘算法。
  #region Mining Model
  MiningModel mm = ms.CreateMiningModel(true, "Basket Forecasting Model");
  mm.Algorithm = MiningModelAlgorithms.MicrosoftAssociationRules;
  mm.Columns["SeqLineitems"].Usage = MiningModelColumnUsages.Predict;
  mm.Update();
  #endregion
DSC00011.png

  
  
  
  
  
  
  
  
  
  一个挖掘模型对应一个挖掘结构,所以很多结构直接继承了挖掘结构。这里唯一需要做的就是,根据创建出来的挖掘模型,将其中的一个列设置成预测字段。
  
  最后,通过AMO处理挖掘模型。
  #region Process
  SSASServer.CaptureXml = true;
  db.Process();
  SSASServer.CaptureXml = false;
  Console.WriteLine("Processing...");
  SSASServer.ExecuteCaptureLog(true, true);
  #endregion
  
  打开挖掘模型,可以看到挖掘模型生成的规则。
DSC00012.png

  
  当然,实际上在代码中来创建挖掘模型是不被推荐的,有些AMO的深层对象模型目前SQL Server的文档里只能提供接口描述而没有关于模型的介绍和讲解,笔者主要是根据项目里创建的过程然后再回过头来理解对象模型的含义,而即使国外网站上关于挖掘结构和模型中的嵌套结构更是少之又少,所以这篇真的是摸索了好久,不断的编译调试和对比才将各个细节打通。无论如何,通过这个过程我们可以更深入的了解分析服务底层的对象模型从而更好地去理解和设计我们的挖掘模型,同时也可以通过AMO自动地去调整模型。希望通过此篇,会让更多的朋友来了解AMO对象模型。
  
  附:示例项目的下载地址。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296928-1-1.html 上篇帖子: 安装SQL Server:以前某个程序安装时挂起了文件操作,安装程序前请重启 解决方法 下篇帖子: sql server 把txt文件导入数据中时报SQL 网络接口: 服务器不支持所请求的协议 [xFFFFFFFF]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表