精华内容
下载资源
问答
  • 在区块链社区的对等网络中,没有管理员之类的角色对于人们的交易进行集权控制,而是使用共识机制对于人们的交易行为进行验证确认,并在网络中直接对于价值信息进行传递。也就是说在一个互不信任的网络中,区块链中...

    我们正站在新变革来临的边缘,互联网正在经历去中心化的阶段。经过了20年的科学研究,在密码学领域和去中心化计算网络上都产生了新的进展,带来诸如区块链技术(blockchain)之类的前沿技术,而这些技术可能潜含着从底层的改变社会运转方式的力量。

    5月26日,美国国防部宣布与加密通讯开发商ITAMCO签署合同,共同开发用在美国军方的基于区块链的创新应用——一款“安全,不可侵入的消息传递、交易平台”。据称,这项合作计划能够为美国军方更安全地在总部和地面部队之间的通讯、专员及五角大楼之间的情报传递提供安全可靠的通道并确保不可侵入。

    区块链这个名词,对于大部分读者而言并不陌生,但区块链技术背后的特点、价值、应用在安全领域的作用、当前的技术局限,大家却未必完全熟悉。在此背景下,本文将带领大家细细来看区块链的安全优势及其局限。

    一、区块链价值:帮助解决信任问题

    首先,区块链是什么?人们或多或少都已听过这个名词,知道区块链是一种分布式共享加密数据库。正如大家所知道的那样,区块链是一种分布式共享加密数据库。中国工信部在2016年将其定义为一种分布式数据存储、点对点传输、共识机制、加密算法等计算机技术在互联网时代的创新应用模式。在实际交易过程中,区块链使用过程包括节点的连接、交易和记账等基本步骤。


    1.1 区块链技术发展历程

    区块链技术本身最早在2008年得到提出,中本聪在一次密码学探究分享会上提出了比特币的概念及其背后的技术方法。比特币这套数字货币运行系统的底层所运用的技术即是区块链技术及其思想的原型。潜藏在比特币背后的区块链,是被设计用来达到一种去中心化的、无需信任的货币运行平台。任何互不了解的人可以通过加入该总账,通过点对点的记账、数据传输、认证或是合约,而不需要借助任何一个中间方就能来达成信用共识。这个总账包括了过去所有的交易记录、历史数据及其他相关信息,所有信息都分布式存储并透明可查,并以密码学协议的方式保证其不能被非法篡改。

    在2010年,比特币成立了交易所,并逐渐被更多人了解。至2011年开始,其全球化趋势愈加强烈,对于区块链技术进行投资和研究的机构也迅速增多,区块链技术从初级的实现程度不断得到补充和完善。此举让比特币货币体系得到迅速的成长机会,但其设计之初相对简单的货币运行体制也得到了一定的挑战:文件访问权限的丢失,服务器密码的泄漏、货币失窃、匿名货币难以追踪监管等漏洞让人们发现了这个货币体制的缺陷。这些不足甚至影响到人们对于比特币的信任及其货币价值,但也以此作为契机,更多的人增加了对于底层区块链技术的关注。

    由此,在2015-2016年区块链技术度过了停留在理论和研究的阶段,走向应用。许多传统金融机构、创业企业及其他组织从实际应用的方面使用了该项技术,如交易结算、物联网、数字资产管理、股权交易、公证、供应链等领域。随着行业的发展,各个国家及地方组织也加强了对区块链的潜能研究及监管。

    到现在,这种最先隐藏在比特币底层的分布式账本技术逐渐走向公众的视线,甚至成为学术乃至产业界的“热点”话题,其可能比数字货币本身更具价值的本质特点受到了越来越多的重视。

    一以概之,区块链的价值在于其安全性上——它能够解决信任问题。

    1.2 区块链的共识机制


    自互联网连接世界各地的计算机及人类之后,信任问题都是由第三方企业、银行机构、政府部门等大型中介解决的。人们在网络上进行身份认证、银行转账、消费交易,都是基于对这些大型中介的信任。大型中介在运营平台,提供服务的同时,从大量的交易中抽取一部分佣金作为利润来源,“雪球”随之越滚越大,人们对其的信任感也随着“网络效应”持续增长。

    与此相反,区块链提出的是一种所谓的“机器信任”或“民主化的信任”。在区块链社区的对等网络中,没有管理员之类的角色对于人们的交易进行集权控制,而是使用共识机制对于人们的交易行为进行验证确认,并在网络中直接对于价值信息进行传递。也就是说在一个互不信任的网络中,区块链中提出的解决方案是让各个节点出于自身利益最大化的考虑,自动遵循某种规则进行交易记录的真实性验证,然后将经过判断后真实的交易记入区块链中。

    目前,现在常见的共识机制为四种,分别是工作量证明算法(PoW)、权益证明算法(PoS)、股份授权证明(DPoS)以及Pool验证池。

    在大家平常比较熟悉的比特币中使用的共识算法既是工作量证明算法(PoW),网络中的节点需要通过一定工作量的计算得到随即哈希散列的数值解,才能通过节点竞争获取记账的权利(挖矿)。一般节点的计算机算力越强越容易得到记账权利及相应奖励。但这种共识机制会有一些局限,也因为耗费计算机算例和资源遭人诟病。

    随后在PoW的基础上改进而来的PoS——权益证明机制,需要记账用户对于区块链中数字资产的所有权益的证明。相对而言,拥有数字资产越多,寻找随机数的速度就越快。因为拥有资产越多的人,也越不愿意自己的资产蒙受损失吧。

    二、区块链安全优势

    如今黑客可以破坏整个网络、篡改数据或诱导粗心的用户落入安全陷阱。他们窃取盗用身份信息,并通过对中心化数据库的攻击及单点故障引发其他安全威胁。但区块链技术中的数据存储和共享数据的模式,与目前信息安全是截然不同的做法。比特币和以太坊都使用相同的密码学技术来保障安全交易,但现在也能够作为一种防范安全攻击和安全威胁的工具。

    区块链在信息安全上的的优势主要在于以下三个方面:

    1.利用高冗余的数据库保障信息的数据完整性

    2.利用密码学的相关原理进行数据验证,保证不可篡改

    3.在权限管理方面,运用了多私钥规则进行访问权限控制

    利用区块链的安全优势可以进行多重安全应用的开发。目前已有的安全应用场景是PKI,认证等,在此可以简单以两个例子进行说明。

    由MIT开发的CertCoin可能是第一个应用基于区块链的PKI。 PKI是一种常见形式的公钥密码可以用来保护邮件,消息应用,网站和其他形式的通讯。然而由于多数PKI接口需要依赖中心化的,受信任的第三方认证机构(CA)来发行、吊销、和为每个参与者保存钥匙对,黑客能够通过冒用用户的身份进入加密通讯中获取信息。而CertCoin移除了中心化的权利机构,使用区块链作为分布式账本分发公钥,能够有效降低黑客单点侵入的风险。


    而在认证领域,同样也有很多例子,如公政通Factom系统。它基于区块链建立链式结构的存储,将认证分解成存在性证明、过程性证明和可审计证明三部分。对于任何数字资产的认证处理,都可以按照这三个步骤实现数据记录的安全性和监督合规。

    三、 区块链安全局限

    然而,现在的区块链尽管不断得到研究、应用,依旧存在着一定的安全局限,导致在技术层和业务层都面临诸多挑战。这些挑战也许会是区块链得到更广泛推广及应用时的难点,也可能成后今后区块链技术的技术突破点。

    3.1 对共识机制的挑战

    对于区块链技术中的共识算法现在已经提出了多种共识机制,最常见的如PoW、PoS系统。但这些共识机制是否能实现并保障真正的安全,需要更严格的证明和时间的考验。

    区块链中采用的非对称加密算法可能会随着数学、 密码学和计算技术的发展而变的越来越脆弱。以现在超级计算机的算力为例,产生比特币SHA256哈希算法的一个哈希碰撞大约需要2^48年, 但随着今后量子计算机等新计算技术的发展, 未来技术中对于非对称加密算法可能具有一定的破解性。其次,在比特币的机制下,私钥是存储在用户的本地终端中,如果用户的私钥被偷窃,依旧会对用户的资金造成严重损失。区块链技术上的私钥是否容易窃取的问题仍待进一步的探索与解决。

    3.2 51%攻击

    在比特币中,如果一个人控制节点中绝大多数的计算资源,他就能掌控整个比特网络并可以按照自己的意愿修改公有账本。这被称为51%攻击,一直是比特币系统中受到诟病的设计之一。

    即便这还是一种理论上的假想,这种51%攻击会很有意思。由于真实的区块链网络是自由开放的,所以区块链网络上没有一个管理员能够阻止拥有足够多计算资源(实际上会需要花费很多资源)的人做任何事情。如果这样的攻击发生了,该种数字货币的信用可能会丧失,货币价值会迅速下降。

    拥有整个网络51%算力的人可以做到以下这些事情:

    1.他们可以不经过验证就阻止交易的发生,让交易变得无效,潜在地阻止人们交易货币。

    2.他们在掌控网络的这段时间内也可能你想改变交易的双方(出现双重花费问题),并且可能阻止其他的人寻找到新的区块。

    比特币和其他加密货币都是基于区块链系统的,因此也可以称作分布式账本。这些数字文件记录在每个交易中被创造出来,存储在加密货币网络上,网络节点上的任何用户都可以浏览记录,这意味着没有人能够将货币花费两次,如果能够伪造货币进行支付,这会迅速摧毁对于该种货币价值的信任。

    由于区块链中包含了一系列的区块,区块中包含的是大量存储在一段给定时间内完成的交易数据(对于比特币,大约每10分钟产生一个新区块)。一旦区块被发现,或“挖矿”成功,就不再能够改变,因为分布式账本中的伪造版本很快就能被网络用户识别并遭到拒绝。然而,通过控制网络上绝大部分的算力(>51%),攻击者就可以介入记录新区块的过程中。他们可以阻止其他挖矿者的开采,从理论上垄断新区块的生成并获取成果(对于比特币,奖励会是12.5个新比特币,数量是会随着时间递减,最后会降到0)。他们可以阻止其他用户进行交易。他们可以进行交易,然后撤销交易,表现成依然拥有刚才支付出去的货币的样子。这个漏洞,被称为双重花费,是对于区块链而言最急需跨越的加密货币障碍。一个能够允许双重花费的网络系统是会迅速失去用户信任的。但即便是在51%攻击中,攻击者想要改变已经发生在区块上的交易信息依旧是非常困难的。因为攻击开始之前的交易是与之前的区块牢牢绑定在一起的,越历史悠久的交易信息想要修改就越是不可能的。

    拥有足够算力可能会导致系统上的混乱(上述这些都是不被允许的事情),但并不会迅速破坏这个区块网络体系——至少不是在很短的时间内。他们无法反转以前发生的历史交易,也无法凭空创造新的资产(除非是正常挖矿),或者从其他用户的钱包中偷取数字资产。

    在现实情况下,发起51%攻击是具有一定可行性的,特别是随着矿池兴起的当下。尽管攻击者的潜在威胁并不大,我们也应该考虑到这种针对区块链系统的安全威胁的存在并寻找解决策略。

    3.3  N@S攻击 

    针对PoW共识算法容易遭受51%攻击的问题,一些研究人员对PoW共识算法进行了改进,现在有基于PoS共识的区块链系统。它一定程度上已经能够面对51%攻击问题,但在解决旧有问题的同时,也引入了区块分叉时的N@S (Nothing at stake)攻击问题。

    虽然每个区块只有一个父区块,但在某些情况下一个区块可以暂时拥有两个子区块。这种分叉状态出现时,一般是两个矿工都在短时间内发现了工作量的解答,然后将所添加的传播到临近网络中去,其他节点便慢慢形成两种版本(子区块)的区块链。区块链中规定,这种情况下的判定条件是选择工作总量最大的那条子区块。

    出于自身利益最大的考虑,节点上可以同时在两个分支上继续工作,以保证利益的获取。假设99%的节点用户都如此理性地考虑收益的话,即便攻击者只掌握1%的权益依旧可以决定区块链的分支走向。他可以发出交易请求,获得资产 ,然后再从另一条分支上获取添加货币到自己的钱包中。

    现在已有中国研究者提出了共识算法改进建议,通过构造同时依赖高算力和高内存的PoW共识算法可以实现51 %攻击问题的解决,但更为安全和有效的共识机制尚有待于更加深入的研究和设计。

    四、结束语


    科技的精灵已经从瓶中跑了出来,但我们还不知道真正降临的时刻。

    ——Don Tapscott

    优势与局限,恰如剑之双刃,我们期待着区块链技术的更新和完善,盼望理念真正落入现实——建立起去中心化的可信网络。随着互联网与信息技术的快速发展的当今时代,区块链技术给我们带来了新的可能的同时也提出了新的安全挑战,如何挖掘和完善新技术的优势并不断破除安全局限,也许是下阶段需要思考的问题。


    展开全文
  • 数据分析简单例子

    万次阅读 多人点赞 2018-01-31 16:43:51
    数据挖掘是在大型数据存储库中,自动地发现有用信息的过程。数据挖掘技术用来探查大型数据库,发现先前未知的有用模式。 数据挖掘(Data mining)是一个跨学科的计算机科学分支。它是用人工智能、机器学习、统计学...

    数据挖掘是一种技术,它将传统的数据分析方法与处理大量数据的复杂算法相结合。

    数据挖掘是在大型数据存储库中,自动地发现有用信息的过程。数据挖掘技术用来探查大型数据库,发现先前未知的有用模式。

    数据挖掘(Data mining)是一个跨学科的计算机科学分支。它是用人工智能、机器学习、统计学和数据库的交叉方法在相对较大型的数据集中发现模式的计算过程。

    数据挖掘的基本任务

    • 利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业的竞争力。

    数据挖掘建模过程

    • 定义挖掘目标、数据取样 、数据探索 、数据预处理、挖掘建模、模型评价

    Python 数据挖掘相关扩展库

    • Numpy 提供数组支持,以及相应的高效的处理函数

    • Scipy 提供矩阵支持,以及矩阵相关

    • Matplotlib 强大的数据可视化工具,作图库

    • Pandas 强大、灵活的数据分析和探索工具

    • StatsModels 统计建模和计量经济学,包括描述统计,统计模型估计和推断

    • Scikit-Learn 支持回归、分类、聚类等强大的机器学习库

    • Keras 深度学习库,用于建立神经网络以及深度学习模型(Anaconda Navigator)

    • Gensim 用来做文本主题模型的库,文本挖掘可能用到

      • Numpy 基本操作 (数组的操作)
    import numpy as np
    a= np.array([2,0,1,5])
    print a,type(a)
    print (a[:3])
    print (a.min())
    a.sort()
    print (a)
    b=np.array([[1,2,3],[4,5,6]])
    print b
    print (b*b)
    print (b**2)
    
    [2 0 1 5] <type 'numpy.ndarray'>
    [2 0 1]
    0
    [0 1 2 5]
    [[1 2 3]
     [4 5 6]]
    [[ 1  4  9]
     [16 25 36]]
    [[ 1  4  9]
     [16 25 36]]
    
    • Scipy (矩阵预算,线性代数、积分、插值、FFT、信号处理、图像处理等的计算)

    求解线性方程组和数值积分

    from scipy.optimize import fsolve # 导入求解方程组的函数
    def f(x):
        x1=x[0]
        x2=x[1]
        return [2*x1-x2**2-1,x1**2-x2-2]
    result=fsolve(f,[1,1])
    print (result)
    
    from scipy import integrate #导入积分函数
    def g(x):
        return (1-x**2)**0.5
    pi_2,err=integrate.quad(g,-1,1)
    print (pi_2*2),err
    [ 1.91963957  1.68501606]
     3.14159265359 1.00023567207e-09
    
    • Matplotlib 作图的基本代码
    import numpy as np
    import matplotlib.pyplot as plt
    
    x=np.linspace(0,10,1000) #作图的变量自变量
    y=np.sin(x)+1
    z=np.cos(x**2)+1
    
    plt.figure(figsize=(8,4)) #设置图像大小
    plt.plot(x,y,label='$ sin x+1 $',color='red',linewidth=2) #作图,设置标签、线条颜色,宽度
    plt.plot(x,z,'b--',label='$cos x^2+1$')
    plt.xlabel('Time(s) ')
    plt.ylabel('Volt')
    plt.title('A Simple Example')
    plt.ylim(0,2.2)
    plt.legend() #显示图例
    plt.show()
    

    这里写图片描述

    np.random.seed(1000)
    y=np.random.standard_normal(20)
    print y
    x=range(len(y))
    print x
    plt.plot(x,y)
    plt.plot(y.cumsum(),'b',lw=1.5)
    plt.plot(y.cumsum(),'ro',lw=1.5)
    plt.show()
    [-0.8044583   0.32093155 -0.02548288  0.64432383 -0.30079667  0.38947455
     -0.1074373  -0.47998308  0.5950355  -0.46466753  0.66728131 -0.80611561
     -1.19606983 -0.40596016 -0.18237734  0.10319289 -0.13842199  0.70569237
      1.27179528 -0.98674733]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    

    这里写图片描述

    np.random.seed(2000)
    #y1=np.random.standard_normal((20,2))
    y=np.random.standard_normal((20,2)).cumsum(axis=0)
    print y
    plt.figure(figsize=(9,4))
    plt.subplot(121)
    plt.plot(y[:,0],lw=1.5,label='1st')
    plt.plot(y[:,0],'ro')
    plt.grid(True)
    plt.legend(loc=0)
    plt.axis('tight')
    plt.xlabel('index')
    plt.ylabel('value')
    plt.title('1st Data Set')
    plt.subplot(122)
    plt.bar(np.arange(len(y)),y[:,1],width=0.5,color='g',label='2nd')
    plt.grid(True)
    plt.legend(loc=0)
    plt.axis('tight')
    plt.xlabel('index')
    plt.ylabel('value')
    plt.title('2st Data Set')
    [[ 1.73673761  1.89791391]
     [-0.37003581  1.74900181]
     [ 0.21302575 -0.51023122]
     [ 0.35026529 -1.21144444]
     [-0.27051479 -1.6910642 ]
     [ 0.93922398 -2.76624806]
     [ 1.74614319 -3.05703153]
     [ 1.52519555 -3.22618757]
     [ 2.62602999 -3.14367705]
     [ 2.6216544  -4.8662353 ]
     [ 3.67921082 -7.38414811]
     [ 1.7685707  -6.07769276]
     [ 2.19296834 -6.54686084]
     [ 1.18689581 -7.46878388]
     [ 1.81330034 -7.11160718]
     [ 1.79458178 -6.89043591]
     [ 2.49318589 -6.05592589]
     [ 0.82754806 -8.95736573]
     [ 0.77890953 -9.00274406]
     [ 2.25424343 -9.51643749]]
    
    
    
    
    
    Text(0.5,1,u'2st Data Set')
    

    这里写图片描述

    • pandas 的简单例子 (数据的读取、处理和探索) series(类似一维数组) dataFrame(相当于一张二维的表格,每一列都是一个Series)
    import numpy as np
    import pandas as pd
    df=pd.DataFrame([10,20,30,40],columns=['numbers'],index=['a','b','c','d'])
    df
    numbers
    a10
    b20
    c30
    d40
    df.index
    Index([u'a', u'b', u'c', u'd'], dtype='object')
    
    df.columns
    Index([u'numbers'], dtype='object')
    
    print df.ix['c']
    print df.ix[['a','d']]
    print df.ix[df.index[1:3]]
    print df.sum()
    print df.apply(lambda x:x**2)
    numbers    30
    Name: c, dtype: int64
       numbers
    a       10
    d       40
       numbers
    b       20
    c       30
    numbers    100
    dtype: int64
       numbers
    a      100
    b      400
    c      900
    d     1600
    
    df['floats']=(1.5,2.5,3.5,4.5)
    df
    numbersfloats
    a101.5
    b202.5
    c303.5
    d404.5
    df['names']=pd.DataFrame(['Yves','Guido','Feild','Fance'],index=['a','b','c','d'])
    print df
    df=df.append(pd.DataFrame({'numbers':100,'floats':5.75,'names':'Henry'},index=['Z']))
    print df
       numbers  floats  names
    a       10     1.5   Yves
    b       20     2.5  Guido
    c       30     3.5  Feild
    d       40     4.5  Fance
       floats  names  numbers
    a    1.50   Yves       10
    b    2.50  Guido       20
    c    3.50  Feild       30
    d    4.50  Fance       40
    Z    5.75  Henry      100
    
    df['floats']['a']
    1.5
    
    type(df)
    pandas.core.frame.DataFrame
    
    df['numbers']
    a     10
    b     20
    c     30
    d     40
    Z    100
    Name: numbers, dtype: int64
    
    type(df['numbers'])
    pandas.core.series.Series
    
    import matplotlib.pyplot as plt
    df['numbers'].cumsum().plot(style='r',lw=2.) #画numbers这列的累加图形
    plt.xlabel('date')
    plt.ylabel('value')
    plt.show()

    这里写图片描述

    import pandas as pd     #Series和DataFrame数据结构
    s=pd.Series([1,2,3],index=['a','b','c'])
    print s
    d=pd.DataFrame([[1,2,3],[4,5,6]],columns=['a','b','c'])
    print d
    d2=pd.DataFrame(s)
    print d2
    print d.head()
    a    1
    b    2
    c    3
    dtype: int64
       a  b  c
    0  1  2  3
    1  4  5  6
       0
    a  1
    b  2
    c  3
       a  b  c
    0  1  2  3
    1  4  5  6
    
    • StatsModels 注重数据的统计建模分析,使pytohn有R语言的味道, StatsModels支持与pandas进行数据交互,强大的数据挖掘组合
    from statsmodels.tsa.stattools import adfuller as ADF
    from pandas.core import datetools
    import numpy as np
    ADF(np.random.rand(100)) #返回的结果是ADF值和p值  单位根和概率值
    
    (-11.253758305760554,
     1.6868652157937374e-20,
     0L,
     99L,
     {'1%': -3.4981980821890981,
      '10%': -2.5825959973472097,
      '5%': -2.8912082118604681},
     31.149412019471782)
    
    • Scilit-Learn包括数据预处理、分类与预测、回归、聚类和模型分析
    from sklearn import datasets #导入数据集
    iris=datasets.load_iris()  #加载数据集
    print(iris.data.shape)
    
    from sklearn import svm #建立线性SVM分类器
    clf=svm.LinearSVC()#建立线性SVM分类器
    clf.fit(iris.data,iris.target)# 用数据训练模型
    clf.predict([[5.0,3.6,1.5,0.25]])#训练好模型之后,输入新的数据进行预测
    clf.coef_  #训练好模型的参数
    
    
    (150L, 4L)
    
    array([[ 0.18424073,  0.451224  , -0.80793865, -0.45071743],
           [ 0.0533189 , -0.89005676,  0.40352144, -0.93828342],
           [-0.85072726, -0.98671105,  1.38088737,  1.86538905]])
    
    • Keras 搭建神经网络 自编码器、循环神经网络、递归神经网络、卷积神经网络

    • Gensim 处理语言方面的任务,如文本相似度计算、word2Vec等

    数据探索

    通过检验数据集的数据质量、绘制图表、计算某些特征量等手段,对样本数据集的结构和规律进行分析的过程。
    有助于选择合适的数据预处理和建模方法。

    数据质量分析

    缺失值、异常值、不一致的值、重复数据及含有特殊符号的数据(#、¥、*)

    缺失值的处理

    • 缺失值产生的原因

      1、信息暂时无法获取,或者信息获取代价太大

      2、信息被遗漏

      3、属性值不存在

    • 缺失值的影响

      数据挖掘建模将丢失大量有用信息; 数据挖掘模型表现出的不确定性更加显著,规律难把握;包含空值的数据建模,导致不可靠的输出。

    • 缺失值分析

      统计分析的方法,可以得到含有缺失值属性的个数。 删除记录、插补、不处理

    异常值分析

    简单统计量分析(最大值,最小值)、箱形图分析

    import pandas as pd
    catering_sale='data3/catering_sale.xls'  #餐饮数据
    data=pd.read_excel(catering_sale,index_col=u'日期') #日期列为索引列
    data.head()
    销量
    日期
    2015-03-0151.0
    2015-02-282618.2
    2015-02-272608.4
    2015-02-262651.9
    2015-02-253442.1
    data.describe()
    销量
    count200.000000
    mean2755.214700
    std751.029772
    min22.000000
    25%2451.975000
    50%2655.850000
    75%3026.125000
    max9106.440000
    import pandas as pd
    
    catering_sale = 'data3/catering_sale.xls' #餐饮数据
    data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列
    
    import matplotlib.pyplot as plt #导入图像库
    plt.figure() #建立图像
    p = data.boxplot(return_type='dict') #画箱线图,直接使用DataFrame的方法
    x = p['fliers'][0].get_xdata() # 'flies'即为异常值的标签
    y = p['fliers'][0].get_ydata()
    y.sort() #从小到大排序,该方法直接改变原对象
    
    #用annotate添加注释
    #其中有些相近的点,注解会出现重叠,难以看清,需要一些技巧来控制。
    for i in range(len(x)): 
      if i>0:
        plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.05 -0.8/(y[i]-y[i-1]),y[i]))
      else:
        plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.08,y[i]))
    
    plt.show() #展示箱线图

    这里写图片描述

    数据特征分析

    分布分析(定量数据的分布分析,定性数据的分布分析)、对比分析、统计量分析、周期性分析、贡献度分析、相关性分析,了解数据的规律和趋势,为数据挖掘的后续环节提供支持。

    统计量分析:集中趋势度量(均值、中位数、众数);离中趋势度量(极差、标准差、变异系数、四分位间距);

    # 统计量分析
    import pandas as pd
    
    catering_sale = 'data3/catering_sale.xls' #餐饮数据
    data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列
    data = data[(data[u'销量'] > 400)&(data[u'销量'] < 5000)] #过滤异常数据
    statistics = data.describe() #保存基本统计量
    
    statistics.loc['range'] = statistics.loc['max']-statistics.loc['min'] #极差 最大值减最小值
    statistics.loc['var'] = statistics.loc['std']/statistics.loc['mean'] #变异系数    比较两个或多个具有不同单位或波动幅度的数据集的离中趋势
    statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%'] #四分位数间距 值越大说明变异程度越大
    
    print(statistics)
                    销量
    count   195.000000
    mean   2744.595385
    std     424.739407
    min     865.000000
    25%    2460.600000
    50%    2655.900000
    75%    3023.200000
    max    4065.200000
    range  3200.200000
    var       0.154755
    dis     562.600000
    

    贡献度分析:A1-A7总盈利占85%

    import pandas as pd
    
    #初始化参数
    dish_profit = 'data3/catering_dish_profit.xls' #餐饮菜品盈利数据
    data = pd.read_excel(dish_profit, index_col = u'菜品名')
    data = data[u'盈利'].copy()
    data.sort_values(ascending = False)
    
    import matplotlib.pyplot as plt #导入图像库
    plt.figure()
    data.plot(kind='bar')
    plt.ylabel(u'盈利(元)')
    p = 1.0*data.cumsum()/data.sum()
    p.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)
    plt.annotate(format(p[6], '.4%'), xy = (6, p[6]), xytext=(6*0.9, p[6]*0.9), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) #添加注释,即85%处的标记。这里包括了指定箭头样式。
    plt.ylabel(u'盈利(比例)')
    plt.show()

    这里写图片描述

    相关性分析:相关系数

    r=ni=1(xix¯)(yiy¯)ni=1(xix¯)2ni=1(yiy¯)2 r = ∑ i = 1 n ( x i − x ¯ ) ( y i − y ¯ ) ∑ i = 1 n ( x i − x ¯ ) 2 ∑ i = 1 n ( y i − y ¯ ) 2

    import pandas as pd
    
    catering_sale = 'data3/catering_sale_all.xls' #餐饮数据,含有其他属性
    data = pd.read_excel(catering_sale, index_col = u'日期') 
    print data.head()
    
    data.corr() #相关系数矩阵,即给出了任意两款菜式之间的相关系数
    print data.corr()[u'百合酱蒸凤爪'] #只显示“百合酱蒸凤爪”与其他菜式的相关系数
    print data[u'百合酱蒸凤爪'].corr(data[u'翡翠蒸香茜饺']) #计算“百合酱蒸凤爪”与“翡翠蒸香茜饺”的相关系数
                百合酱蒸凤爪  翡翠蒸香茜饺  金银蒜汁蒸排骨  乐膳真味鸡  蜜汁焗餐包  生炒菜心  铁板酸菜豆腐  香煎韭菜饺  香煎罗卜糕  \
    日期                                                                              
    2015-01-01      17       6        8     24   13.0    13      18     10     10   
    2015-01-02      11      15       14     13    9.0    10      19     13     14   
    2015-01-03      10       8       12     13    8.0     3       7     11     10   
    2015-01-04       9       6        6      3   10.0     9       9     13     14   
    2015-01-05       4      10       13      8   12.0    10      17     11     13   
    
                原汁原味菜心  
    日期                  
    2015-01-01      27  
    2015-01-02      13  
    2015-01-03       9  
    2015-01-04      13  
    2015-01-05      14  
    百合酱蒸凤爪     1.000000
    翡翠蒸香茜饺     0.009206
    金银蒜汁蒸排骨    0.016799
    乐膳真味鸡      0.455638
    蜜汁焗餐包      0.098085
    生炒菜心       0.308496
    铁板酸菜豆腐     0.204898
    香煎韭菜饺      0.127448
    香煎罗卜糕     -0.090276
    原汁原味菜心     0.428316
    Name: 百合酱蒸凤爪, dtype: float64
    0.00920580305184
    

    数据预处理

    数据预处理占到60%, 数据清洗、数据集成(属性冗余问题),数据变换、数据规约。

    数据清洗主要包括:缺失值处理(均值、中位数、众数插补,最近临插补、回归方法、插值法)、异常值处理(删除、视为缺失值、平均值修正)。

    y=a0+a1x+a2x2+...+an1xn1 y = a 0 + a 1 x + a 2 x 2 + . . . + a n − 1 x n − 1
    lagrange插值法:
    #拉格朗日插值代码
    #拉格朗日插值代码  
    import pandas as pd #导入数据分析库Pandas  
    from scipy.interpolate import lagrange #导入拉格朗日插值函数  
    
    inputfile = 'data4/catering_sale.xls' #销量数据路径  
    outputfile = './sales.xls' #输出数据路径  
    
    data = pd.read_excel(inputfile) #读入数据  
    #data[u'销量'][(data[u'销量'] < 400) | (data[u'销量'] > 5000)] = None #过滤异常值,将其变为空值  
    row_indexs = (data[u'销量'] < 400) | (data[u'销量'] > 5000)  #得到过滤数据的索引  
    data.loc[row_indexs,u'销量'] = None  #过滤数据  
    
    #自定义列向量插值函数  
    #s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5  
    def ployinterp_column(s, n, k=5):  
        y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数  
        y = y[y.notnull()] #剔除空值  
        return lagrange(y.index, list(y))(n) #插值并返回拉格朗日插值结果  
    
    #逐个元素判断是否需要插值  
    for i in data.columns:  
        for j in range(len(data)):  
            if (data[i].isnull())[j]: #如果为空即插值。  
    #       data[i][j] = ployinterp_column(data[i], j)  
                data.loc[j,i] = ployinterp_column(data[i], j)  
    data.to_excel(outputfile) #输出结果,写入文件  

    这里写图片描述

    数据归一化:

    #数据规范化
    import pandas as pd
    import numpy as np
    
    datafile = 'data4/normalization_data.xls' #参数初始化
    data = pd.read_excel(datafile, header = None) #读取数据
    
    (data - data.min())/(data.max() - data.min()) #最小-最大规范化
    (data - data.mean())/data.std() #零-均值规范化
    data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化
    0123
    00.0780.5210.6020.2863
    10.144-0.600-0.5210.2245
    20.095-0.4570.468-0.1283
    30.0690.5960.6950.1054
    40.1900.5270.6910.2051
    50.1010.4030.4700.2487
    60.1460.4130.4350.2571

    连续属性离散化:
    等宽离散化: 将属性的值域分成相同宽度的区间

    等频离散化:间相同数量的记录放进每个区间

    基于聚类

    #-*- coding: utf-8 -*-
    
    import pandas as pd
    
    datafile = 'data4/discretization_data.xls' #参数初始化
    data = pd.read_excel(datafile) #读取数据
    data = data[u'肝气郁结证型系数'].copy()
    print data.head(10)
    
    k = 4
    #等宽离散化
    d1 = pd.cut(data, k, labels = range(k)) #等宽离散化,各个类比依次命名为0,1,2,3
    
    #等频率离散化
    w = [1.0*i/k for i in range(k+1)]  #[0.0, 0.25, 0.5, 0.75, 1.0]
    w = data.describe(percentiles = w)[4:4+k+1] #使用describe函数自动计算分位数
    w[0] = w[0]*(1-1e-10)
    d2 = pd.cut(data, w, labels = range(k))
    
    from sklearn.cluster import KMeans #引入KMeans
    kmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型,n_jobs是并行数,一般等于CPU数较好
    kmodel.fit(data.values.reshape((len(data), 1))) #训练模型
    c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #输出聚类中心,并且排序(默认是随机序的)
    w = c.rolling(window=2,center=False).mean().iloc[1:] #相邻两项求中点,作为边界点
    #w = pd.DataFrame.rolling(window=2,center=False).mean()
    w = [0] + list(w[0]) + [data.max()] #把首末边界点加上
    d3 = pd.cut(data, w, labels = range(k))
    
    def cluster_plot(d, k): #自定义作图函数来显示聚类结果
      import matplotlib.pyplot as plt
    
      plt.figure(figsize = (8, 3))
      for j in range(0, k):
        plt.plot(data[d==j], [j for i in d[d==j]], 'o')
    
      plt.ylim(-0.5, k-0.5)
      return plt
    
    cluster_plot(d1, k).show()
    
    cluster_plot(d2, k).show()
    cluster_plot(d3, k).show()
    0    0.056
    1    0.488
    2    0.107
    3    0.322
    4    0.242
    5    0.389
    6    0.246
    7    0.330
    8    0.257
    9    0.205
    Name: 肝气郁结证型系数, dtype: float64
    

    这里写图片描述

    这里写图片描述

    这里写图片描述

    #主成分分析 降维
    import pandas as pd
    
    #参数初始化
    inputfile = 'data4/principal_component.xls'
    outputfile = './dimention_reducted.xls' #降维后的数据
    
    data = pd.read_excel(inputfile, header = None) #读入数据
    
    from sklearn.decomposition import PCA
    
    pca = PCA()
    pca.fit(data)
    print pca.components_ #返回模型的各个特征向量
    print pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
    [[ 0.56788461  0.2280431   0.23281436  0.22427336  0.3358618   0.43679539
       0.03861081  0.46466998]
     [ 0.64801531  0.24732373 -0.17085432 -0.2089819  -0.36050922 -0.55908747
       0.00186891  0.05910423]
     [-0.45139763  0.23802089 -0.17685792 -0.11843804 -0.05173347 -0.20091919
      -0.00124421  0.80699041]
     [-0.19404741  0.9021939  -0.00730164 -0.01424541  0.03106289  0.12563004
       0.11152105 -0.3448924 ]
     [-0.06133747 -0.03383817  0.12652433  0.64325682 -0.3896425  -0.10681901
       0.63233277  0.04720838]
     [ 0.02579655 -0.06678747  0.12816343 -0.57023937 -0.52642373  0.52280144
       0.31167833  0.0754221 ]
     [-0.03800378  0.09520111  0.15593386  0.34300352 -0.56640021  0.18985251
      -0.69902952  0.04505823]
     [-0.10147399  0.03937889  0.91023327 -0.18760016  0.06193777 -0.34598258
      -0.02090066  0.02137393]]
    [  7.74011263e-01   1.56949443e-01   4.27594216e-02   2.40659228e-02
       1.50278048e-03   4.10990447e-04   2.07718405e-04   9.24594471e-05]
    
    pca=PCA(3)
    pca.fit(data)
    low_d=pca.transform(data)
    low_d
    array([[  8.19133694,  16.90402785,   3.90991029],
           [  0.28527403,  -6.48074989,  -4.62870368],
           [-23.70739074,  -2.85245701,  -0.4965231 ],
           [-14.43202637,   2.29917325,  -1.50272151],
           [  5.4304568 ,  10.00704077,   9.52086923],
           [ 24.15955898,  -9.36428589,   0.72657857],
           [ -3.66134607,  -7.60198615,  -2.36439873],
           [ 13.96761214,  13.89123979,  -6.44917778],
           [ 40.88093588, -13.25685287,   4.16539368],
           [ -1.74887665,  -4.23112299,  -0.58980995],
           [-21.94321959,  -2.36645883,   1.33203832],
           [-36.70868069,  -6.00536554,   3.97183515],
           [  3.28750663,   4.86380886,   1.00424688],
           [  5.99885871,   4.19398863,  -8.59953736]])
    

    挖掘建模

    分类与预测(回归分析、决策树(ID3)、神经网络、贝叶斯网络、支持向量机)
    聚类分析
    关联规则(Apriori)
    时序模式
    偏差检测

    ID3算法核心是在决策树的各级节点上,使用信息增益方法作为属性的选择标准,来帮助确定生成每个节点时所采用的合适属性。

    I(s1,s2,...,sm)=i=1mPilog2(Pi) I ( s 1 , s 2 , . . . , s m ) = − ∑ i = 1 m P i l o g 2 ( P i )

    m表示属性值的个数, si s i 是某个属性值的样本个数, Pi P i 可以用 siS s i S ,S是s样本数据的集合。

    总信息熵:销售数量高的数据18,低的数据16, I(18,16)=1834log218341634log21634 I ( 18 , 16 ) = − 18 34 l o g 2 18 34 − 16 34 l o g 2 16 34

    是否周末属性:是的条件下,销售高的记录11,低为3,表示(11,3);不是的条件下,销售高记录7,低为13,表示(7,13);

    是否周末的属性的信息熵增益: I(18,16)(1434I(11,3)+2034I(7,13)) I ( 18 , 16 ) − ( 14 34 I ( 11 , 3 ) + 20 34 I ( 7 , 13 ) )

    
    #使用ID3决策树算法预测销量高低
    import pandas as pd
    
    #参数初始化
    inputfile = 'data5/sales_data.xls'
    data = pd.read_excel(inputfile, index_col = u'序号') #导入数据
    print data.head()
    
    #数据是类别标签,要将它转换为数据
    #用1来表示“好”、“是”、“高”这三个属性,用-1来表示“坏”、“否”、“低”
    data[data == u'好'] = 1
    data[data == u'是'] = 1
    data[data == u'高'] = 1
    data[data != 1] = -1
    print data.head()
    x = data.iloc[:,:3].as_matrix().astype(int) #前三个属性的矩阵
    y = data.iloc[:,3].as_matrix().astype(int) #销量的矩阵
    
    from sklearn.tree import DecisionTreeClassifier as DTC
    dtc = DTC(criterion='entropy') #建立决策树模型,基于信息熵
    dtc.fit(x, y) #训练模型
    
    #导入相关函数,可视化决策树。
    #导出的结果是一个dot文件,需要安装Graphviz才能将它转换为pdf或png等格式。
    from sklearn.tree import export_graphviz
    x = pd.DataFrame(x)
    from sklearn.externals.six import StringIO
    x = pd.DataFrame(x)
    with open("tree.dot", 'w') as f:
      f = export_graphviz(dtc, feature_names = x.columns, out_file = f)
    
       天气 是否周末 是否有促销 销量
    序号                 
    1   坏    是     是  高
    2   坏    是     是  高
    3   坏    是     是  高
    4   坏    否     是  高
    5   坏    是     是  高
        天气 是否周末 是否有促销 销量
    序号                  
    1   -1    1     1  1
    2   -1    1     1  1
    3   -1    1     1  1
    4   -1   -1     1  1
    5   -1    1     1  1
    

    这里写图片描述

    value=[0,6]代表0个低,6个高

    Apriori算法: 找最大K项频繁集 没一项的支持度 p(a)=7/10, 支持度为0.2(支持度计数为2)
    这里写图片描述

    #使用Apriori算法挖掘菜品订单关联规则
    import pandas as pd
    from apriori import * #apriori函数
    
    inputfile = 'data5/menu_orders.xls'
    outputfile = './apriori_rules.xls' #结果文件
    data = pd.read_excel(inputfile, header = None)
    print data.head(11)
    
    print(u'\n转换原始数据至0-1矩阵...')
    ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数
    b = map(ct, data.as_matrix()) #用map方式执行
    data = pd.DataFrame(list(b)).fillna(0) #实现矩阵转换,空值用0填充
    print(u'\n转换完毕。')
    del b #删除中间变量b,节省内存
    
    support = 0.2 #最小支持度 同时发生的概率
    confidence = 0.5 #最小置信度  A发生则B发生的概率
    ms = '---' #连接符,默认'--',用来区分不同元素,如A--B。需要保证原始表格中不含有该字符
    
    find_rule(data, support, confidence, ms).to_excel(outputfile) #保存结果
       0  1    2    3
    0  a  c    e  NaN
    1  b  d  NaN  NaN
    2  b  c  NaN  NaN
    3  a  b    c    d
    4  a  b  NaN  NaN
    5  b  c  NaN  NaN
    6  a  b  NaN  NaN
    7  a  b    c    e
    8  a  b    c  NaN
    9  a  c    e  NaN
    
    转换原始数据至0-1矩阵...
    
    转换完毕。
    
    正在进行第1次搜索...
    数目:6...
    
    正在进行第2次搜索...
    数目:3...
    
    正在进行第3次搜索...
    数目:0...
    
    结果为:
               support  confidence
    e---a          0.3    1.000000
    e---c          0.3    1.000000
    c---e---a      0.3    1.000000
    a---e---c      0.3    1.000000
    a---b          0.5    0.714286
    c---a          0.5    0.714286
    a---c          0.5    0.714286
    c---b          0.5    0.714286
    b---a          0.5    0.625000
    b---c          0.5    0.625000
    b---c---a      0.3    0.600000
    a---c---b      0.3    0.600000
    a---b---c      0.3    0.600000
    a---c---e      0.3    0.600000
    
    展开全文
  • 设计的商业价值

    千次阅读 2018-11-10 08:00:00
    我们都知道产品和服务设计不好的例子,例如 USB插头(在第三次尝试时总是很幸运)。在许多机场匆忙进行联系飞行的经历就像星球大战中死星上的排气口。 我们也都知道一些标志的设计,比如瑞士军刀,谷歌的简单主页,...

    我们都知道产品和服务设计不好的例子,例如 USB插头(在第三次尝试时总是很幸运)。在许多机场匆忙进行联系飞行的经历就像星球大战中死星上的排气口。

    我们也都知道一些标志性的设计,比如瑞士军刀,谷歌的简单主页,或者迪斯尼游客体验。 所有这些都不断提醒我们,在物理、服务和数字设置方面,强大的设计可以成为颠覆性和持续商业成功的核心。

    尽管设计伟大的产品和服务具有明显的商业效益,但始终如一地实现这一目标却是出了名的困难,而且变得越来越难。 只有最好的设计才能脱颖而出,因为像亚马逊这样的公司驱动的消费者期望迅速上升; 即时获取全球信息和评论; 硬件、软件和服务之间的界限变得模糊。 企业比以往任何时候都需要更强大的设计能力。

    那么,公司是如何提供特殊的设计,一次又一次的发布? 设计的价值是什么? 为了回答这些问题,进行了我们认为是(在写作时)最广泛和最严格的研究,以研究领导者可以采取哪些设计行动来释放商业价值。 我们的意图是建立和加强以前的研究和指数,例如设计管理学院的研究和指数。

    我们跟踪了300家上市公司在五年内在多个国家和行业的设计实践。他们的高级商业和设计领导者接受了采访或者调查。 我们的团队收集了超过两百万条财务数据,并记录了超过10万项设计行动。先进的回归分析发现了12项与改善财务表现的关联性的行动,并将这些行动分为四大主题。

    下面描述的四个优秀设计主题构成了麦肯锡设计指数(MDI)的基础,该指数根据企业在设计方面的强大程度对企业进行评级,并首次将其与每家公司的财务表现联系起来(图1)。

    640?wx_fmt=png

    图1 

    我们的研究得出了几个惊人的发现:

    1. 我们发现,高 MDI 得分和优越的业务表现之间有很强的相关性.前四分之一的 MDI 得分者的收入和股东总回报率(TRS)的增长速度大大高于其行业同行在五年期间的增长速度,即32% 的收入增长率和56% 的高于整个时期的TRS.

    2. 在我们观察的所有三个行业中,结果都是正确的:医疗技术、消费品和零售银行业务。 这表明好的设计关系到你的公司是专注于实体产品、数字产品、服务还是这些产品的组合

    3. 第四、第三和第二个四分位之间的TRS和收入差异是微不足道的,换句话说,市场对那些真正脱颖而出的公司给予了不成比例的回报(图2).

    640?wx_fmt=png

    图2 

    一个难以捉摸的奖励

    简而言之,无论是基于产品还是服务业的部门,设计驱动型增长的潜力是巨大的(图3)。 好消息是,今天有比以往更多的机会去追求以用户为中心,分析知情的设计。 客户可以实时将意见反馈给公司(以及彼此) ,使设计能够由客户自己衡量ーー不管公司是否愿意倾听。

    640?wx_fmt=png

    图3

    精益的初创企业已经展示了如何通过原型和迭代学习来做出更好的决定。 庞大的用户数据库和人工智能的进步创造了强大的新洞察力来源,并为新技术打开了大门,比如计算设计和分析的价值。 通过多种渠道,特别是社交媒体和智能设备,很容易就能快速接触到真正的客户。 所有这些发展都应该以设计领导者长期渴望的方式将用户置于商业决策的核心。

    然而,我们的研究表明,许多公司在追赶方面进展缓慢。 在接受调查的公司中,仍有超过40% 的公司在开发过程中没有与最终用户交谈。 刚刚超过50% 的人承认他们没有客观的方法来评估或设定他们的设计团队的产出目标。 由于没有明确的方法将设计与商业健康地联系起来,高级领导者往往不愿意将稀缺的资源转移到设计职能上。 这是有问题的,因为在我们的研究中发现的强大和一致的设计环境的许多关键驱动因素需要公司层面的决策和投资。 尽管许多设计师敏锐地意识到四个 MDI 主题中的一部分或全部(图4a) ,但这些主题通常不能仅仅由设计师来解决,而且往往需要多年的领导力。

    640?wx_fmt=png

    图4a

    设计领域的顶尖公司(以及领先的金融表现者)在所有四个领域都表现出色。 更重要的是,领导者似乎对 MDI 主题有一种隐含的理解。 当高级管理人员被要求说出他们组织最大的单一设计弱点时,98% 的回复被映射到 MDI 的四个主题(图4b)。

    640?wx_fmt=png

    图4b

    打开MDI

    在本文的其余部分,我们将描述四组设计行动,它们表现出与改进的财务表现最为相关的四组设计行动: 

    • 测量和驱动设计性能与收入和成本相同; 

    • 打破物理、数字和服务设计之间的内部壁垒; 

    • 使以用户为中心的设计成为每个人的责任; 

    • 通过不断倾听、测试和与终端用户进行迭代来降低开发风险。

    不仅仅是一种感觉: 这是分析型领导力

    在我们的指数中表现最好的公司在财务上明白设计是一个高层管理的问题,并以跟踪收入和成本的严谨性评估了他们的设计表现。 不过,在许多其它业务中,设计领导人表示,他们被视为二等公民。

    设计问题仍然停留在中层管理层,很少上升到 C-suite。 当他们这样做的时候,高级管理人员就凭直觉做决定,而不是具体的证据。

    设计师本身在过去也有一定的责任: 他们并不总是接受设计指标或者积极展示他们的设计如何与商业目标相联系。 然而,我们的调查毫不含糊地表明,拥有最高财务回报率的公司,通过一个大胆的、以设计为中心的愿景,将设计和商业领袖结合起来。

    640?wx_fmt=png

    图5

    一个强大的愿景,明确要求组织为了客户的利益而设计的强大愿景,会不断提醒顶级团队。 例如,T-Mobile 的首席执行官有一个个人座右铭:"闭嘴,听我说。" 宜家致力于"为许多人创造更好的日常生活。" 在麦肯锡季刊的一次采访中,皮克斯的联合创始人埃德•卡特穆尔在接受《麦肯锡季刊》(McKinsey Quarterly)采访时所言,鼓励自己的团队在新项目中承担风险: 皮克斯公司认为重复过去的商业成功公式比偶尔的商业失望对其长期生存构成了更大的威胁。

    当然,仅仅把优美的词汇钉在 C-suite 的墙上是不够的。 在我们调查的这一领域表现最好的公司保持了所有高管对客户的基本理解水平。 这些公司还对用户需要什么有着领导层的好奇心,而不是他们所说的他们想要的。 我们认识的一个顶级团队邀请客户参加每月例会,仅仅是为了讨论其产品和服务的优点。 全球最大银行之一的首席执行官每月都会与该银行的客户打交道,并鼓励所有的首席执行官也这样做。 通过个人曝光或与研究人员的持续接触,高管们可以成为他们企业的榜样,亲身体验最令顾客沮丧和兴奋的事情。

    然而,许多公司承认他们的组织高层在理解方面存在着令人担忧的差距。

    只有不到5% 的受访者表示他们的领导者可以做出客观的设计决定(例如开发新产品或进入新行业)。在一个无处不在的在线工具和数据驱动的客户反馈的时代,设计仍然没有像时间或成本那样严格地衡量设计。公司现在可以将设计指标(如满意度评级和可用性评估)纳入产品规格,就像它们包含了对材料等级的要求或者市场的目标时间。

    这种准确的洞察力的价值意义重大ーー一家在线游戏公司发现,其主页的可用性小幅度增加之后,销售额急剧增长了25%。 此外,该公司还发现,除了这些小调整之外的改进几乎没有对用户的价值观念产生任何额外影响,因此它避免了进一步的努力,而这些努力几乎没有带来多少额外的回报。

    不仅仅是一个产品: 它是用户体验

    顶级公司拥有完整的用户体验; 它们打破了物理、数字和服务设计之间的内部障碍。 用户集中的重要性,需要一个基础广泛的观点,即设计在哪里可以产生影响。 我们生活在这样一个世界里,你的智能手机可以警告你因为交通拥堵而提前离开,你的房子知道你什么时候回家,什么时候可以开暖气。 产品和服务之间的界限正在融合成一体化的经验。

    640?wx_fmt=png

    图6

    在实践中,这通常意味着绘制客户旅程(痛点和潜在的快乐来源) ,而不是从最后一个产品的"复制粘贴"技术规格开始。 这种设计方法要求通过观察和ーー更重要的是ーー了解潜在用户在他们自己的环境中的潜在需求。 这些见解必须在每次会议上得到支持。 然而,在我们调查的公司中,只有大约50% 的公司在产生他们的第一个设计想法或规格之前进行了用户研究。

    将实体产品、数字工具和"纯粹"服务结合起来,为企业提供了获取这一系列经验的新机会。 例如,酒店可能不仅仅关注入住和退房(服务元素)之间的时间,通过社交媒体或自己的应用程序(数字维度)促进早期参与,并提供旨在鼓励客户重新预订的实物纪念品。 我们所知道的一家大型连锁酒店的接待小组给离开的客人一只装饰着主办城市形象的橡皮鸭(如阿姆斯特丹的木屐和郁金香)。 这个团队包括一张便条,建议客人们可能喜欢把鸭子放在家里,以此提醒他们留在家里,并通过参观该集团的其他属性来建立一个藏品。 随着时间的推移,这种小小的接触使得保留率提高了3% 。

    设计驱动型公司不应该局限于自己的生态系统。 我们采访过的最好的企业想得更多。 准备好的饭菜受到辛勤工作的单身人士的欢迎,他们在回家的路上抓住了他们。 这些餐点的零售商已经考虑与 Netflix 合作,设计一个一键式的点餐系统,这个系统在客户收到屏幕提示信息的两个小时后就会开始播放。谷歌支付(Google Pay)和苹果支付(Apple Pay)等移动支付服务,是因为它们愿意跨越界限思考,设计更容易获取现金的方式。 钱包里的一块塑料也是一种解决方案,但是如果你已经把一个装置放在口袋里,那么使用起来容易吗?

    不仅仅是一个部门: 它是跨职能的人才

    顶尖的公司使用户为中心的设计是每个人的责任,而不是一个单独的功能。 在传统设计部门疲惫不堪的讽刺画中,一群纹身和冷漠的人在雷达的监视下运作,与组织的其他部门隔绝。 这些员工(在漫画中)认为他们是被同事们视为叛逆者或小牛,他们抱怨自己经常被那些不愿意(或不能)实现设计师宏伟愿景的工程师或营销主管灼伤。

    640?wx_fmt=jpeg

    图7

    我们并不是说这种陈规定型观念仍然普遍存在,或者说其它功能必然要归咎于其他职能,但它可能具有惊人的弹性。 例如,我们知道有一家公司推出了一个新的旗舰设计工作室,让设计团队欢呼雀跃。 不久之后,所有的设计师都已经将他们的办公桌移到了工作室里面,并且已经关闭了营销、工程和质量团队的门。 这些行动大大降低了合作的工作水平,破坏了整个企业的业绩。

    我们的研究表明,克服孤立主义倾向是非常有价值的。 我们发现的最强有力的相关性之一,就是那些表示他们可以分解功能性系统并将设计师与其他功能整合在一起。 这一点在消费品包装商业中尤其明显,在这些企业中,来自顶级四分位集成商的公司的受访者报告说,其复合年增长率比这方面最弱的公司高出约7个百分点。

    培养顶级设计人才——在每一个行业中做出巨大贡献的2%员工——是团队动力学的另一个重要方面。 获得正确的基本激励措施是其中的一部分: 在我们的调查中,在设计领域排名前四分之一的公司,对设计师提供具体激励计划的可能性几乎高出三倍。 这些程序与设计结果相关联,比如用户满意度指标或主要奖项。

    但关键是,保留优秀的设计天赋,不仅仅需要承诺获得一大笔奖金,或者成为一名顶级经理的职业道路。 这样的胡萝卜不足以留住顶尖的设计人才,如果没有自由的工作项目激发他们的热情,有时间在他们的同行参加的会议上发言,以及与更广泛的设计团体保持联系的机会。 一家CPG公司的天才设计师因其设计资质而备受尊敬,因为他们花费大量的时间为市场团队花费了大量的时间。 相反,Spotify 对顶级设计师的吸引力往往归功于其自主连接的文化,以及工作环境的多样性、趣味性以及快速进入市场。

    设计已经涉及到商业的许多方面: 人机交互、人工智能、行为经济学和工程心理学,更不用说创新和新的商业模式的发展。 虽然不是一个新概念,"T型"混合设计师,他们在保持深度设计能力的同时,在各种功能之间工作,将是最能够通过他们的工作产生切实影响的员工。

    如果他们拥有合适的工具、能力和基础设施,他们才能做到这一点。 这就需要设计软件、通信应用、深度数据分析和原型技术来提高生产力和加速设计迭代。所有这些都需要时间和投资。 我们发现成功的公司和公司之间有很强的相关性,这些公司在遇到麻烦时抵制了削减研究、原型设计或概念生成支出的诱惑。正式的设计分配应该与设计领导人合作商定,而不是在营销或工程预算中出现(他们经常这样做)。

    不止一个阶段: 它是连续迭代

    设计在鼓励学习、测试和使用者迭代的环境中最为繁荣——这些做法提高了创造突破性产品和服务的可能性,同时又能减少巨大的、昂贵的遗漏的风险。 这种做法与许多公司的普遍规范形成对照,这些规范仍然强调产品开发中的离散和不可逆设计阶段。 这种防火分区增加了消费者失去发言权的风险,或者过于依赖一次重复的声音。

    640?wx_fmt=jpeg

    图8

    最好的结果来自于不断地将用户研究——定量(如联合分析)和定性(比如人物访谈)。 这些信息应该与来自市场分析小组的报告结合起来,这些报告涉及竞争对手的行为、专利扫描以监测新兴技术、金融团队关注的商业问题等等。 如果没有这些关联和互动,开发功能最终可能会出现在真空中,从而产生其他方面的优秀工作,而这些工作从来没有见到过白天的阳光,也没有让顾客高兴。

    为了成功地改善用户体验,我们认识的一家邮轮公司直接与乘客交谈,分析支付数据,以显示哪些食物和活动在不同时间最受欢迎,并使用人工智能算法对安全摄像头进行反馈,以确定船舶布局中的低效率。 在一家医疗技术公司,混合灵感的来源意味着与一个玩具设计师谈论物理工效学和一个约会应用程序设计师关于数字界面的设计。 这些举措帮助该公司完善了一个设备,使其能够吸引有限灵巧的客户。 由此产生的产品不仅更安全、更易于使用,而且在推出时也超过了市场4个百分点。

    尽管迭代的价值很高,但在我们的调查中,几乎有60% 的公司说他们只在开发过程的后期才使用原型进行内部生产测试。 相比之下,最成功的公司有意识地培养一种文化,与外部人士分享早期原型,并庆祝萌芽思想。 他们还劝阻管理层不要迫使设计师花费数小时来完善他们早期的模型或内部演示。

    640?wx_fmt=jpeg

    图9

    以设计为中心的公司意识到产品发布并不是迭代的终结。 几乎每一个商业软件出版商都会发布不断更新,以改进其产品的发布。苹果手表是众多产品中的一款,这些产品经过调整,以反映消费者如何在"野外"使用它们。

    迈向伟大的设计

    我们意识到,许多公司都采用了这些设计方法中的一些——例如,在管理层中有强大的发言权,或者共享设计空间。 然而,我们的研究结果表明,要达到顶尖的四分之一,所有四个维度的优秀都是相对罕见的。 我们相信这有助于解释观察到公司的计量分数所反映的设计表现的戏剧性,低至43分,高达92分(图10)。

    640?wx_fmt=png

    图10

    实现顶级 MDI 业绩的公司之间的多样性表明,设计优秀是在每个企业的掌握之中,无论是产品、服务还是数字化。 通过采访以及我们与公司合作以改变他们在设计方面的优势的经验,我们还发现最有力的第一步是选择一个即将到来的重要产品或服务,并承诺使用它作为试点,使这四个要素变得正确。 这种方法比试图将设计作为整个公司的一个主题要好得多,例如,与真正的产品或服务分离开来,对跨职能工作进行试验。

    我们所知道的一个医疗设备组织在设计一种新的外科机器时,试图阻止来自竞争对手日益增长的威胁。 首席执行官和高级管理人员的承诺非常强烈; 高管奖金与产品的可用性指标和外科医生满意度的得分挂钩。 跨职能和共用同一地点的团队在两年内进行了200多次用户测试,从最早的概念到详细的功能设计。 总共,超过110个概念和原型被创建和迭代。 最终设计的可用性得分ーー客户满意度的衡量指标ーー超过了90% ,而其两大竞争对手的机器的满意度不到76% 。 最终的解决方案是结合一个物理设备,一个数字数据平台,可以无缝连接超过40个第三方手术室设备和一个服务合同。

    在过去的六个月里,公司的市场份额跃升了40% ,部分原因是投资者了解即将推出的以用户为中心的产品和服务,这些产品和服务将使公司脱离竞争,甚至更重要的是,这将改善病人的生活。

    麦肯锡设计指数(McKinsey Design Index)突出强调了企业必须采取的行动的四个关键领域,以加入设计业绩最好的四分之一。 首先,在组织的最高层,采用分析的方法来设计,通过测量和领导你的公司在这一领域的业绩,并以同样的严谨态度来衡量和领导公司在这一领域的业绩。 第二,通过软化公司内部的界限(例如在实体产品、服务和数字互动之间) ,使用户体验成为公司文化的中心。 第三,培养你的顶级设计人员,并赋予他们交叉功能团队的权力,这些团队通过集体问责来改善用户体验,同时保留其成员的功能联系。 最后,迭代、测试和快速学习,将用户的见解与第一个想法结合起来,直到最终发布之后很久。

    处理这四个优先事项的公司提高了他们成为更有创造力的组织的可能性,这些组织能够始终如一地设计出伟大的产品和服务。 对于那些进入 MDI 得分最高的四分之一的公司来说,这些奖项的丰厚程度,就如同其收入增长和股东回报率比行业同行高出一倍一样丰厚。

     

    展开全文
  • 我想在大地上画满窗子,让所有习惯黑暗的眼睛习惯...本节的内容如下:SQL Server统计信息列级统计信息统计信息与执行计划统计信息与内存分配开销预估模型SQL Server统计信息 说到统计信息,就一定要提到查询优化器,

    接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958

    我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明——顾城《我是一个任性的孩子》



    这一节主要介绍一些理论层面的东西,主要针对SQL Server,为后面的做铺垫,如果从实操层面考虑可以跳过,但是我强烈建议还是要找时间看一下这节。本节的内容如下:

    1. SQL Server统计信息
    2. 列级统计信息
    3. 统计信息与执行计划
    4. 统计信息与内存分配
    5. 开销预估模型


    SQL Server统计信息


    说到统计信息,就一定要提到查询优化器,主流关系型数据库管理系统的查询优化器都是基于开销的优化(cost-based optimizer, CBO),而优化器是生成执行计划的组件,所以执行计划的质量直接依赖于开销预估的准确性,同样,执行计划的预估开销又基于算法/操作符的使用和基数预估。所以,为了让优化器得到准确的预估开销,优化器需要尽可能准确地预估制定查询要返回的记录数。

    在查询被优化的过程中,SQLServer会分析很多候选执行计划,并预估它们的相对开销,然后选择最高效的那个执行计划。因此,不准确的基数和开销预估会引起优化器选择不高效的执行计划从而影响数据库性能。

    这里提到的开销、基数等概念,在用户层面看来,就是统计信息,或者说,对于用户来说,这些信息中可控部分主要是统计信息。

    SQL Server的统计信息包含三个主要部分:直方图(histogram)、密度信息(density information)和字符串统计信息(string statistics),这三个部分在基数预估过程中分别协助不同的部分。

    提醒:SQL Server在统计信息中存储了一个额外的针对字符串值的信息,称为Trie Trees(直译叫字典树或前缀树),这个信息可以针对字符串键值提供更好基数预估。但是这部分属于“未公开功能”,所以不在这里介绍。

    SQL Server 创建和维护统计信息,通过提供基数预估帮助优化器分析。而基数预估是对一个查询,“假设”使用了某些筛选条件、JOIN联接或GROUP BY 操作之后,会返回的记录数。而另一个常见术语选择度(Selectivity)的概念和基数预估很类似,它计算满足谓词的行在表中的百分比,选择度越高,返回的结果越小。提醒一下,选择度是索引键值选择的重要指标之一。

    最后,我们来回答一下一个一直没有正式回答的问题:为什么我们需要统计信息?答案其实很简单,但是可能需要有过一定的经历,才会深有体会,这个答案就是统计信息降低了在优化过程中必须分析的数据量,如果优化器每次优化都要访问实体表/索引的话,分析过程会变得非常低效。所以优化器会使用实际数据的样本(也就是统计信息)来做分析,统计信息的量通常来说会远低于原数据,所以分析和生成执行计划的速度会快得多。但是正如我一直在很多文章中说到的一样,没有什么功能是绝对的好或者绝对的坏,统计信息也有缺点,这个缺点就是维护成本,对于大型数据库的统计信息创建和维护(实时更新)会消耗很多资源和时间,另外由于统计信息是数据表/索引的取样结果,所以对于超大型的表来说,准确程度不可能太高。


    统计信息的样子:


    下面我们来看看上一节创建的演示库中统计信息的样子,先用以下脚本创建数据库环境:


    use StatisticsTest;
    go
    -- Create a test table 
    if (object_id('T0', 'U') is not null) 
      drop table T0;
    go 
    create table T0(c1 int not null, c2 nchar(200) not null default '#')
    go 
    -- Insert 100000 rows. All rows contain the value 1000 for column c1 
    insert T0(c1)
    select 1000 from Numbers 
    where n <= 100000 
    go 
    -- Now insert only one row with value 2000 
    insert T0(c1) values(2000)
    go 
    --create a nonclustered index on column c1 
    create nonclustered index ix_T0_1 on T0(c1) 


    首先看看图形化的统计信息,我们可以在SSMS的这个地方找到统计信息:




    在环境创建完之后,可以发现统计信息这个文件夹下面是没有东西的,因为表没有“被使用”,所以优化器不会对这个表创建任何统计信息。但是当第一次使用或者创建索引(实际上也是对数据进行使用)时,就会创建统计信息,我们可以尝试两个操作,第一个是执行一个简单的SELECT语句,优化器会对上面用到的列创建统计信息:


    需要注意要带上WHERE条件,其中竖框部分的1代表表创建时的第一列也就是x,而_WA_Sys代表由SQL Server自动创建的统计信息,WA传说是SQL Server开发组所在地华盛顿(Washington)的缩写。

    下面再来创建一个索引,即前面脚本中注释掉的那段:


    可以看到又多了一个统计信息,并且这个统计信息是和索引名一样,这个可以说是SQL Server自己创建的(因为你没有显式编写命令单独创建统计信息),也可以说是用户操作导致的。为了和前面_WA这个做区别,我们通常把它定义为非SQL Server自动创建的统计信息。

     

    SQL Server统计信息元数据


    下面我们来看看如何查询统计信息,统计信息是独立于实体表/索引的实际存储的信息,我们可以从一些元数据中获取它们。SQL Server 2005开始引入了目录视图、动态管理对象(DMO)等替代2000时代的系统表,减少对系统表的误操作所带来的系统故障,同时这些视图也添加了很多详细信息供后续使用。关于统计信息,我们首先用到的目录视图是:sys.stats,注意这部分的元数据存储在对应的数据库中,所以也需要切换到对应的数据库下执行:

    use StatisticsTest
    GO
    SELECT *
    FROM sys.stats
    WHERE object_id = object_id('dbo.T1')

    可以看到每一个统计信息都单独存在一行中,可以使用DBCC SHOW_STATISTICS命令来对某个统计信息进行详细展示:




    如果要查询的统计信息不存在(或者拼错),会得到以下错误:

    消息 2767,级别16,状态 1,第 8 行

    无法在系统目录中找到统计信息 'a'。

    DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。


     

    在这里是因为我们从创建开始就没有使用过a这个列,所以只要我们执行一个使用到它的语句,然后就可以查询:



    回到DBCC SHOW_STATISTICS命令得到的结果,前面提到了统计信息主要有三个部分,从上图看到也确实有三部分,这三部分分别叫做头信息、密度信息和直方图。




    头信息:


    下面来看看每个列的简要说明:

    • Name:_WA_Sys_00000002_108B795B,这是统计信息的名字,所以自动创建的统计信息都以_WA_Sys开头,跟着是一个值,标识为统计信息是基于哪一列创建的,注意自动创建的统计信息只会在单列上,对于多列组合的统计信息必须手动创建,同时这个列顺序是表创建时候的顺序,可以通过sys.columns目录视图查看,接下来是一个十六进制的值,代表表的object_id,可以用Windows自带的计算器反计算。然后使用Object_Name()函数得出表名:

                           

     

    • Updated:09 17 2016  5:13PM 这个值是统计信息创建或最后一次更新的时间。
    • Rows:100000,表示统计信息创建或最后一次更新的时间。
    • Rows Sampled:100000,表示统计信息创建或最近一次更新时的取样行数。
    • Steps:109,直方图的步数,接下来会介绍。
    • Density:0.03002139,密度值,这个值在新版(最晚在SQL 2008开始)SQL Server中仅用于向后兼容,对优化器没有用处。
    • Average key length:3.62263,统计信息所针对的列的平均字节数。这个值可以通过这样计算出来,虽然没有多大研究价值:


    即把列中每行的字节数(注意datalength函数返回字节数,len()函数返回字符数)加起来再除以总行数即可。

    • String Index:YES,这个值表示统计信息是否包含字符串信息,只有YES或者NO可选。这个值可以对LIKE条件提供预估支持,并且字符串统计信息只对第一列创建且必须为字符串类型(单列、多列统计信息都一样),由于这里的统计信息是建在A列,而这列是字符串类型,所以这里的值为YES。
    • FilterExpression和UnfilteredRows:这两个值只在统计信息创建在过滤索引(filter index)上才出现非null的值,后面会介绍。

     

    密度信息:


    本例中比较简单,是单列统计信息,所以密度信息这部分比较少,后面会演示多列统计信息,从名字来看,就三列:

    • All density:0.0003333333,它是对于这列(多列的先不管),1/唯一值的个数。

    • Average Length:3.62263,表示唯一值的平均长度。
    • Columns:a ,明显代表这个密度是包含哪些列,不罗嗦。

    那么这部分内容有啥用呢?大部分情况下,这部分的信息可以对语句中的GROUP BY 和ON条件中的未知值(比如本地变量)提供信息给优化器。再次看看这个表的统计信息情况:

    DBCC SHOW_STATISTICS('Sales.SalesOrderDetail', IX_SalesOrderDetail_ProductID)

    这里表示了这个索引包含了3列,每种组合情况下的密度及平均长度信息。下面来看看这个语句:

    USE AdventureWorks2014
    GO
     
    SELECT ProductID
    FROM Sales.SalesOrderDetail
    GROUP BY ProductID

    优化器在编译这个语句时,由于ProductID列上有统计信息,不需要遍历整表,直接从密度信息中就可以获取唯一值(Group By本质就是去重)的预估行数。


    这个值,根据定义,是1/对应的密度,由于只计算ProductID,所以密度就是


    结果大家可以自行算一下,是265.99996。大家也可以自己算一下GROUP BY ProductID,SalesOrderID及SalesOrderDetailID,也就是上面的另外两行。

    那么在使用本地变量的情况下会如何 ?

    USE AdventureWorks2014
    GO
     
    DECLARE @ProductID INT
     
    SET @ProductID = 921
     
    SELECT ProductID
    FROM Sales.SalesOrderDetail
    WHERE ProductID = @ProductID

     

    由于本地变量在统计信息的行为上有点特殊,所以这里要特意拿来说一下,优化器在最终实际运行之前没办法知道提交的SQL语句中参数会是什么值,但是它又必须产生一个预估执行计划,同时接下来会解释,此时也没办法使用直方图,所以优化器只能借助密度信息来获取预估行数。此时的预估行数由表总数乘以密度信息得出。也就是:0.003759399 * 121317≈456.079。

    另外一个情况下,WHERE条件不是使用“等于”符号,而是“不等于”,


    这个时候,参数的具体值已经没所谓了,大家可以试一下随便填一个值。此时优化器连密度信息都不能用了,但是又必须给点东西,怎么办?使用一个标准假设(表总数的30%作为选择度),也就是说在这种不等操作符中,预估行数总是表总数的30%,即121317*30%≈36395.1。这个30%的值有时候却会带来很大的性能影响,特别是对超大表,30%的量还是非常大的,但是可能实际上语句只需要极其少量的数据,基于这个原因,在查询中,尽可能避免本地变量,而使用参数化或者字符串形式。因为此时优化器可以使用直方图来协助预估,从而提供更准确的预估行数。

     

    直方图:

    在SQL Server中,只会对统计对象的第一列创建直方图,并且压缩在这些列中的分布值的信息到一系列子集中,这些子集称为桶(buckets)或者步(steps)。为了创建直方图,SQL Server需要先在首列中查找唯一值,并且使用最大偏差算法尝试获取那些最常用的变化值,以便把最显著的统计信息保存下来。最大偏差是其中一个用于精确地表达关系数据库中数据分布情况的算法。

    在SQL Server中,我们可以使用DBCC SHOW_STATISTICS命令查看直方图,比如在微软示例数据库AdventureWorks2014中显示Sales.SalesOrderDetail表的IX_SalesOrderDetail_ProductID索引的当前统计信息:

    USE AdventureWorks2014
    GO
    DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail',IX_SalesOrderDetail_ProductID)

    前面提到,直方图只对统计对象的首列进行创建,所以在这个统计信息中,只对ProductID列创建统计信息。下面来看看这个语句产生的关于直方图方面的结果:


    • RANGE_HI_KEY:直方图中每一步的最高边界(上限值),比如上图第21行对应的738,和第22行对应的741,这两行意味着第22行中的统计信息边界从739~741。
    • RANGE_ROWS:是一个预估行数,表示不包含上限值在内的该步长中的行数。在截图中,也就是意味着第22行的值应该是关于739~740的行数。
    • EQ_ROWS:同样是一个预估值,预估在这列的对应步长中,跟RANGE_HI_KEY相同的值有多少,拿22行做例子:最高值是741,然后直方图预估等于741这个值的数有97个。
    • DISTINCT_RANGE_ROWS:在该步长范围内,除去上限值的其他值中,唯一值的数量。
    • AVG_RANGE_ROWS:该步长中,每个非上限值的唯一值的平均行数,计算公式为:RANGE_ROWS/DISTINCT_RANGE_ROWS。

    下面来大概计算一下截图中的值怎么来的:

    我们针对图中第22行,使用下面语句可以得出:


    • RANGE_HI_KEY:由SQL Server自动标注,我们干预不了,
    • RANGE_ROWS:表示了不包含上限值的行数,即ProductID=739的行数,这里算出是167,跟直方图的RANGE_ROWS相同。
    • EQ_ROWS:上限值,即741的行数,这里很显然是94行。
    • DISTINCT_RANGE_ROWS:这个步长有两个唯一值,741和739,出去上限741之外,只有739这个唯一值,所以对应的值为1。
    • AVG_RANGE_ROWS:RANGE_ROWS/DISTINCT_RANGE_ROWS=167/1=167。

    通过定义,我们把直方图中的值都计算出来了,大家可以用这种方法去验证其他值。

    所谓知其然知其所以然,除了知道解释之外,更重要的是知道为什么要计算这些值,存在必然有意义,我们大部分情况下都不需要去研究这些意义,但是一旦出现一些深入问题或者你想做深入研究的时候,那就成了必要了。下面我们来看个很普通的语句:

    USE AdventureWorks2014
    GO
     
    SELECT *
    FROM sales.SalesOrderDetail
    WHERE ProductID = 741

    然后看看实际执行计划:


    这里的预估行数为94,由于这个例子是ProductID=741,所以优化器直接使用直方图中RANGE_HI_KEY的值来替代,刚好是94。然后把741换成该步长中的另外一个值739,看看对应的部分:


    由于739不是这个步长的上限值,所以不能使用RANGE_HI_KEY来直接获取,所以会使用AVG_RANGE_ROWS。

    下面来一个不等于的操作:


    这个13223怎么来的?累加!,把直方图中,RANGE_HI_KEY小于714(注意不是等于)的EQ_ROWS加起来,大家可以自己算一下。

    下面把例子扩展一下,把WHERE条件加一个AND谓词:



    这个语句实际上使用了两个统计信息,前面提到过00000004代表表定义的第四列。SQL Server使用对应的统计信息对象来分别评估两个条件。得出对应的预估值之后,取两者交集作为最终的预估行数。所以这个过程需要乘以两个的选择度。

    大家可以自己尝试,ProductID=870的值有4688行,对于这个有121317行的表,对应的选择度为4688/121317,也就是大概0.0386425645。同理,OrderQty=1的有74954行(不同版本的AdventureWorks库行数可能不一样,所以最好自己算一次),对应的选择度为0.6178359175。

    为了获取交集,需要把这两个选择度相乘:0.0386425645*0.6178359175≈0.02387476429241042875。最后,用这个值乘以表的总数,得出最终的预估影响行数:0.02387476429241042875*121317≈2896.41。但是图中的数据是2656.97,因为默认情况下数据库是启用自动创建统计信息功能的。在执行语句的时候,优化器会自己创建统计信息(在OrderQty列上),而由于这个列的统计信息取样不准确(没索引),所以会出现跟计算不一样的情况。如果你用一个原始库还原,然后先关闭自动创建统计信息功能再执行,可能会出现:


    当你启用再执行的时候,数值可能变成了:


    但是从技术上来说,预估的计算公式就是上面提到的。下面来更加复杂化一点:OR


    上面的语句就是取两个条件的预估行数,并且除去重复值的并集。

    在我这个库中,ProductID=870的有4688行,OrderQty=1 的有行。前一个例子我们已经算出AND的结果(也就是重复值)为2896.41 ,那么OR的结果就是4688+74954-2896.41=76745.59,跟图上的差异比较大,但是还是前面的原因,自动创建的统计信息不准确。其实只要我们建一个索引再检查,可以发现就是我们算出来的数值:

    use AdventureWorks2014
    go
    create index IX_SalesOrderDetail_OrderQty on
    Sales.SalesOrderDetail(OrderQty)

    为避免后续影响,尽可能保持原有数据库状态,把索引删掉:

    use AdventureWorks2014
    go
    drop index IX_SalesOrderDetail_OrderQty on
    Sales.SalesOrderDetail
     


     

    列级统计信息

    我们一般讨论的统计信息,有两种:1.索引上的统计信息。2. SQL Server自动创建或人工创建的统计信息。

    这里讨论的列级统计信息算是第二种,而且多为SQL Server自动创建。下面在AdventureWorks2014库中演示一下,先创建一个Customers表:

    USE AdventureWorks2014
    GO
    --建表
    CREATE TABLE dbo.Customers(
        CustomerId INT NOT NULL identity(1, 1),
        FirstName NVARCHAR(64) NOT NULL,
        LastName NVARCHAR(128) NOT NULL,
        Phone VARCHAR(32) NULL,
        Placeholder CHAR(200) NULL
        );
     
    CREATE UNIQUE CLUSTERED INDEX IDX_Customers_CustomerId ON dbo.Customers(CustomerId)
    GO
     
    -- 通过Crossjoin产生测试数据
    -- 使用GO50循环50次
        ;
     
    WITH FirstNames(FirstName)
    AS (
        SELECT Names.NAME
        FROM (
            VALUES ('Andrew'),('Andy'),('Anton'),('Ashley'),
                ('Boris'),('Brian'),
                ('Cristopher'),('Cathy'),
                ('Daniel'),('Donny'),
                ('Edward'),('Eddy'),('Emy'),
                ('Frank'),('George'),
                ('Harry'),('Henry'),
                ('Ida'),('John'),
                ('Jimmy'),('Jenny'),
                ('Jack'),('Kathy'),
                ('Kim'),('Larry'),
                ('Mary'),('Max'),
                ('Nancy'),('Olivia'),
                ('Olga'),('Peter'),
                ('Patrick'),('Robert'),
                ('Ron'),('Steve'),
                ('Shawn'),('Tom'),
                ('Timothy'),('Uri'),('Vincent')
            ) Names(NAME)
        ),
    LastNames(LastName)
    AS (
        SELECT Names.NAME
        FROM (
            VALUES ('Smith'),('Johnson'),('Williams'),('Jones'),
                ('Brown'),('Davis'),('Miller'),('Wilson'),
                ('Moore'),('Taylor'),('Anderson'),
                ('Jackson'),('White'),('Harris')
            ) Names(NAME)
        )
    --插入数据
    INSERT INTO dbo.Customers(
        LastName,
        FirstName
        )
    SELECT LastName,
        FirstName
    FROM FirstNames
    CROSS JOIN LastNames
    GO 50 --循环50次
     
    --额外插入一行数据
    INSERT INTO dbo.Customers(
        LastName,
        FirstName
        )
    VALUES ('Isakov','Victor' )
    GO
    --创建非聚集索引
    CREATE NONCLUSTERED INDEXIDX_Customers_LastName_FirstName ON dbo.Customers(
        LastName,
        FirstName
        );


    注意索引的定义顺序,LastName是首列,下面使用一个非SARG写法:


     

    对于第一个语句,SQLServer使用了聚集索引扫描,返回700行数据,第二个语句使用了非聚集索引扫描,返回1行数据。接下来检查一下统计信息:

    select  stats_id, name, auto_created
    from sys.stats
    where object_id= object_id(N'dbo.Customers')

    前两行是聚集索引和非聚集索引创建时SQL Server自动创建的统计信息。而第三个以“_WA”为前缀的,就是列级统计信息,由SQL Server在语句优化过程中自动创建的。然后再细化检查一下这个统计信息的情况:


    从数据可以看出,它是基于FirstName创建的统计信息,因为在语句优化过程中发现FirstName没有统计信息支持,所以默认情况下由SQL Server自动创建。有了这个统计信息,优化器就可以对第二个语句进行优化,从而得出了不同的执行计划。

    除了由SQL Server自己创建(自动创建只基于单列),还可以使用CREATE STATISTICS命令手动创建基于单列或多列(多列必须手动创建)的统计信息。

    但是统计信息天生带有维护开销,虽然相对于索引带来的统计信息而言,通常列级统计信息会小很多,但是在频繁更新的情况下,还是会带来客观的开销,所以对于很少执行的语句,这种统计信息的创建会比额外创建索引更加好,毕竟索引在主键更新时也会被迫更新。相反,对于使用极其频繁的语句,创建索引会比创建列级统计信息对优化器的支持更好。因为索引不仅有预估信息,还能对数据进行组织和快速定位。

     

     

    统计信息与执行计划

    前面大量的例子说明,统计信息影响了优化器的语句优化,而优化器语句优化的产物就是预估执行计划,预估执行计划又直接影响了语句的运行性能,所以体现出统计信息影响了预估执行计划从而影响语句性能。

    默认情况下,SQL Server自动创建和更新统计信息。在数据库级别有两个选项可以控制这个行为:

    1. 自动创建统计信息:控制SQL Server是否自动创建列级统计信息。这个选项不影响索引自带的统计信息,因为索引总是带有统计信息(可以使用STATISTICS_NORECOMPUTE选项来关闭索引上统计信息是否自动创建)。默认情况下这个选项是开启的。
    2. 自动更新统计信息:当SQL Server在编译或执行查询时发现统计信息过时时,这个选项用于控制是否随之更新统计信息,默认也是开启的。

    是否创建统计信息很好理解,那么是否更新如何判断呢?SQL Server会基于统计信息列上的INSERT/UPDATE/DELETE/MERGE语句的影响行数来判断,技术上成为统计信息更新阈值(statistics update thresholds),有时也叫做统计信息重编译阈值(statistics recompilation thresholds),判断条件如下:

    1. 当表为空时,一旦插入数据即认为统计信息过时。
    2. 当表小于500行时,在统计信息列的每500次变更时认为过时。注意是500次,不是500行,比如对同一行数据更新100次,会认为是100次变更而不是1次。
    3. 当表多余500行数据时,统计信息列后续每500次更新并且影响表上总行数的20%时,被认为过时。

    这三个条件得出一个结论:对于越大的表而言,统计信息的自动更新频率越低。比如对于10亿行数据,要到2亿次更新后才认为统计信息过时从而触发统计信息更新。这部分在后续演示。

     

    统计信息与内存分配

    关系数据库在运行时候都严重依赖于内存,不同的操作符需要不同的内存资源。比如,索引扫描操作符需要一行接一行地提取数据,并不需要在内存中存储多行数据。而其他某些操作如排序,需要在进行排序前访问整个结果集,所以需要在内存中尽可能保留整个数据集。

    但是SQL Server并不会随意分配内存,它会尝试评估某个查询及其中基于预估行数的操作符所需内存(memory grant)。简单来说就是执行某个查询,SQL Server会预估每个部分所需的内存。这一步很重要,过高或过低的评估都会对整体性能带来严重影响。多高会浪费SQL Server的内存,并且在负荷很大的服务器中,分配大量内存也会相对久很多。

    评估多低,会导致实际执行过程中,某些操作符因为内存不足而失败或等待。比如排序操作,当没有得到足够的内存时,SQL Server会把溢出的结果集放到TempDB中进行排序。虽然TempDB也是在没办法的情况下才使用,但是相对于在内存中的性能,TempDB通常会明显低效很多。下面来演示一下:

    USE AdventureWorks2014
    GO
    CREATE TABLE dbo.MemoryGrantDemo(
        ID INT NOT NULL,
        Col INT NOT NULL,
        Placeholder CHAR(8000)
        );
     
    CREATE UNIQUE CLUSTERED INDEX IDX_MemoryGrantDemo_ID ONdbo.MemoryGrantDemo(ID);
    --创建一个MemoryGrantDemo表,然后产生65536行数据,其中Col列存储0~99的值,大概每655或656行一个值。
    ;WITH N1(C)
    AS (
        SELECT 0
       
        UNION ALL
       
        SELECT 0
        ) -- 2 rows
        ,
    N2(C)
    AS (
        SELECT 0
        FROM N1 AS T1
        CROSS JOIN N1 AS T2
        ) -- 4 rows
        ,
    N3(C)
    AS (
        SELECT 0
        FROM N2 AS T1
        CROSS JOIN N2 AS T2
        ) -- 16 rows
        ,
    N4(C)
    AS (
        SELECT 0
        FROM N3 AS T1
        CROSS JOIN N3 AS T2
        ) -- 256 rows
        ,
    N5(C)
    AS (
        SELECT 0
        FROM N4 AS T1
        CROSS JOIN N4 AS T2
        ) -- 65,536 rows
        ,
    IDs(ID)
    AS (
        SELECT row_number() OVER (
                ORDER BY (
                        SELECT NULL
                        )
                )
        FROM N5
        )
    INSERT INTO dbo.MemoryGrantDemo(
        ID,
        Col,
        Placeholder
        )
    SELECT ID,
        ID % 100,
        convert(CHAR(100), ID)
    FROM IDs;
    --创建一个在Col列上的非聚集索引
    CREATE NONCLUSTERED INDEXIDX_MemoryGrantDemo_Col ON dbo.MemoryGrantDemo(Col);
     


    接下来添加656行新数据,并且指定Col为1000,这个数量是表总数的1%,根据前面说的统计信息更新阈值来说,是不被认为过时的。因此不更新统计信息,从而直方图也不会有Col=1000的这个值的数据分布情况:

    USE AdventureWorks2014
    GO
    ;with N1(C) as (select 0 union all select 0) -- 2 rows
    ,N2(C) as (select 0 from N1 as T1 CROSS JOIN N1 as T2) -- 4 rows
    ,N3(C) as (select 0 from N2 as T1 CROSS JOIN N2 as T2) -- 16 rows
    ,N4(C) as (select 0 from N3 as T1 CROSS JOIN N3 as T2) -- 256 rows
    ,N5(C) as (select 0 from N4 as T1 CROSS JOIN N2 as T2) -- 1,024 rows
    ,IDs(ID) as (select row_number() over (order by (select NULL)) from N5)
    insert into dbo.MemoryGrantDemo(ID,Col,Placeholder)
            select 100000 + ID, 1000, convert(char(100),ID)
            from IDs
            where ID <= 656;

    产生了数据之后,下面来测试一下运行情况,分别对Col列为1和1000的查询并排序:

    USE AdventureWorks2014
    GO
     
    DECLARE @Dummy INT
     
    SET STATISTICS TIME ON
     
    SELECT @Dummy = ID
    FROM dbo.MemoryGrantDemo
    WHERE Col = 1
    ORDER BY Placeholder
     
    SELECT @Dummy = ID
    FROM dbo.MemoryGrantDemo
    WHERE Col = 1000
    ORDER BY Placeholder
     
    SET STATISTICS TIME OFF


    执行计划概览:



    Col=1000的实际及估计行数、内存分配情况:

     

    虽然从执行计划的形状看上去很相似,但是对比基数预估和内存分配就可以知道差异很明显,另外一个就是对于第二个语句,在排序操作符(Sort)右下角有个黄色感叹号。鼠标移到上面就可以看到:


    最后,对比一下执行时间,可以看到Col=1000的比Col=1的大很多,一般来说表示性能较差:


    如果你使用Profiler等工具跟踪的话,可以使用Sort Warning和Hash Warning事件。

     

    开销预估模型

    前面一直提到,关系数据库都是基于开销的优化,那开销是如何来的?下面简要介绍一下,但是毕竟SQL Server不是开源的,很多信息属于机密,不公开,所以只能从有限的资料上找。

    优化器产生执行计划的执行域开销预估的准确程度有“直接的关系”。优化器在优化语句的过程中,优化器会分析很多候选执行计划,预估它们各自开销,然后选择最佳的那个作为预估执行计划。所以,不仅基数预估要准确,开销预估也要高效。

    开销是对部分或完整的执行计划的预估,计算每个操作符的开销值,然后把执行计划中的所有操作符的开销加起来作为整体开销。每个操作符的开销依赖于自身算法复杂度和影响行数,有些比如排序操作符,还与服务器的内存情况有关。

    从能获得的信息来看,每个操作符会关联一个CPU开销,还会可能有一些I/O开销。比如聚集索引扫描(Clustered Index Scan)会包含CPU和I/O开销,而其他一些如流聚合(Stream Aggregate),只有CPU开销。不过还是那句,我们没办法得知具体公式和开销值,所以下面的演示只有一些基础的信息。

    我们使用示例数据库AdventureWorks2014。运行下面语句,看一下聚集索引扫描操作的开销情况:

    USE AdventureWorks2014
    GO
     
    SELECT *
    FROM Sales.SalesOrderDetail
    WHERE LineTotal = 35


     

     

    在较为旧的SQL Server版本中,开销以秒为单位,也和特定硬件配置有关。但是在较新的版本(最晚从SQL 2008开始),开销已经跟“单位”没关系,只是一个数值。

    如上图,聚集索引扫描操作符在我本机的I/O预估开销为0.915718,CPU预估开销0.133606,,聚集索引扫描操作符中,对于第一行的CPU开销为0.0001581,后续每行为0.0000011,因为表中有121317行,所以总CPU开销为:0.0001581+0.0000011*(121317-1)≈0.133606。同样,对于第一个数据库页,最小的I/O开销为0.003125,然后每一个页为0.00074074。由于是全表扫描(聚集索引等同整表),用下面语句检查实际页数:

    USE AdventureWorks2014
    GO
     
    SELECTin_row_data_page_count,
        row_count
    FROM sys.dm_db_partition_stats
    WHERE object_id = object_id('Sales.SalesOrderDetail')
        AND index_id = 1
     


    本机得到的数据为:1233,所以预估I/O开销为:0.003125 + 0.00074074 * (1233 – 1)=0.91571668≈0.915718。最后,总开销为0.133606+0.916458=1.05006,就是这个操作符的预估开销。然后把每个操作符的总开销加起来就是这个执行计划的预估总开销。

    关于统计信息的基础内容先说到这里,下一节介绍关于“统计信息常见问题及应对方案”

    展开全文
  • 第二十七章:不改变正负数之间相对顺序重新排列数组.时间O(N),空间O(1)前言 在这篇文章:九月腾讯,创新工场,淘宝等公司最新面试十三题的第5题(一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且...
  • 活用regex的例子

    千次阅读 2007-03-19 15:36:00
    我们可以把各式自动机用字符串表示出来,由此相对容易地发现很多深刻的性质。我们把系统规格用状态机描述出来,再把状态机用逻辑公式表达出来,于是我们可以自动验证系统规格有没有逻辑上的缺陷,有没有安全问题。...
  • 贝叶斯从浅入深详细解析,详细例子解释

    万次阅读 多人点赞 2013-06-24 11:38:31
    这是一篇关于贝叶斯方法的科普文,我会尽量少用公式,多用平白的语言叙述,多举实际例子。更严格的公式和计算我会在相应的地方注明参考资料。贝叶斯方法被证明是非常 general 且强大的推理框架,文中你会看到很多...
  • 非常全面的贝叶斯网络介绍 非常多的例子说明

    万次阅读 多人点赞 2014-05-26 16:10:36
    这是一篇关于贝叶斯方法的科普文,我会尽量少用公式,多用平白的语言叙述,多举实际例子。更严格的公式和计算我会在相应的地方注明参考资料。贝叶斯方法被证明是非常 general 且强大的推理框架,文中你会看到很多...
  • 梅特卡夫定律与网络价值

    万次阅读 2017-11-15 16:35:11
    网络价值谈及互联网的价值,我们会从哪些方面去考虑?用户价值? 商业价值? 甚至从长远来看,时代价值?梅特卡夫定律 与摩尔定律、吉尔德定律并称为互联网三定律的梅特卡夫定律,由3Com公司的创始人,计算机网络...
  • C++内存管理(超长,例子很详细,排版很好)

    万次阅读 多人点赞 2018-04-02 13:56:49
    澳,错了,应该是delete []p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。 1.1.1.3 堆和栈究竟有什么区别?  好了,我们回到我们的主题:堆和栈究竟有什么区别?...
  • Q学习(Q-learning)入门小例子及python实现

    万次阅读 多人点赞 2019-09-24 18:13:09
    是折扣因子,用于确定延迟回报与立即回报的相对比例, 越大表明延迟回报的重要程度越高。 马尔科夫决策问题的目标是找到一个策略 ,使其回报函数 的长期累积值的数学期望   最大。其中,策略 π 只和状态...
  • 大型网站架构演变史(含技术栈与价值观)

    千次阅读 多人点赞 2016-09-03 21:25:04
    业务分库需要根据具体的业务场景进行确定,相对来说比较好完成,分表就不是这样了。因为在代码中写的SQL就是一张表,现在要分表,那原来的SQL肯定有问题。这个可以通过merge引擎来完成。 阶段八:使用NoSQL和...
  • 大家好,我今天分享的题目是《高可用实践:从淘宝到上云的差异》,取这个标题是因为会涉及到两个方面内容,一方面以淘宝为例子,传统的 IDC 的时候,我们稳定是怎么做的,另外在云计算背景下,有很多创业公司是...
  • 走进信息隐藏的世界,全面讲解信息隐藏——第1节:信息隐藏技术简介 专栏题记:奥斯卡优秀电影《美丽心灵》里面有讲述一位优秀数学家为政府破译敌国通讯的情节,如电影所讲,现实中也有着类似的情节,在我们的生活...
  • 关于信息增益和熵

    千次阅读 2015-12-14 21:15:25
    1、信息增益 在学习决策树时接触到到了信息增益(Information Gain),由此了解到熵。不解顺序查之。 在划分数据集之前之后信息发生的变化成为信息增益。...举个例子: 我们要建立的决策树的形式类似
  • 我们知道一个 hash 值(输出)可以对应无数输入,如果不加盐,找到一个和明文密码 hash 结果相同的输入相对容易,但在有盐的情况下,如果不知道盐,找到这种输入的难度就是炸裂增长。 当然,如果别人有办法拿到...
  • 一说到科学家,恐怕大多数人的第一联想都是这个名字——爱因斯坦,也都知道这位神人不明觉厉的伟大成就——相对论。不过很多人对爱因斯坦的印象,只是个不修边幅的科学怪人,相对论更是个遥不可及的神秘概念,甚至...
  • Raft 一致算法论文

    万次阅读 2019-05-17 09:52:13
    本篇博客为著名的 RAFT 一致算法论文的中文翻译,论文名为《In search of an Understandable Consensus Algorithm (Extended Version)》(寻找一种易于理解的一致算法)。 Raft 是一种用来管理日志复制的一致...
  • 股票价值投资策略

    千次阅读 2019-08-18 21:08:37
    股票价值投资策略 什么样的股票才是好股票:我关注的好股票以下指标: 基本面指标: 1、净资产收益率(ROE :Rate of Return on Common Stockholders’ Equity) 上市公司的净资产与净利润的比值。 一家上市...
  • 开放金融中的超流动抵押链

    万次阅读 2019-05-18 08:19:57
    当抵押物具备流动的时候会发生什么? -超流体 ETH- 对于密码学货币市场来说,去年一年不可谓不艰难。在这样萧条的形势下,依然有很多富有才华又满腔热忱的团队埋首耕耘,为打造一个真正的开放式金融系统贡献...
  • 信息检索导论要点整理

    千次阅读 多人点赞 2017-07-07 10:23:24
    这是在准备期末考试的时候根据王斌博士翻译的《信息检索导论》(人民邮电出版社出版)和山东大学信息检索实验室的陈竹敏老师的授课课件进行整理的。 、归一化计算笔记繁琐。 前言 1、 IR的两种模式:pull(ad ...
  • 当抵押物具备流动的时候会发生什么? -超流体 ETH- 对于密码学货币市场来说,去年一年不可谓不艰难。在这样萧条的形势下,依然有很多富有才华又满腔热忱的团队埋首耕耘,为打造一个真正的开放式金融系统贡献...
  • 复杂思维第二版 一、复杂科学

    万次阅读 2017-10-27 21:44:26
    一、复杂科学 原文:Chapter 1 Complexity Science 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 这本书的论点是,复杂科学是一种“新型科学”,我借鉴自 Stephen Wolfram。2002年,Wolfram ...
  • 机器学习模型可解释的详尽介绍

    千次阅读 多人点赞 2019-11-26 12:22:00
    机器之心平台来源:腾讯技术工程模型可解释方面的研究,在近两年的科研会议上成为关注热点,因为大家不仅仅满足于模型的效果,更对模型效果的原因产生更多的思考,这样的思考有助于模型和特征的优化,更能够帮助更...
  • 尽管存在一听说可以直接运行JS文件就觉得很酷的同学,但大多数同学在接触新东西时首先关心的是有啥用处,以及能带来啥价值。 NodeJS的作者说,他创造NodeJS的目的是为了实现高性能Web服务器,他首先看重的是事件...
  • 第一部分,应对不确定 2 还原论的时代与全新的时代 3 从复杂到错综复杂 4 建立有效组织 第二部分:化繁为简 5 建立互信和目标共享的团队 6 突破“深井”,建立关系 第三部分:信息...
  • 声明:本文转至Big大鸟的博客下,转载的名为《什么叫大数据 大数据的概念》一文,链接...“大数据”是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。大数据...
  • 直到今天,在它迄今为止的八年发展史中,比特币从 10,000 个币买一块披萨的价值(在交易所用传统货币给比特币定价之前)上涨到每个比特币值 1,000 美元以上。在撰写本文时,比特币的市值已超过 160 亿美元。比特币...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,367
精华内容 28,946
关键字:

信息的相对价值性的例子