精华内容
下载资源
问答
  • 数据汇聚

    千次阅读 2020-05-12 09:33:50
    数据汇聚:打破企业数据的物理孤岛,形成统一的数据中心,为后续数据资产的价值挖掘提供原始材料。 1.数据汇聚工具: 1.Canal 主要缺点:Server中的Instance(实例)和Client(客户机)之间是一对一消费,不太适合...

    数据汇聚:打破企业数据的物理孤岛,形成统一的数据中心,为后续数据资产的价值挖掘提供原始材料。

     

    1.数据汇聚工具:

    1.Canal 主要缺点:Server中的Instance(实例)和Client(客户机)之间是一对一消费,不太适合用于多消费和数据分发的场景。

    2.Sqoop 处理过程定制程度较高,主要通过在命令行中配置参数来调整数据同步操作行为,在用户的一些自定义逻辑和数据同步链路监控方面比较薄弱。并且任务运行完全依赖于MapReduce,功能扩展性方面受到明显的约束和限制。

    3.DataX 插件式离线数据交换工具。基于进程内读写直连的方式,高并发数据交换场景下对数据内存要求较高。且不支持非结构化数据的同步。

     

    数据交换中心:

    目的:屏蔽底层工具的复杂性,以可视化配置的方式提供给企业用户;其次需要考虑为了解决数据孤岛,需要满足异构存储,异构数据类型的交换需求;同事考虑不同时效下的数据互通

     

    数据源分类:

    关系型数据库:Oracle,MYSQL,SQL Server,Greenplum等。

    NoSQL存储

    网络及MQ

    文件系统

    大数据相关

     

    离线数据交换:

    适用场景:数据时效要求低,吞吐量大。解决大规模数据的迁移问题。

    实现原理:将不同数据源的交换抽象为从源头数据源读取数据的读取插件,以及向目标端写入数据的写入插件,理论上可以支持任意类型数据源的数据交换工作。采用插件化方式构建,将数据源读取和写入抽象读取插件,写入插件。

    非结构化的数据也可以通过扩展插件方式交换,场景主要以文件或数据块的方式进行交换,因此只需适配源或目的存储的相应插件及数据处理的极致,即可满足相应需求。

    实时数据交换:

    把数据库,日志,爬虫等数据实时接入Kafka,Hiva,Orcle等存储中,便于后续进行实时计算或供业务查询分析使用。实时同步有两个核心服务:数据订阅服务,数据消费服务。

     

    数据存储:

    存储时选择关系型数据库还是大数据相关的技术?(Hadoop)

    现有的存储与新存储之间的关系是什么?

    抛开技术指标的维度对比,选择存储时还需要考虑:数据规模,数据生产方式(若数据生产端没有存储,将会通过两种方式进行存储:1.目标存储端具备高性能落地的能力:实时推送。2.目标存储端不具备高性能落地的能力:在生产端和目标存储端之间加一个写性能较好的存储。),数据应用方式。

    1.在线和离线

    在线存储----(供用户随时读取)设备一般为磁盘,磁盘列阵,云存储等。

    离线存储----(对在线存储的数据进行备份)典型产品是硬盘,磁带,光盘等。

    2.OLTP和OLAP

    OLTP(联机事务处理):用于存储和管理日常操作的数据。数据是当前的,最新的,细节的,二维的,分立的。

    OLAP(联机分析处理):也叫DSS决策支持系统,也就是数据仓库。用户分析这些数据。主要用来执行大量的查询操作,对实时性要求低。在OLAP系统中,常使用分区技术、并行技术。数据是历史的,聚集的,多维的,集成的,统一的。

    展开全文
  • 数据挖掘的军规

    2019-12-23 07:30:27
    这是傅一平的第312篇原创“与数据同行”开通了微信群,现已汇聚了3000位小伙伴了,长按以下二维码发送“入群”后加入。正文开始笔者鼓励致力于从事数据行业的去参加一些人工智能,机器学习的培...

    这是傅一平的第312篇原创

    “与数据同行”开通了微信群,现已汇聚了3000位小伙伴了,长按以下二维码发送“入群”后加入

    正文开始

    笔者鼓励致力于从事数据行业的去参加一些人工智能,机器学习的培训,然后有人说:其实很多企业不喜欢培训出来的人,认为培训不贴近实际,纸上谈兵。

    我倒不这么看,其实即使在企业内干数据挖掘的人,很多也出不了活,这个不仅仅涉及业务和技术,更是管理上的问题。

    任正非说,华为最后能留下来的财富只有两样:一是管理框架、流程与组织支撑的管理体系;二是对人的管理和激励机制,什么是流程化组织,简单的说,就是基于流程来分配权力、资源以及责任的组织。

    为什么这么说?

    笔者的粗糙理解就是:好的做事的方法,靠人的口口相传是没有用的,写成书也是没人看的,只有把这些东西固化到企业的生产流程中去。

    你要干活就必须遵循这个流程,才能让这些方法成为企业的基因,无时不刻发挥出其应有的价值,阻止突破底线事情的发生,流程让新人做事一开始就站在巨人的肩膀上。

    创新型的公司往往是传统流程和机制的破坏者,但当初公司在建立这些流程和机制的时候,其实符合当时的大多利益,而且这些机制和流程确保了企业最基本的利益,所以后来要被颠覆,只是因为跟不上变化了而已,绝不是说机制和流程本身就是个问题。

    可惜的是,对于数据挖掘这么复杂的、不确定性的工作,我们竟然很少去制定符合其特点的相关的流程和规范,有些数据挖掘美其名曰立项建设,大多采用放飞的方式进行,失败是大多数的,投资浪费是很多的,偶偶的亮点不能说明问题。

    数据挖掘工作定义的六个阶段,业务理解、数据理解、数据准备、模型构建、模型评估、模型部署,被大家简单的理解为纯粹的技术步骤,从来没想过这些阶段跟管理有什么关系。

    但正是管理的缺位,导致大量的数据挖掘工作事倍功半,新人来到一个团队,历经千辛万苦作出的东西,往往一文不值,这到底是新人的问题还是团队的问题?

    数据挖掘工作其实根本不可能靠闭关三日来给出什么惊喜,这是为实践所证明的。

    如果你是一支数据团队的管理者,改变不了整个企业的环境,比如数据驱动业务的思想,公司的政策等等,但应该在你的职权范围内,在有限的资源条件下,用更好的管理手段让数据挖掘工作变得更有效。

    最近,我跟团队正在思考拟定数据挖掘的管理流程和规范,共5个关键节点,希望新人做的数据挖掘工作,能够按照规定的流程走,从一开始就能站在一个较高的起点上,并一直处在一个较为正确的方向上,直到成功或者快速的失败。

    一、需求分析

    团队大了,工作多了,每个人的自由权就相对大了,这个时候团队就要明确一些做事的原则,什么样的数据挖掘可以做,什么样的数据挖掘不要做,这个不能靠拍脑袋,以下给出了4个原则,如果不满足就要退回:

    1、公司或部门重点工作(比如OKR)、领导安排的重点需求、日常运营分析和一线反馈的重点需求,杜绝不计原则的去接收挖掘需求,数据挖掘不是买菜,要耗费企业最珍贵的数据分析或挖掘资源,少而精是原则。

    2、判断是否已有相关模型或标签满足需求,有则推荐现有模型和标签,如果有相关模型或标签但无法满足现有需求,则需优化原模型和标签,这其实也是数据治理的要求,很多挖掘其实是原来做的不好或者未有效推广,不能重复造轮子。

    3、双方明确数据挖掘目标,初步评估技术可行性及大致所需工期,包括度量成功的指标(精确率、召回率)、定义成功的基准(小样本验证、AB测试等),业务侧可能的主观评估标准(覆盖用户数、纳入业务生产流程)等等。

    4、联系业务方明确验证方案,如果对方无法承诺验证环境,比如政策和外呼资源等等,则要特别谨慎,根据经验,由于配合不到位导致的模型延期上线或者失败的案例比比皆是,究其原因,还是因为业务方不够重视或者级别不够,调动不了相关资源去推进这个事情。

    除了以上原则,我们还制定了升级领导的原则,包括与业务方无法在目标上达成一致,实施周期超过XX人天等等,这些都是为了制止盲目的开启一个数据挖掘课题。

    二、方案设计

    这一过程看似简单,有些人甚至只是脑子转了下就仓促跳过,但很多建模失败就栽在这个阶段。

    在方案设计阶段要善于换位思考,承认自己的认知有限性,始终想着如何才能获得最强的“业务大脑”和“数据大脑”来帮助你更好的理解业务和对应的数据,包括三个方面的工作:

    1、明确所需数据及必要的特征:对于较为复杂且重点课题,一般都要组织相关利益方开展头脑风暴,集思广益进行特征的有效选择,大量的数据挖掘工作失败在于建模者仅凭自己有限的业务知识和有限的调研(包括有限的通识理解,特别是不谙世事的新人)就仓促选定变量,然后直接跳到自己以为擅长的数据建模阶段在调参上耗尽心血,最后事倍功半,代价不可谓不大。

    2、明确所需模型及技术实现步骤:一般跟着经验走就可以了,关于技术实现步骤相信每个企业都有自己的经验做法,比如我们就发现随机森林在很多情况下好用,新人不清楚就问导师,这一步其实是比较简单的。

    3、进行方案设计的汇报:要向利益相关者及你的领导汇报方案,领导可能技术上不如你,但人生经验比你足,业务视野比你开阔,拥有的资源比你多。

    因此,要努力争取到他的看法,领导支持你去做这个事情不代表他就支持你的设计,不要试图跨过领导等有了建模结果后再向他汇报,因为一旦结果不好,领导的团队成本已经花出去了,他不看好你的设计方案可以直接说NO,你要给他这个机会。

    三、建模开发

    这个阶段大致可以分为三个子过程:

    1、宽表开发及数据预处理:谁都知道这个步骤,大家都喜欢建立自己的宽表为自己的数据挖掘服务,但如果你对企业的数据资产局理解不够全面的化,就会在宽表处理上重复造轮子,效率很低。

    因此,对于数据资产的全局掌握进行定期的培训和考试是有必要的,很多人做了好长时间数据挖掘却对于融合模型不清楚,这是管理上出现了问题。

    2、模型基线开发及训练评估:参数调优、交叉验证、效果评估都是需要反复进行的过程,但如果发现难以达到满意的结果就不要一路走到死,召集相关人员进行一次技术讨论是非常有必要的。

    4、模型和标签上线发布:模型和标签上线要遵循严格的标准,包括是否满足当初设定的技术指标要求,是否满足数据治理要求,是否满足运维性能的要求等等。

    四、试点验证

    1、效果验证:跟功能开发不同,模型上线不代表就结束了,因为实际的生产环境跟你的训练环境会有很大的差别,你需要协调业务方按照当初的承诺尽快的进行效果验证,这个时候你要承担起连接者的角色,推进各方尽快反馈生产的效果,如果无法达到当初的设定目标,就要考虑重新优化模型,试点推进不利很多时候是业务方的原因,比如外呼排期延后等等,这个时候就要推动领导协调。

    2、试点汇报:一旦达到要求,就要组织业务方和自己方的领导进行汇报,明确模型是否具备全面推广或纳入生产的条件,这个涉及到业务方相关政策和资源的配合,不是简单的模型的问题。组织这种会议其实是向各方领导表明,我已经完成了任务,但要让这个模型产生价值,接下来你们得给我资源配合完成剩余的非功能性工作,好的模型最后不了了之往往是沟通出了问题,业务方的领导跟你的领导很多时候信息是极度不对称的,你要干成事情就得多做协调的事情。

    很多试点的结果并不理想,汇报的另一个目的就是及时止损,一方面是由于市场变化很快,总有意外的情况发生,另一方面是现有的模型的确达不到业务要求,你不能被一个看似无前途的事情拖死,你需要领导帮你做决策,继续干还是放弃。

    五、总结汇报

    1、你要跟踪模型的生产运行效果,及时发布运营报告,让你的领导和业务的领导知道你干成了这个事情,很多时候,试点的效果很好,但一旦纳入生产情况并不理想,因此要持续的跟踪一段时间。

    2、如果模型的效果保持稳定,则可以将其移交给统一运营团队(如果有的话),代表你交给公司的是一个可用的模型,从而进入常态化运营阶段,这个时候自己才可以全身而退。后续如果运营团队发现模型有问题,可以向你提交优化需求,由此迭代。

    数据挖掘最怕的就是只管杀不管埋,比如训练结果很好,但其实试点情况很差,试点情况还好,但生产情况很差,开始生产的时候还行,但持续一段时间就不行了。

    模型师一定要记住,模型的上线绝对不是你工作的终点,而仅仅是起点,只有模型进入稳定的生产阶段以后你才算完成了工作,大量的外包数据挖掘工作所以失败,就是因为他们把数据挖掘工作当成了简单的功能开发。

    你会发现,笔者从需求分析讲到总结汇报,都不在谈技术,而是在谈管理,我在谈进入每个阶段时要采用的质量控制的手段,其实每个阶段的周期也要控制,一般来讲,如果某个阶段超过了二个礼拜(可以根据企业实际调整),就要反思和对外暴露问题。

    根据以上的内容很容易就画出数据挖掘的管理流程,可以贴在墙上成为军规。当然每个企业的情况不同,流程可能不一样,但一定要沉淀出这种流程,它们保证了基本的做事的效率,不会由于人员的变动而导致效率的下降,这就是任总所说的流程化组织要干的事情吧。

    这是我最近的一点思考,大家一起加油吧。

    作者:傅一平 (微信号:fuyipingmnb)

    “与数据同行”开通了微信群和QQ群,现已汇聚了3000位小伙伴了,长按以下二维码加入

    笔者也开通了知识星球,欢迎到我的知识星球进行探讨。

    近期文章列表

    浙江移动数据中台的建设和应用实践

    工作六年,我总结了一份数据产品建设指南

    五级数据挖掘工程师,你处在哪一级?

    不做中台会死吗?

    BI(商业智能)的未来?

    数据分析的道与术

    OPPO数据中台之基石:基于Flink SQL构建实数据仓库

    超越BI,数据产品的前途在哪里?

    数据中台已成下一风口,它会颠覆数据工程师的工作吗?

    数据产品经理,并不是数据 + 产品经理

    数据中台不是技术平台,没有标准架构!

    如何有效推进百万标签库的治理?

    运营商大数据对外价值变现的十大趋势

    如何深入浅出的理解数据仓库建模?

    艰难的旅程:我们如何用“十步法”完成了一次企业级数据治理的落地?

    五年数字大屏之路,“述说”着我们大数据变现怎样的故事?(附演示视频)

    人工智能现在的技术“好玩”到了什么程度?

    超越平台,数据中台的业务化、服务化及开放化!


    要看更多,请点击左下角阅读原文即可阅读整理好的所有文章!

    展开全文
  • 数据挖掘能干什么? 分类分类可以把大量数据(在数据挖掘中也称为事例CASE)分成多个类别,而分类的依据就是这些事例中的属性。聚类分类有一个同胞兄弟就是聚类,聚类相对分类更加自动,聚类也将大量实例分成多个...

    数据挖掘能干什么?

    • 分类 分类可以把大量数据(在数据挖掘中也称为事例CASE)分成多个类别,而分类的依据就是这些事例中的属性。
    • 聚类 分类有一个同胞兄弟就是聚类,聚类相对分类更加自动,聚类也将大量实例分成多个类别,不过这次是根据属性值的相似程度自动汇聚成不同的类别。通常把分类成为有监督的算法,而聚类则被称为无监督的算法,主要原因就是分类在执行前就已经有了明确的类别,而聚类在分析前还不知道有多少分类,而是通过不断的迭代使得各分类之间的边界更加清晰,然后再分析这些分类之间的差别,因此聚类也成为无监督的算法。
    • 关联 关联是找到事例中出现频率较高的组合规则。
    • 序列 提到关联,另外一个同胞兄弟就是序列。序列也是发现组合规律的,不过关联中所提到的规律不涉及到先后次序,而序列则是有先后次序的。
    • 回归 对连续的结果值(不依靠人为分段Discretize)进行预测的算法归为回归。

    SQL Server 2008 中的数据挖掘算法

    1.决策树算法

    决策树,又称判定树,是一种类似二叉树或多叉树的树结构。决策树是用样本的属性作为结点,用属性的取值作为分支,也就是类似流程图的过程,其中每个内部节点表示在一个属性上的测试,每个分支代表一个测试输出,而每个树叶节点代表类或类分布。它对大量样本的属性进行分析和归纳。根结点是所有样本中信息量最大的属性,中间结点是以该结点为根的子树所包含的样本子集中信息量最大的属性,决策树的叶结点是样本的类别值。

    从树的根结点出发,将测试条件用于检验记录,根据测试结果选择适当的分支,沿着该分支或者达到另一个内部结点,使用新的测试条件或者达到一个叶结点,叶结点的类称号就被赋值给该检验记录。决策树的每个分支要么是一个新的决策节点,要么是树的结尾,称为叶子。在沿着决策树从上到下遍历的过程中,在每个节点都会遇到一个问题,对每个节点上问题的不同回答导致不同的分支,最后会到达一个叶子节点。这个过程就是利用决策树进行分类的过程。决策树算法能从一个或多个的预测变量中,针对类别因变量,预测出个例的趋势变化关系。

    在SQL Server 2008中,我们可以通过挖掘模型查看器来查看决策树模型。如图1所示。

    在图1中,我们可以看到决策树显示由一系列拆分组成,最重要的拆分由算法确定,位于“全部”节点中查看器的左侧。其他拆分出现在右侧。依赖关系网络显示了模型中的输入属性和可预测属性之间的依赖关系。并能通过滑块来筛选依赖关系强度。

    2.聚类分析算法

    聚类分析算法就是衡量个体间的相似度,是依据个体的数据点在几何空间的距离来判断的,距离越近,就越相似,就越容易归为一类。在最初定义分类后,算法将通过计算确定分类表示点分组情况的适合程度,然后尝试重新定义这些分组以创建可以更好地表示数据的分类。该算法将循环执行此过程,直到它不能再通过重新定义分类来改进结果为止。简单得说,聚类就是将数据对象的集合分组成为由类似的对象组成的多个类的过程。聚类用在商务方面的客户分析中,可以从客户库中发现不同的客户群,并分析不同客户群的行为模式。

    在SQL Server 2008中,我们可以通过挖掘模型查看器来查看聚类分析模型。如图2所示。

    在图2中,分类关系图表现个类间关联性的强弱。分类剖面图了解因变量与自变量的关联性强弱程度。分类特征主要呈现每一类的特性。分类对比主要呈现出两类间特性的比较。

    3.Naive Bayes 算法

    Naive Bayes 算法是 Microsoft SQL Server Analysis Services 提供的一种分类算法,用于预测性建模。Naive Bayes算法使用贝叶斯定理,假定一个属性值对给定类的影响独立于其他属性的值。与其他算法相比,该算法所需的运算量小,因而能够快速生成挖掘模型,以发现输入列和可预测列之间的关系。可以使用该算法进行初始数据探测,在用于大型数据库时,该算法也表现出了高准确率与高速度,能与决策树和神经网络相媲美。

    算法采用监督式的学习方式,在分类之前,需要事先知道分类的类型。通过对训练样本的学习,来有效得进行分类。就是通过训练样本中的属性关系,产生训练样本的中心概念,用这些已经产生的中心概念,对未分类的数据对象进行预测。

    在SQL Server 2008中,我们可以通过挖掘模型查看器来查看Naive Bayes模型。如图3所示。

    在图3中,依赖关系网络可以对数据的分布进一步了解。属性配置文件可以了解每个变量的特性分布情况。属性特征可以看出不同群分类的基本特性概率。属性对比就是呈现属性之间的特性对比。

    4.关联规则算法

    关联算法规则是要发现数据库中变量和个体之间关系程度,也就是要发现大量数据中项集之间有趣的关联或相关联系。例如,在关联规则挖掘中,典型的例子就是购物篮分析,该分析过程就是通过分析顾客所购买的不同商品之间的联系,来挖掘顾客的购买习惯,并帮助销售商制定营销策略。关联规则算法中有两个重要的参数支持度和置信度。支持度就是指X项集和Y项集中,同时发生X,Y事件的概率。置信度就是指X项集和Y项集中,X事件发生的概率下,Y事件发生的概率。

    在SQL Server 2008中,我们可以通过挖掘模型查看器来查看关联规则模型。如图4所示

    在图4中,规则可以查看算法中产生的关联规则,我们可以通过此来了解关联规则内容以及其支持度和置信度。项集可以查看算法中产生的对象组,我们可以通过此来了解各个对象组内容及其支持。依赖关系网络可以呈现产品间的相关性,并通过图形了解产品间的相关性。

    5.顺序分析和聚类分析算法

    顺序分析和聚类分析算法是由 Microsoft SQL Server Analysis Services 提供的一种顺序分析算法。可以使用该算法来研究包含可通过下面的路径或顺序链接到的事件的数据。该算法通过对相同的顺序进行分组或分类来查找最常见的顺序。

    在SQL Server 2008中,我们可以通过挖掘模型查看器来查看顺序分析模型。如图5所示

    在图5中分类关系图可以显示挖掘模型中的所有分类,分类之间连线的明暗程度表示分类的相似程度。通过调整分类右侧的滑块,可以调整显示的连线数。分类剖面图提供算法创建的分类的总体视图,显示了分类中的每个属性以及属性的分布。分类特征可以检查分类的组成特征。分类对比可以比较两个分类的属性。状态转换可以在选中一个分类后,可在选中的分类中浏览序列状态之间的转换。

    6.时序算法

    时序算法提供了一些针对连续值预测进行了优化的回归算法,并将时间序列分解成主要趋势成分,季节变化成分,并检验理论模型是否能反应现象。

    在SQL Server 2008中,我们可以通过挖掘模型查看器来查看时序模型。如图6所示

    在图6中,图表栏显示预测变量个产品过去值以及预测值,以及误差区间。模型将算法以完成的模型显示为树。

    7.神经网络算法

    神经网络是一组连接的输入输出单元,其中每一个连接都与一个权相连接。在训练学习阶段,通过调整训练网络的权,使得能够预测输入样本的正确类标号。神经网络算法创建由多至三层神经元组成的网络。这些层分别是输入层、可选隐藏层和输出层。输入层:输入神经元定义数据挖掘模型的所有输入属性值及其概率。隐藏神经元接收来自输入神经元的输入,并向输出神经元提供输出。隐藏层是向各种输入概率分配权重的位置。权重说明某一特定输入对于隐藏神经元的相关性或重要性。输入所分配的权重越大,则输入的值越重要。输出神经元代表数据挖掘模型的可预测属性值。

    在SQL Server 2008中,我们可以通过挖掘模型查看器来查看神经网络模型。输入选择神经网络模型将用作输入的属性和属性值。输出指定使用输出的神经网络的属性。变量指定属性右侧的条表示指定输入属性状态所倾向的输出属性状态。 条的大小则表示输出状态倾向于输入状态的程度。

    8.逻辑回归算法

    逻辑回归是根据输入域值对记录进行分类的统计方法,通过建立一组方程,把输入域值与输出字段每一类的概率联系起来。模型在分析二分类或有序因变量与解释变量的关系,用自变量去预测因变量在给定某个值的概率。一旦生成模型,便可用于估计新的数据的概率。概率最大的目标类被指定为该记录的预测输出值。逻辑回归算法是神经网络算法的一种变体,用于确定多个因素对一对结果的影响。通过对输入和输出之间的关系进行建模。来测量每个输入对输出的影响,并权衡不同输入在完成的模型中的作用。

    9.线性回归算法

    线形回归算法是一种常用的用于统计并作出预测的方法,使决策树算法的一种变体,有助于计算依赖变量和独立变量之间的线性关系,根据输入字段估计预测输出字段的最佳线形方程,然后使用该关系进行预测。使用线性回归确定两个连续列之间的关系,代表一条直线或者平面,以评估数据列之间的关系。

    转载于:https://www.cnblogs.com/tippoint/archive/2011/12/07/2279607.html

    展开全文
  • 矩阵可以用来表示数据集,描述数据集上的变换,是MADlib中数据的基本格式,通常使用二维数组数据类型存储。MADlib中的向量是一维数组,可看作是矩阵的一种特殊形式。MADlib的矩阵运算模块(matrix_ops)实现SQL中的...

            矩阵可以用来表示数据集,描述数据集上的变换,是MADlib中数据的基本格式,通常使用二维数组数据类型存储。MADlib中的向量是一维数组,可看作是矩阵的一种特殊形式。MADlib的矩阵运算模块(matrix_ops)实现SQL中的矩阵操作。本篇介绍矩阵的概念,说明MADlib矩阵运算相关函数,并举出一些简单的函数调用示例。

     

    一、矩阵定义

            矩阵(matrix)是把数集合汇聚成行和列的一种表表示。术语通常用来说明矩阵具有m行和n列。例如,下面所示的矩阵A是。如果m=n,则我们称该矩阵为方阵(square matrix)。矩阵A的转置记作,它通过交换A的行和列得到。

           

            矩阵的元素用带小标的小写字母表示。例如,对于矩阵A,是其第 行第 列的元素。行自上而下编号,列自左向右编号,编号从1开始。例如,是矩阵A的第2行第1列的元素。

            矩阵的每一行或列定义一个向量。对于矩阵A,其第 个行向量(row vector)可以用表示,而第 个列向量(column vector)用表示。使用前面的例子,,而。注意:行向量和列向量都是矩阵,必须加以区分,即元素个数相同并且值相同的行向量和列向量代表不同的矩阵。

     

    二、MADlib中的矩阵表示

            MADlib支持稠密和稀疏两种矩阵表示形式,所有矩阵运算都以任一种表示形式工作。

    1. 稠密

            矩阵被表示为一维数组的行集合,例如3x10的矩阵如下表:

    row_id |         row_vec   
    -------+-------------------------   
      1    | {9,6,5,8,5,6,6,3,10,8}   
      2    | {8,2,2,6,6,10,2,1,9,9}   
      3    | {3,9,9,9,8,6,3,9,5,6}

            row_id列表示每一行的行号,是从1到N没有重复值的连续整型序列,N为矩阵的行数。row_vec列对应构成矩阵每行的一维数组(行向量)。

    2. 稀疏

            使用行列下标指示矩阵中每一个非零项,例如:

    row_id | col_id | value   
    -------+--------+-------   
         1 |      1 |     9   
         1 |      5 |     6   
         1 |      6 |     6   
         2 |      1 |     8   
         3 |      1 |     3   
         3 |      2 |     9   
         4 |      7 |     0 

            常用这种方式表示包含多个零元素的稀疏矩阵。上面的例子只用6行表示一个4x7的矩阵中的非零元素。矩阵的行列元素个数分别由row_id和col_id的最大值指定。注意最后一行,即使value为0也要包含此行,它指出了矩阵的维度,而且指示矩阵的第4行与第7列的元素值都是0。

            对于稀疏矩阵表,row_id和col_id列逻辑类似于关系数据库的联合主键,要求非空且唯一。value列应该是标量(非数组)数据类型。上面矩阵对应的稠密表示如下:

    row_id |         row_vec 
    -------+------------------------- 
      1    | {9,0,0,0,6,6,0} 
      2    | {8,0,0,0,0,0,0} 
      3    | {3,9,0,0,0,0,0} 
      4    | {0,0,0,0,0,0,0}

    三、MADlib中的矩阵运算函数

            与数组操作相同,矩阵运算函数支持的元素数据类型也包括SMALLINT、INTEGER、BIGINT、FLOAT8和NUMERIC(内部被转化为FLOAT8,可能丢失精度)。

    1. 矩阵操作函数分类

            MADlib的矩阵操作函数可分为表示、计算、提取、归约、创建、转换六类。下面列出每一类中所包含的函数名称及其参数。

     (1)表示函数

    -- 转为稀疏矩阵

    matrix_sparsify( matrix_in, in_args,matrix_out, out_args)

    -- 转为稠密矩阵

    matrix_densify( matrix_in, in_args,matrix_out, out_args)

    -- 获取矩阵的维度

    matrix_ndims( matrix_in, in_args )

     

    (2)计算函数

    -- 矩阵转置

    matrix_trans( matrix_in, in_args,matrix_out, out_args)

    -- 矩阵相加

    matrix_add( matrix_a, a_args, matrix_b,b_args, matrix_out, out_args)

    -- 矩阵相减

    matrix_sub( matrix_a, a_args, matrix_b,b_args, matrix_out, out_args)

    -- 矩阵乘法

    matrix_mult( matrix_a, a_args, matrix_b,b_args, matrix_out, out_args)

    -- 数组元素相乘

    matrix_elem_mult( matrix_a, a_args,matrix_b, b_args, matrix_out, out_args)

    -- 标量乘矩阵

    matrix_scalar_mult( matrix_in, in_args,scalar, matrix_out, out_args)

    -- 向量乘矩阵

    matrix_vec_mult( matrix_in, in_args,vector)

     

    (3)提取函数

    -- 从行下标提取行

    matrix_extract_row( matrix_in, in_args,index)

    -- 从列下标提取列

    matrix_extract_col( matrix_in, in_args,index)

    -- 提取主对角线元素

    matrix_extract_diag( matrix_in, in_args)

     

    (4)归约函数(指定维度的聚合)

    -- 获取指定维度的最大值。如果fetch_index = True,返回对应的下标。

    matrix_max( matrix_in, in_args, dim,matrix_out, fetch_index)

    -- 获取指定维度的最小值。如果fetch_index = True,返回对应的下标。

    matrix_min( matrix_in, in_args, dim,matrix_out, fetch_index)

    -- 获取指定维度的和

    matrix_sum( matrix_in, in_args, dim)

    -- 获取指定维度的均值

    matrix_mean( matrix_in, in_args, dim)

    -- 获取矩阵范数

    matrix_norm( matrix_in, in_args, norm_type)

     

    (5)创建函数

    -- 创建一个指定行列维度的矩阵,用1初始化元素值。

    matrix_ones( row_dim, col_dim, matrix_out,out_args)

    -- 创建一个指定行列维度的矩阵,用0初始化元素值。

    matrix_zeros( row_dim, col_dim, matrix_out,out_args)

    -- 创建单位矩阵

    matrix_identity( dim, matrix_out, out_args)

    -- 用给定对角元素初始化矩阵

    matrix_diag( diag_elements, matrix_out,out_args)

     

    (6)转换函数

    -- 矩阵求逆

    matrix_inverse( matrix_in, in_args,matrix_out, out_args)

    -- 广义逆矩阵

    matrix_pinv( matrix_in, in_args,matrix_out, out_args)

    -- 矩阵特征提取

    matrix_eigen( matrix_in, in_args,matrix_out, out_args)

    -- Cholesky分解

    matrix_cholesky( matrix_in, in_args,matrix_out_prefix, out_args)

    -- QR分解

    matrix_qr( matrix_in, in_args,matrix_out_prefix, out_args)

    -- LU分解

    matrix_lu( matrix_in, in_args, matrix_out_prefix,out_args)

    -- 求矩阵的核范数

    matrix_nuclear_norm( matrix_in, in_args)

    -- 求矩阵的秩

    matrix_rank( matrix_in, in_args)

     

            注意:矩阵转换函数仅基于内存操作实现。单一节点的矩阵数据被用于分解计算。这种操作只适合小型矩阵,因为计算不是分布到个多个节点执行的。

     2. 矩阵操作函数示例

            先执行下面的脚本创建两个稠密表示的矩阵测试表并添加数据。mat_a矩阵4行4列,mat_b矩阵5行4列。

    drop table if exists mat_a;   
    create table mat_a (row_id integer, row_vecinteger[]);   
    insert into mat_a (row_id, row_vec)values  
    (1, '{9,6,5,8}'), (2, '{8,2,2,6}'), (3,'{3,9,9,9}'), (4, '{6,4,2,2}');   
       
    drop table if exists mat_b;   
    create table mat_b (row_id integer, vectorinteger[]);  
    insert into mat_b (row_id, vector)values  
    (1, '{9,10,2,4}'), (2, '{5,3,5,2}'), (3,'{0,1,2,3}'), (4, '{2,9,0,4}'), (5,'{3,8,7,7}');

    (1)由稠密矩阵表生成稀疏表示的表

    drop table if exists mat_a_sparse; 
    select madlib.matrix_sparsify('mat_a','row=row_id, val=row_vec', 
                                  'mat_a_sparse','col=col_id, val=val'); 
    
    drop table if exists mat_b_sparse; 
    select madlib.matrix_sparsify('mat_b','row=row_id, val=vector', 
                                  'mat_b_sparse','col=col_id, val=val'); 

            madlib.matrix_sparsify函数将稠密表示矩阵表转为稀疏表示的矩阵表,四个参数分别指定输入表名、输入表参数(代表行ID的列名、存储矩阵元素值的列名等)、输出表名、输出表参数(代表列ID的列名、存储矩阵元素值的列名等)。

            上面的例子将稠密矩阵转为稀疏表示,并新建表存储转换结果。源表的两列类型分别是整型和整型数组,输出表包含三列,行ID列名与源表相同,列ID列和值列由参数指定。由于mat_a表的矩阵中不存在0值元素,生成的稀疏矩阵表共有16条记录,而mat_b中有两个0值,因此稀疏表中只有18条记录。

    dm=# select * from mat_a_sparse order byrow_id, col_id;
     row_id | col_id | val
    --------+--------+-----
          1 |      1 |   9
          1 |      2 |   6
    …
          4 |      3 |   2
          4 |      4 |   2
    (16 rows)
    
    dm=# select * from mat_b_sparse;
     row_id | col_id | val
    --------+--------+-----
          1 |      1 |   9
          1 |      2 |  10
    …
          4 |      2 |   9
          4 |      4 |   4
    (18 rows)

    (2)矩阵转置

            matrix_trans函数的第一个参数是源表名,第二个参数指定行、列或值的字段名,第三个参数为输出表名。

    -- 稠密格式
    drop table if exists mat_a_r; 
    select madlib.matrix_trans('mat_a','row=row_id, val=row_vec','mat_a_r'); 
    select * from mat_a_r order by row_id;

            结果:

     row_id | row_vec 
    --------+-----------
          1 | {9,8,3,6}
          2 | {6,2,9,4}
          3 | {5,2,9,2}
          4 | {8,6,9,2}
    (4 rows)

    -- 稀疏格式
    drop table if exists mat_b_sparse_r; 
    select madlib.matrix_trans('mat_b_sparse', 'row=row_id, col=col_id, val=val','mat_b_sparse_r'); 
    select * from mat_b_sparse_r order byrow_id, col_id; 

           结果:

     col_id | row_id | val
    --------+--------+-----
          1 |      1 |   9
          2 |      1 |   5
    …
          4 |      4 |   4
          5 |      4 |   7
    (18 rows)

            源矩阵5行4列,转置后的矩阵为4行5列。

     (3)提取矩阵的主对角线

    select madlib.matrix_extract_diag('mat_b', 'row=row_id, val=vector'),
           madlib.matrix_extract_diag
           ('mat_b_sparse_r', 'row=row_id, col=col_id,val=val');

            结果:

     matrix_extract_diag | matrix_extract_diag
    ---------------------+---------------------
     {9,3,2,4}           | {9,3,2,4}
    (1 row)

            matrix_extract_diag函数的返回值是由对角线元素组成的数组。可以看到,矩阵和其对应的转置矩阵具有相同的主对角线。也就是说,矩阵转置实际上是沿着主对角线的元素对折操作。

     (4)提取指定下标的行或列

    select madlib.matrix_extract_row('mat_a','row=row_id, val=row_vec', 2) as row, 
           madlib.matrix_extract_col
           ('mat_b_sparse','row=row_id, col=col_id, val=val', 3) as col;

            结果返回两个向量,即mat_a的第2行,mat_b_sparse的第3列:

        row    |     col    
    -----------+-------------
     {8,2,2,6} | {2,5,2,0,7}
    (1 row)

    (5)获取指定维度的最大最小值及其对应的下标

    drop table if exists mat_max_r,mat_min_r; 
    select madlib.matrix_max
           ('mat_a','row=row_id, val=row_vec', 2, 'mat_max_r', true), 
           madlib.matrix_min
           ('mat_b_sparse','row=row_id, col=col_id', 1, 'mat_min_r', true); 
    select * from mat_max_r, mat_min_r;

            结果:

       index   |    max   |   index   |   min   
    -----------+-----------+-----------+-----------
     {1,1,2,1} | {9,8,9,6} | {3,3,4,2} | {0,1,0,2}
    (1 row)

            matrix_max和matrix_min函数分别返回指定维度的最大值和最小值,其中维度参数的取值只能是1或2,分别代表行和列。返回值为数组类型,如果最后一个参数为‘true’,表示结果表中包含最大最小值对应的下标数组列。

    (6)按指定维度求和

    select madlib.matrix_sum('mat_b_sparse', 'row=row_id, col=col_id,val=val', 1),
         madlib.matrix_sum('mat_b_sparse', 'row=row_id, col=col_id,val=val', 2); 

            结果:

      matrix_sum   |   matrix_sum    
    ---------------+-----------------
     {19,31,16,20} | {25,15,6,15,25}
    (1 row)

            matrix_sum函数按指定维度求和,第三个参数的值只能是1或2,分别表示按行或列求和。函数返回的结果是一个向量。

    (7)按指定维度求均值

    select madlib.matrix_mean('mat_b_sparse', 'row=row_id, col=col_id,val=val', 1),
           madlib.matrix_mean('mat_b_sparse', 'row=row_id, col=col_id,val=val', 2); 
            结果:
       matrix_mean   |        matrix_mean        
    -----------------+---------------------------
     {3.8,6.2,3.2,4} | {6.25,3.75,1.5,3.75,6.25}
    (1 row)
            matrix_mean函数按指定维度求均值,第三个参数的值只能是1或2,分别表示行或列。函数返回的结果是一个向量。

    (8)创建对角矩阵

    drop table if exists mat_r; 
    select madlib.matrix_diag(array[9,6,3,10], 
                              'mat_r', 'row=row_id,col=col_id, val=val'); 
    select * from mat_r order by row_id;

            结果:

     row_id | col_id | val
    --------+--------+-----
          1 |      1 |   9
          2 |      2 |   6
          3 |      3 |   3
          4 |      4 |  10
    (4 rows)

            madlib.matrix_diag函数输出的是一个稀疏表示的对角矩阵表,如果不指定“col=col_id”,输出表中代表列的列名为col。

     (9)创建单位矩阵

    drop table if exists mat_r; 
    select madlib.matrix_identity(4,'mat_r'); 
    select * from mat_r; 

            结果:

     row | col | val
    -----+-----+-----
        4|   4 |  1
        2|   2 |  1
        1|   1 |  1
        3|   3 |  1
    (4 rows)

            matrix_identity函数创建一个稀疏表示的单位矩阵表。主对角线上的元素都为1,其余元素全为0的方阵称为单位矩阵。

     (10)创建元素为全0的矩阵

    drop table if exists mat_r01, mat_r02; 
    select madlib.matrix_zeros(3, 2, 'mat_r01','row=row_id, col=col_id, val=entry'), 
           madlib.matrix_zeros(3, 2, 'mat_r02', 'fmt=dense');
    select * from mat_r01;
    select * from mat_r02;

            结果分别为:

     row_id | col_id | entry
    --------+--------+-------
          3 |      2 |     0
    (1 row)
    
     row|  val 
    -----+-------
       1| {0,0}
       3| {0,0}
       2| {0,0}
    (3 rows)

            注意因为元素值全为0,稀疏表示的矩阵表只有1行。fmt=dense指示结果表是稠密格式。

     (11)创建元素为全1的矩阵

    drop table if exists mat_r11, mat_r12; 
    select madlib.matrix_ones(3, 2, 'mat_r11','row=row_id, col=col_id, val=entry'), 
           madlib.matrix_ones(3, 2, 'mat_r12', 'fmt=dense');
    select * from mat_r11 order by row_id;
    select * from mat_r12 order by row;

            结果分别为:

    row_id | col_id | entry
    --------+--------+-------
         1 |      2 |     1
         1 |      1 |     1
         2 |      2 |     1
         2 |      1 |     1
         3 |      2 |     1
         3 |      1 |     1
    (6 rows)
    
     row|  val 
    -----+-------
       1| {1,1}
       2| {1,1}
       3| {1,1}
    (3 rows)

            注意因为元素值全为1,稀疏表示的矩阵表有6行。

     (12)获取行列维度数

    select madlib.matrix_ndims('mat_a','row=row_id, val=row_vec'),
           madlib.matrix_ndims('mat_a_sparse', 'row=row_id, col=col_id');

            结果:

     matrix_ndims | matrix_ndims
    --------------+--------------
      {4,4}       | {4,4}
    (1 row)

    (13)矩阵相加

            与向量一样,矩阵也可以通过将对应元素(分量)相加来求和。MADlib的矩阵相加函数要求两个矩阵具有相同的行数和列数。更明确地说,假定A和B都是mXn的矩阵,A和B的和是mXn矩阵C,其元素由下式计算:

    drop table if exists mat_r; 
    select madlib.matrix_add('mat_b','row=row_id, val=vector', 
                             'mat_b_sparse','row=row_id, col=col_id', 
                             'mat_r', 'val=vector,fmt=dense'); 
    select * from mat_r order by row_id;

            结果:

     row_id |   vector   
    --------+--------------
          1 | {18,20,4,8}
          2 | {10,6,10,4}
          3 | {0,2,4,6}
          4 | {4,18,0,8}
          5 | {6,16,14,14}
    (5 rows)

            madlib.matrix_add函数有三组参数,分别指示两个相加的矩阵表和结果矩阵表。相加的两个矩阵表不必有相同的表示形式,如上面的函数调用中,两个矩阵一个为稠密形式,一个为稀疏形式。但两个矩阵必须具有相同的行列数,否则会报如下错误:

    Matrix error: The dimensions of the twomatrices don't match

            矩阵加法具有如下性质。

    • 矩阵加法的交换律。加的次序不影响结果:A + B = B + A。
    • 矩阵加法的结合律。相加时矩阵分组不影响结果:(A + B) + C = A + (B + C)。
    • 矩阵加法单位元的存在性。存在一个零矩阵(zero matrix),其元素均为0并简记为0,是单位元。对于任意矩阵A,有A +0 = A。
    • 矩阵加法逆元的存在性。对于每个矩阵A,都存在一个矩阵-A,使得A +(-A) = 0。-A的元素为。 

    (14)标量与矩阵相乘

            与向量一样,也可以用标量乘以矩阵。标量α和矩阵A的乘积是矩阵B =αA,其元素由下式给出:

            如下面matrix_scalar_mult函数执行结果是由原矩阵的每个元素乘以3构成的矩阵表。

    drop table if exists mat_r; 
    select madlib.matrix_scalar_mult('mat_a','row=row_id, val=row_vec', 3, 'mat_r'); 
    select * from mat_r order by row_id;

    结果:

     row_id |   row_vec   
    --------+---------------
          1 | {27,18,15,24}
          2 | {24,6,6,18}
          3 | {9,27,27,27}
          4 | {18,12,6,6}
    (4 rows)

            矩阵的标量乘法具有与向量的标量乘法非常相似的性质。

    • 标量乘法的结合律。被两个标量乘的次序不影响结果:α(βA) = (αβ)A。
    • 标量加法对标量与矩阵乘法的分配率。两个标量相加后乘以一个矩阵等于每个标量乘以该矩阵之后的结果矩阵相加:(α+β)A =αA +βA。
    • 标量乘法对矩阵加法的分配率。两个矩阵相加之后的和与一个标量相乘等于每个矩阵与该标量相乘然后相加:α(A + B)=αA + αB。
    • 标量单位元的存在性。如果α=1,则对于任意矩阵A,有αA =A。

             我们可以认为矩阵由行向量或列向量组成,因此矩阵相加或用标量乘以矩阵等于对应行向量或列向量相加或用标量乘它们。

     (15)矩阵乘法

            我们可以定义矩阵的乘法运算。先定义矩阵与向量的乘法。

            矩阵与列向量的乘法mXn矩阵A乘以nX1的列矩阵u的积是mX1的列矩阵 v=Au,其元素由下式给出:

            换言之,我们取A的每个行向量与u的转置的点积。注意,在下面的例子中,u的行数必然与A的列数相等。

            类似地,我们可以定义矩阵被行向量左乘。

            矩阵与行向量的乘法1Xm的行矩阵u乘以mXn矩阵A的积是1Xn的行矩阵v=uA,其元素由下式给出:

            换言之,我们取该行向量与矩阵A的每个列向量的转置的点积。下面给出一个例子:

            MADlib的matrix_vec_mult函数用于计算一个mXn矩阵乘以一个1Xn的矩阵(向量),结果是一个1Xm的矩阵。如下面的5X4的矩阵mat_b乘以一个1X4的矩阵,结果一个1X5的矩阵。

    dm=# select * from mat_b;
     row_id |  vector  
    --------+------------
         1 | {9,10,2,4}
         2 | {5,3,5,2}
         3 | {0,1,2,3}
         4 | {2,9,0,4}
         5 | {3,8,7,7}
    (5 rows)
    
    dm=# select madlib.matrix_vec_mult('mat_b','row=row_id, val=vector', 
    dm(#                               array[1,2,3,4]);
     matrix_vec_mult 
    ------------------
     {51,34,20,36,68}
    (1 row)

            可以用下面的查询验证矩阵乘以向量的结果。

    dm=# select array_agg(madlib.array_dot(vector,array[1,2,3,4])) from mat_b;
       array_agg    
    ------------------
     {51,34,20,36,68}
    (1 row)

            我们定义两个矩阵的乘积,作为上述概念的推广。mXn矩阵A与nXp矩阵B的积是mXp矩阵C=AB,其元素由下式给出:

            换言之,C的第 ij 个元素是A的第 个行向量与B的第 个列向量转置的点积。

            matrix_mult函数用于矩阵相乘。如前所述,第一组参数中的矩阵列数应该与第二组参数中的矩阵行数相同,否则会报错:

    dm=# select * from mat_a;
     row_id |  row_vec 
    --------+-----------
          1 | {9,6,5,8}
          2 | {8,2,2,6}
          3 | {3,9,9,9}
          4 | {6,4,2,2}
    (4 rows)
    
    dm=# select * from mat_b;
     row_id |   vector  
    --------+------------
          1 | {9,10,2,4}
          2 | {5,3,5,2}
          3 | {0,1,2,3}
          4 | {2,9,0,4}
          5 | {3,8,7,7}
    (5 rows)
    
    dm=# drop table if exists mat_r; 
    NOTICE:  table"mat_r" does not exist, skipping
    DROP TABLE
    dm=# select madlib.matrix_mult('mat_a', 'row=row_id,val=row_vec', 
    dm(#                          'mat_b', 'row=row_id, val=vector', 
    dm(#                          'mat_r'); 
    ERROR:  plpy.Error: Matrixerror: Dimension mismatch for matrix multiplication. (plpython.c:4663)
    DETAIL:  Left matrix, coldimension = 4, Right matrix, row dimension = 5
    CONTEXT:  Traceback (mostrecent call last):
      PL/Python function"matrix_mult", line 26, in <module>
        matrix_out, out_args)
      PL/Python function"matrix_mult", line 1633, in matrix_mult
      PL/Python function"matrix_mult", line 49, in _assert
    PL/Python function "matrix_mult"
    dm=#

            可以对mat_b先进行转置,再与mat_a相乘。matrix_mult 函数调用时的trans=true参数表示先对mat_b表行列转置再进行矩阵乘法。这次的矩阵乘法计算将正常执行。

    drop table if exists mat_r; 
    select madlib.matrix_mult('mat_a', 'row=row_id,val=row_vec', 
                              'mat_b', 'row=row_id, val=vector, trans=true', 
                              'mat_r'); 
    select * from mat_r order by row_id;

            结果是一个4X5矩阵:

    row_id |      row_vec       
    --------+----------------------
          1 |{183,104,40,104,166}
          2 |{120,68,24,58,96}
          3 |{171,105,54,123,207}
          4 |{106,56,14,56,78}
    (4 rows)

            执行结果与下面的查询相同。

    drop table if exists mat_r; 
    select madlib.matrix_mult('mat_a', 'row=row_id,val=row_vec', 
                             'mat_b_sparse_r', 'row=row_id, col=col_id, val=val', 
                             'mat_r'); 
    select * from mat_r order by row_id;

            矩阵乘法具有如下性质。

    • 矩阵乘法的结合律。矩阵乘的次序不影响计算结果:(AB)C=A(BC)。
    • 矩阵乘法的分配率。矩阵乘法对矩阵加法是可分配的:A(B+ C) = AB + AC并且(B + C)A = BA + CA。
    • 矩阵乘法单位元的存在性。如果pXp矩阵的单位矩阵,则对于任意mXn矩阵A,并且

             一般地,矩阵乘法是不可交换的,即

            如果我们有一个nX1列向量u,则我们可以把mXn矩阵A被该向量右乘看作u到m维列向量v=Au的变换。类似地,如果我们用一个(行)向量左乘A,则我们可以将它看作u到n维行向量v=uA的变换。这样,我们可以把一个任意mXn矩阵A看作一个把一个向量映射到另一个向量空间的函数。

            在许多情况下,可以用更容易理解的术语描述变换矩阵。

    • 缩放矩阵(scaling matrix)不改变向量的方向,而是改变向量的长度。这等价于乘以一个乘了标量的单位矩阵得到的矩阵。
    • 旋转矩阵(rotation matrix)改变向量的方向但不改变向量的量值。这相当于改变坐标系。
    • 反射矩阵(reflection matrix)将一个向量从一个或多个坐标轴反射。这等价于用-1乘该向量的某些元素,而保持其它元素不变。
    • 投影矩阵(projection matrix)把向量置于较低维子空间。最简单的例子是修改单位矩阵,将对角线上的一个或多个1改为0。这样的矩阵消除对应于0元素的向量分量,而保留其它分量。

             当然,单个矩阵可能同时进行两种类型的变换,如缩放和旋转。

     (16)两矩阵元素相乘

            与矩阵乘法定义不同,MADlib的两矩阵元素相乘定义为C=AB,A、B、C均为mXn矩阵,C的元素由下式给出:

            MADlib的matrix_elem_mult函数执行两矩阵元素相乘,并输出结果矩阵。

    drop table if exists mat_r; 
    select madlib.matrix_elem_mult('mat_b','row=row_id, val=vector', 
                              'mat_b_sparse','row=row_id, col=col_id, val=val', 
                              'mat_r','fmt=dense'); 
    select * from mat_r order by row_id;

            结果:

    row_id |   vector    
    --------+---------------
         1 | {81,100,4,16}
         2 | {25,9,25,4}
         3 | {0,1,4,9}
         4 | {4,81,0,16}
         5 | {9,64,49,49}
    (5 rows)

    (17)求矩阵的秩

    select madlib.matrix_rank('mat_a','row=row_id, val=row_vec');

            结果:

    matrix_rank
    -------------
              4
    (1 row)

            注意,当矩阵以稀疏形式表示,并且列数大于行数时,matrix_rank函数会报错。

    dm=#select madlib.matrix_rank('mat_b_sparse_r', 'row=row_id, col=col_id, val=val');
    ERROR:  plpy.SPIError: Function"madlib.__matrix_compose_sparse_transition(doubleprecision[],integer,integer,integer,integer,double precision)": Invalidcol id. (UDF_impl.hpp:210)  (seg20hdp4:40000 pid=123035) (plpython.c:4663)
    CONTEXT:  Traceback (most recent call last):
      PL/Python function "matrix_rank",line 23, in <module>
        returnmatrix_ops.matrix_rank(schema_madlib, matrix_in, in_args)
      PL/Python function "matrix_rank",line 2702, in matrix_rank
      PL/Python function "matrix_rank",line 2672, in matrix_eval_helper
    PL/Pythonfunction "matrix_rank"
    dm=#

            矩阵的秩(rank of a matrix)常常用来刻画矩阵。设矩阵,在A中任取 行 列交叉处元素按原相对位置组成的 阶行列式,称为A的一个 阶子式。mXn矩阵A共有个 阶子式。若A有 阶子式不为0,任何 r+1 阶子式(如果存在的话)全为0,称 为矩阵A的秩,记作R(A)。

            矩阵的秩具有以下基本性质:

    • 0矩阵的秩为0。
    • 如果R(A)=r,则A中至少有一个 阶子式,所有 r+1 阶子式为0,且更高阶子式均为0,是A中非零的子式的最高阶数。
    • 矩阵转置,秩不变。
    • 0<=R(A)<=min(m,n)。
    • 如果A是nXn方阵,并且|A|≠0,则R(A)=n;反之,如果R(A)=n,则|A|≠0。

            矩阵的秩是行空间和列空间的最小维度,此维度中的向量组是线性无关的。例如,如果把一个1Xn的行向量复制m次,产生一个mXn的矩阵,则我们只有一个秩为1的矩阵。

     (18)求逆矩阵

    drop table if exists mat_r; 
    select madlib.matrix_inverse('mat_a','row=row_id, val=row_vec', 'mat_r'); 
    select row_vec from mat_r order byrow_id;

            结果:

                               row_vec                           
    --------------------------------------------------------------
     {-1.2,0.900000000000001,0.333333333333334,0.600000000000001}
     {3.20000000000001,-2.4,-1,-1.1}
     {-5.00000000000001,3.50000000000001,1.66666666666667,2}
     {2.2,-1.4,-0.666666666666668,-1.1}
    (4 rows)

            设A、B是两个矩阵,若AB=BA=E,则称B是A的逆矩阵,而A则被称为可逆矩阵。其中E是单位矩阵。

            一个实际和理论问题是矩阵是否像实数一样具有乘法逆元。首先,由于矩阵乘法的性质(即维必须匹配),如果矩阵具有逆矩阵(inverse matrix),它必须是方阵。这样,对于一个mXm的矩阵A,我们会问是否可以找到一个矩阵使得。答案是某些方阵有逆矩阵,而有些没有。

            一个mXm矩阵A有逆矩阵,当且仅当矩阵的秩R(A)=m,此时方阵A的行列式不为零,即|A|≠0,称A为非奇异矩阵或满秩矩阵,否则称A为奇异矩阵或降秩矩阵。满秩方阵的行、列向量组都是线性无关的。从概念上讲,一个mXm矩阵有逆矩阵,当且仅当它把每个非零m维行(列)向量都映射到一个唯一的非零m维行(列)向量。在求解各种矩阵方程时,逆矩阵的存在性是很重要的。

            下面看一个不可逆矩阵的例子。

    create table t1 (a int, b int[]);
    insert into t1 values
    (1,'{1,2,3}'),(2,'{2,4,6}'),(3,'{3,6,9}');
    
    select madlib.matrix_rank('t1', 'row=a,val=b');
    select madlib.matrix_inverse('t1', 'row=a,val=b', 't2');
    select * from t2 order by a;

            3阶矩阵t1的秩为1,用matrix_inverse求t1的逆矩阵,结果如下:

    a |            b            
    ---+--------------------------
     1 |{NaN,NaN,NaN}
     2 |{-Infinity,Infinity,NaN}
     3 |{Infinity,-Infinity,NaN}
    (3 rows)

            如果求逆的矩阵不是方阵,则matrix_inverse函数会报如下错误:

    Matrix error: Inverse operation is onlydefined for square matrices

    (19)求广义逆矩阵

            把逆矩阵推广到不可逆方阵(奇异矩阵)或长方矩阵上,这就是所谓的广义逆矩阵。广义逆矩阵具有逆矩阵的部分性质,并且在方阵可逆时,它通常与逆矩阵一致。

    drop table if exists mat_r; 
    select madlib.matrix_pinv('mat_a','row=row_id, val=row_vec', 'mat_r'); 
    select row_vec from mat_r order byrow_id;

            结果:

                                      row_vec                                 
    ---------------------------------------------------------------------------
     {-1.20000000000001,0.900000000000004,0.333333333333335,0.600000000000003}
     {3.20000000000002,-2.40000000000001,-1,-1.10000000000001}
     {-5.00000000000003,3.50000000000002,1.66666666666667,2.00000000000001}
     {2.20000000000001,-1.40000000000001,-0.66666666666667,-1.1}
    (4rows)

            matrix_pinv函数用于求矩阵的广义逆矩阵。还以上面的不可逆方阵为例,求它的广义逆矩阵。

    drop table if exists t1,t2;
    create table t1 (a int, b int[]);
    insert into t1 values
    (1,'{1,2,3}'),(2,'{2,4,6}'),(3,'{3,6,9}');
    
    select madlib.matrix_pinv('t1', 'row=a,val=b', 't2');
    select * from t2 order by a;

            结果:

    a |                              b                             
    ---+-------------------------------------------------------------
     1 |{0.00510204081632653,0.0102040816326531,0.0153061224489796}
     2 |{0.0102040816326531,0.0204081632653061,0.0306122448979592}
     3 |{0.0153061224489796,0.0306122448979592,0.0459183673469388}
    (3 rows)

            再看一个长方矩阵的例子。

    drop table if exists mat_r; 
    select madlib.matrix_ndims('mat_b','row=row_id, val=vector'),
           madlib.matrix_pinv('mat_b', 'row=row_id, val=vector', 'mat_r'); 
    select * from mat_r order by row_id;

            mat_b是一个5X4矩阵,它的广义逆矩阵如下:

    row_id|                                              vector                                              
    --------+----------------------------------------------------------------------------------------------------
          1 |{0.169405974490348,-0.000368687326811998,0.153584606426279,-0.123375654346853,-0.0920196750284563}
          2 |{-0.0977762692158761,0.0690615737096675,-0.292887943436732,0.173906300749372,0.0622886509652684}
          3 | {-0.145985550968097,0.18130052991488,-0.238906461684316,0.0186947883412873,0.123325910818632}
          4 |{0.167425011631207,-0.222818819439771,0.534239640910248,-0.134386530622994,-0.0413193154120082}
    (4rows)

            设A为m×n矩阵,如果存在n×m阶矩阵G,满足条件 ① AGA=A,② GAG=G, ③(AG)*=AG, ④ (GA)*=GA,式中*表示共轭后再转置,则称G为A的广义矩阵。

    (20)提取矩阵的特征值

    drop table if exists mat_r; 
    select madlib.matrix_eigen('mat_a','row=row_id, val=row_vec', 'mat_r'); 
    select * from mat_r order by row_id;

            结果:

    row_id |      eigen_values     
    --------+------------------------
         1 | (22.2561699851212,0)
         2 | (-0.325748023524478,0)
         3 | (2.91179834025418,0)
         4 | (-2.8422203018509,0)
    (4 rows)

            特征值和特征向量,连同相关的奇异值和奇异向量概念,捕获了矩阵的结构,使得我们可以分解矩阵,并用标准形式表示它们。因此,这些概念可以用于数学方程求解、维归约和降低噪声。

            n阶方阵A的特征值和特征向量分别是标量值λ和向量u,它们是如下方程的解:Au=λu

            换言之,特征向量(eigenvector)是被A乘时除量值外并不改变的向量。特征值(eigenvalue)是缩放因子。该方程也可以写成(A-λE)u = 0,其中E为单位矩阵。|A-λE|是一个n次多项式,它的全部根就是n阶方阵A的全部特征值。如果n阶矩阵A的全部特征值为,则

    (21)求矩阵范数

            matrix_norm函数用于求矩阵范数,支持的类型值有‘fro’、‘one’、‘inf’、‘max’、‘spec’,分别代表frobenius范数、1范数、infinity范数、max范数和spectral范数。缺省为frobenius范数。

    select madlib.matrix_norm('mat_b_sparse','row=row_id, col=col_id, val=val','fro');

            结果:

     matrix_norm 
    ---------------
     23.4520787991
    (1 row)

            F-范数的公式为:。依据公式下面查询的结果与matrix_norm函数的返回值相等。

    select sqrt(sum(power(val,2))) frommat_b_sparse;

    (22)求矩阵核范数

    select madlib.matrix_nuclear_norm('mat_a','row=row_id, val=row_vec');

            结果:

    matrix_nuclear_norm
    ---------------------
           34.322635238
    (1 row)

            矩阵的核范数是指矩阵奇异值的和,关于矩阵奇异值,在讨论MADlib的矩阵分解函数时再进行详细说明。

    四、矩阵与数据分析

            我们可以把数据集表示成数据矩阵,其中每一行存放一个数据对象,而每一列是一个属性。(同样,我们也可以用行表示属性,列表示对象。)矩阵表示为我们的数据提供了紧凑、结构良好的表示,使得我们可以很容易地通过各种矩阵运算对数据对象或属性进行操作。

            线性方程组是使用数据的矩阵表示的很常见的例子。线性方程组可以写成一个矩阵方程Ax=b,并使用矩阵运算求解。

            特殊地,如果A有逆矩阵,则该方程组的解为。如果A没有逆矩阵,则该方程组或者没有解,或者有无穷多个解。注意,在这种情况下,行(数据对象)是方程,列是变量(属性)。

            对于许多统计学和数据分析问题,我们希望解线性方程组,但是这些线性方程组不能使用刚才介绍的方法求解。例如,我们可能有一个数据矩阵,其中行代表病人,而列代表病人的特征(身高、体重和年龄)和他们对特定药物治疗的反应(如血压的变化)。我们想把血压(因变量)表示成其它(自)变量的线性函数,并且可以用上面的方法写一个矩阵方程。然而,如果我们的病人比变量多(通常如此),则矩阵的逆不存在。

            在这种情况下,我们仍然想找出该方程的最好解。这意味着我们想找出自变量的最好线性组合来预测因变量。使用线性代数的术语,我们想找尽可能接近向量b的向量Ax;换句话说,我们希望最小化向量b-Ax的长度‖b-Ax‖。这称作最小二乘(least square)问题。许多统计学技术(例如线性回归)都需要解最小二乘问题。可以证明,方程Ax=b的最小二乘解是

            在分析数据时,特别是对于维归约,奇异值和特征向量分解也非常有用。维归约还可以带来降低噪声的效果。


    展开全文
  • 2017 年的AI技术已经汇聚了大量资本,在国务院出台的《新一代人工智能发展规划》中,人工智能核心产业规模计划在2030年超过1万亿元。随着 AI 技术的渗透,将会有越来越多的企业不得不重视人工智能带来的变革,据...
  • 爬虫实例分析:舆情信息汇聚 一. 互联网信息抓取 随着网络的迅速发展,Internet (万维网)成为当今世界最大的信息载体,每天又有不可计数的新数据涌入Internet 中。如今, 人们面临的一个巨大的挑战就是如何从...
  • 这是傅一平的第310篇原创“与数据同行”开通了微信群,现已汇聚了3000位小伙伴了,长按以下二维码发送“入群”后加入。正文开始有天跟某个行业的朋友聊天,谈起团队建设,我说你们团队有不少年...
  • 据市场调研机构赛迪预计,2018年的人工智能市场将突破200亿元,更有专家预测,今年将是名副其实的人工智能元年...小米科技创始人雷军2017 年的AI技术已经汇聚了大量资本,在国务院出台的《新一代人工智能发展规划》中,
  • 讯飞A.I.开发者大赛2020年全球经济形势风云变幻,科大讯飞丰富的业务数据及业务背景,汇聚产学研各界力量,选拔出一批优秀开发者及依托创意团队,通过百万奖金、孵化空间、资本对接等方式推进...
  • 来自IBM、微软、盛大、FaceBook、阿里巴巴等众多企业的技术领袖全部汇聚,共同剖析当前IT技术发展大势,分享在各自领域的技术成就与成功秘诀。 淘宝技术研发部-数据产品部总监赵昆,在大会现场做题
  • 2017 年,AI技术汇聚了大量资本,在国务院出台的《新一代人工智能发展规划》中,人工智能核心产业规模计划在2030年超过10000亿元。据市场调研机构赛迪预计,2018...
  • 2017 年,AI技术汇聚了大量资本,在国务院出台的《新一代人工智能发展规划》中,人工智能核心产业规模计划在2030年超过10000亿元。据市场调研机构赛迪预计,2018...
  • 2017 年,AI技术汇聚了大量资本,在国务院出台的《新一代人工智能发展规划》中,人工智能核心产业规模计划在2030年超过10000亿元。据市场调研机构赛迪预计,2018年的人工智能市场将突破200亿元。目前,中国的人工...
  • 摘要:9月24日,第五届中国计算机学会(CCF)大数据与计算智能大赛(Big Data & Computing ...数据已经成为战略资源及经济资产,通过机器学习方法来挖掘分析海量数据,鼓励学科交叉跨界合作,探索以大数据为基
  • SPRINT算法通过对原始数据集进行划分,并将分块数据发给不同Map进程并行计算,使系统存储和计算资源得到有效利用,运用MapReduce各计算节点将挖掘结果数据汇聚,减少中间结果数据量,使并行挖掘时间显著减少。SPRINT算法...
  • 数据分析

    2021-02-05 17:40:33
    清洗数据:去重、转换、补缺、过滤/汇聚 分析数据:分析、挖掘、建模、回归 展示数据:Tableau可视化、数据看板 获取数据常用爬虫,其中google的插件xpath helper有重要作用,打开xpath,选中数据,按下shift键,...
  • 数据分析及其可视化

    2021-02-21 10:50:36
    明确问题 数据量化 找到核心指标 围绕核心指标,找到与其联系紧密的关联指标 数据获取 网络爬虫 数据处理 ...过滤汇聚 分析数据 分析 挖掘 建模 回归/分类 解读数据 Tableau 数据看板 ...
  • 业务中台与数据中台的数据应用闭环(自动化、智能化的数据采集与汇聚;实时与离线数据打通关联;数据开发深度挖掘数据价值;开发数据服务至各业务场景中); 企业只需要一个中台,未来“业务中台”与“数据中台”...
  • 随着各行各业信息化系统的不断建设,由于不同建设时期,不同开发技术等因素,导致形成许多不同的数据源、信息孤岛,通过数据交换同步方式,抽取、汇聚数据,以实现数据整合,充分挖掘数据的价值。 TreeSoft数据库...
  • 之后汇聚内部数据和第三方数据,进行数据采集、清洗、拉通与匹配;再利用基于机器学习的营销模型不断学习与完善,最后将合适的信息适时推荐给用户,实现营销活动与用户需求的精准匹配和及时响应,拉动业务的提升。 ...
  • 深度融合信息(对私家车出行的调查数据)、物理(动力电池的充放电物理模型)以及社会(实际用户对电价或激励的响应)因素,借鉴平行系统思想,以软件定义的方式构建映射真实电动汽车群体的平行人工电动汽车群体,研究电动...
  • 挖掘 报表制作 索引数据 APP采集 补缺 建模 数据分享 压缩归档 网络爬虫 过滤/汇聚 回归/分类 具体工作内容 收集和解释数据 分析结果 将结果报告给业务的相关成员 识别数据集的模式和趋势 与业务或管理团队...
  • 一场金融危机将智能电网这个为绝大多数人所不熟悉的概念变成全球热门话题,为促进经济复苏以及随着全球各国面临...通过优化模型对数据进行深度挖掘和分析,预测电能流的情况,如电压变化和用电量分布,为发电、输电、
  • 在数字经济发展的推动下,数据汇聚、融合、流动与应用等场景大幅增加,数据应用技术的复杂性、数据海量汇聚的风险性、数据深度挖掘的隐私安全性都对网络数据安全保护提出新挑战。以安全与信息化为一体之两翼驱动之...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

数据挖掘汇聚