2022-02-02

关掉个性化推荐这件事

心血来潮把小红书的个性化推荐关了.
然后发现内容有点看不下去.

于是想,现在人或许某种程度上确实是被shaping的.

算法推荐的动机是浏览量活跃度在线时长.
所以首选感兴趣的,或者说随着这个objective的自然是会让你沉浸下来的.

换个角度来说,就是容易或者说乐于接收的内容.

从结果上来说,就是某种程度的报喜不报忧.

而如果泛化地来说的话,那么就说明存在一种手段,在贴合取向的前提下,可以达到一个预设的立场目的.
换句话说,就是思维方式和接受的信息是可以被shape/manipulate的.

这个似乎也不是什么新的论点/观念.
毕竟近几年尤其近段时间以来,算法已经算是某种形式的原罪共识.

一种或者说某种倾向性的灌输渠道.

关推荐带来的另一个想法是另外一个有些类似的结论.
也就是所谓多元化问题.

信息茧房的某种程度的对立面就是多元化.
广义上来说就是有着不同层次体验和角度的人事.

一个可能比较有话题性的就是比如北上广深的白领女权和18线边缘贫困山区的被卖女性.

算法的功利性或者说倾向性理论上,也可能实际上会把两边构成一个个独立的平行宇宙.
在没有舆论焦点的时候,双方都是不存在对方的视野里的.

为什么说是双方?

实际上,如果脱去事件性本身,泛化地来说就是不同位面的人群之间的相互信息隔离.

合理一些的例子就是房价和人均收入这个话题.

这里带来的一个问题或者说可能的现象就是所谓的被动性.

当信息flow in的时候,人一般本能非本能地都会去digest这些东西.

那么反过来说,当没有信心流入的时候会怎么样呢?

就像现在流行的忆苦思甜的一个常用叙事就是,现在的人已经不会自己找porn了.
以及更衣人偶都能被称之为里番一类.

这类或主动或被动的伸手党的存在和形成,一方面自然可能是跟GFW等一系列环境变化有关.
但是否某种程度上也跟这种算法的喂养有关呢?

这种被动接受的独立面就是主动的获取.

后者在互联网初期或者说中期本身是个问题或者说缺陷.
因为内容和信息的膨胀使得有效的检索和获取成为了一个不太容易实现的东西.

所以需要有搜索,需要有一些社交的社会化推荐的东西,以便于在大数量的信息里效率性地提取有用的信息.

比如初始信源RSS的bootstrap,各个社交网站账号的cold start等.
目的的共同点之一都是效率化.

无论是为了检索的效率化,还是融入上手的效率化.

这也是为什么算法具有出现的必要性.

然后是商业化增长需求加入使得算法导向性的变化的问题.

它的目的就不再是效率化,或者说不完全是使用上面的效率化.
而是带有更多侧面和角度的效率化.

那么即使是从纯粹数学表达上来说,这个重新调整的效率函数对于原始的用户方面的效率需求俩说,就不一定是最优的.

也就是说,后期的算法从用户角度方面来说,可能反而是反效率化的.
至少是非最优化解的.

那么随之而来的一个问题就是,这种非效率化相对于不使用算法来说的话,是有改进呢还是负优化呢?

这是个比较complicated的问题.
因为不同的场景甚至不同的人,对于优劣会有自己的倾向性和考虑.

如果选择不用算法的话,那么就意味着需要自己去寻找一套能够等效率实现自己需求的东西.
一个可以至少更无忧快速的获得需要信息的一个渠道.

而这个往往需要首先知道自己需要什么样的渠道或者说寻找的是什么东西.
也就是一种主动性诉求.

这在以算法驱动成长环境下来说,可能是一个不太容易满足的点.

或者说是一个不太容易驻足的点.

因为不断地会有信息主动或者被动的侵入到这个处理信道当中.

一个简单的例子就是学生学习时的手机沉浸问题.

相对于前辈来说,同样是走神,但是大脑的活跃程度和行为模式大致是不太一样的.

所以一个可能会有点意思的角度就是,在基于这种注意力随机游荡的假设模型下,做东西的体验的关注点的问题.

早期互联网崇尚的是直觉性工具性原则.
也就是交互和体验要尽可能地为了使用效率性服务.

因为心智模型是主动工具性的.

当如果基本心智模型是注意力放置型的话.
也就是类似某种成瘾性信息消费为取向的话,那么需要关注的点就是如何转移注意力.

或者说产品之间的竞争从易用性切换到如何从竞品吸取注意力并把关注度留在自己身上.

于是,这就不难理解一些产品的奇怪属性了.

抖音的节奏背景.
微信的基于聊天形式的各种奇怪交互链路.
直播中的购物互动性行为.

keep thinking without thinking.

所以,有时候在想,是不是到了应该把个性化广告推荐也关闭的时候.

以前的一个想法是从广告内容来做一个反馈,作为日常行为的一个收束指标.
因为理论上根据广告内可以看到自己行为模式的可能一般自身注意不到的变化.

但是它的假设前提是广告的推送是基于算法亲和度的.
也就是前面说的,类似与最大化买卖双发撮合的目的的.
这样才会考虑买卖双发的具体指标的契合度.

但是,what if现在的广告核心并不完全是为了这种撮合呢?

那么它反映可能是另外一些跟自身行为模式不太相关的东西.
这样的话,作为某种形式的镜子来说其实是没有意义的.

所以,如果广告是某种跟自身无关的意志的一种体现的话,从这个角度来说就没有必要不关闭.

反而如果这种非自主权重更高的话,去掉个性化因素之后反映出来的倾向性可能会更有意思一些.


2022-01-23

内循环

前几天看社科院的一个公众号在提奥派经济学的货币定义.
也就是非信用而是纯商品属性的货币定义.

按对数字人民币的普遍预期来说,数字人民币的场景方式可能是像NFT的中文译名一样,作为一种非同质化代币.
也就是说同一法币标价的数字人民币具有对应的锁定消费渠道,跨渠道交易会受限.

一个例子就是财政方面的公务卡账目开销.
账上的资金职能在白名单或者是具有相应标签验证的消费渠道流通,保证资金用途的可控性.

另外一个可能更通俗易懂的例子就是现在电商平台的优惠券机制.
给定优惠只能在特定店铺/活动/场景/品类下消费,而不是一个通用的优惠折扣.

这样的话,货币本身就是某一类渠道里个一般等价物,脱离的渠道就没有什么意义.

从结果或者说宏观上来说,就可以做到每一笔资金在可控的范围内流通.

以央行或者说货币政策的角度来说,像小微企业定向贷款和专项贷款之类的,在技术上也有可能做到无人自动监督的一个效果.

而且本质上来说,它并不完全排斥信用理论的货币说和工具链.
上面央行的例子本质上也还是可以做信用扩张/基于信用框架来做的一个措施,但粒度控制上更有明确的操作点.

本质上来说,这就是一种计划经济形态.
因为不仅结果可以用量化考核,实现方式也可以在某种形态的量化框架下约束实现.

另外一些观点就是对于信用货币这个理论本身的一个,可能说是攻击点或者说不足点的论证.

以信用定义为基础出发的货币观念以及基于此产生的财政货币手段本质上都是依赖于信用扩张的.
或者至少是某种形态的杠杠的.

也就是通常所说的赤字驱动.

抛开政策场景, 本质上就是利用远期的一个合理或者不合理的估值回报折现来作为当下消费支出的一个依据.
基本假设是不会default,并且发展预期是在偏差允许范围内的.

这个初看问题不大.
因为只要保证不会违约和预期折现的杠杆率不会太离谱.

但实际上的问题是,这种预期折现不是一次性的.
而是一个没有尽头的叠加重复计算过程.

什么意思呢.
比如t年折现未来t+n年的增长预期作出当期估值,并以此作为ROI依据部署各项细节.
接着t+1年的时候按照同样的思路折算未来n年内的增长.

但是t+1年本身的realized的基础就是t年的一个预期折算.
所以这里实际上就是存在着某种形式的重复乐观预期.

当然,这里可以通过一些数学和规范标准来降低这种不合理的重复计算.

但本质上来说,t+1的结果是隐含/基于t年的预期做的一个计划.
而每一个t都是之前的t的一个递归隐含依赖.

所以,形式上,这可以是一个完全随机的过程序列.

而在经济景气的情况下,t+1的预期通常会有着更积极的依赖反馈.
也就是说会存在类似于某个正系数的放大效果会更明显.

这个的结果之一就是所说的通胀率表现.

也就是一般景气情况下的认为的通胀率保持正向增长积累的一个缘由.

所以,按照这个思路,通胀是信用货币框架的一个隐含的必然结果.

而通胀的一个外在形式或者说具体表现就是物价的增长.
或者稍微严谨一些来说,就是商品价格相较于货币价格的溢价增加.

也就是单位货币计价购买力的下降.

于是这里就有了另外一个问题.

计价购买力的下降,和实际的供需关系是没有直接挂钩的.

也就是说,1单位货币能买到的商品的缩水,跟市场上是产品过剩还是供应不足是没有直接关系的.

这也就是为什么会有所谓紧缩型通胀的说法.

因为它的产生本质上跟供需关系是没有直接联系的.
通胀是信用预期折现不合理叠加的一个结果.

这里带来的第二个问题就是市场上商品价格的形成就变成了一个复合结构.
一个是直接的市场交易平价,
另外一个就是通胀带来的实际货币购买力水平影响.

一个直观但可能不太合理的通俗解释就是.
在做商品货币定价的时候,除了需要考虑当期的供需关系之外,还需要把通胀考虑将来做一个综合计价.

这样带来的一个极端结果就是可能商品供应不足,按照一般供需理论框架是应该价格上涨的.
但是通胀/通缩带来的综合计价之后,商品的货币价格可能反而下降.

这个理论上来说,就是的货币价格成为了一个无用的宏观量.
进而与此挂钩的各项指标都存在一定程度的不可解释/无关性.

于是如果考虑非信用基础的货币观念呢?

信用货币的弊端在于现值折算带来的不合理叠加影响.
那么如果采用类似现收现付的即时交易定价呢?

也就是前面所说的类似数字人民币的NFT化.

形式上来说,就是把一个大而全美的信用货币体系拆分成由各个不同子流通领域独立运作的信用货币体系.

类似于container化.
把整体的叠加风险sandbox到各个独立渠道.

这样的话,至少形式上是可防可控的.
因为特定渠道有着更单纯和更模式化的交易patten.

在监管方面和流量治理方面或由更多的工具化选项.

实际上来说,之前的粮票饭票乃至于现在的汽车号牌指标等,都属于这个范畴的东西.
一种计划性流通的方式.

尤其像汽车号牌这种.
介于自由流通和受限流通之间的一个区间.

以及像外汇方面的离岸和在岸人民币的区别.

它的问题可能在于国际流通上面.

大多数国家应该还是主要以经典信用货币为基础的.

当前的现状是疫情以及长时间的宽松政策累计的inflation问题.
用现在的话说就是great inflation.

尽管现在有加息和收紧的趋势,但是市场上商品的价格形成的双要素机制决定了流通交易并不能够被有所影响.
也就是说,不管紧缩还是继续宽松,对于价格角度的inflation来说,可能都没有丝毫影响.

商品价格可能还是会处于一个高位.

因为前期的宽松把价格inflat到一定程度.
imply的就是每一个商品的上下游都有着着这种内生的inflation.

反过来说,就是成本已经discount了景气时期的增长量.
而属于一个严密产业链条下的现代经济是不太可能从单个节点的自主成本降低来解决的.

也即是说,成本的降低几乎不太可能主动顺利的发生.
进而价格不太可能会有所降低.

所以金融危机差不多就是一个不可避免的共识.

在成本不会有大的改善的情况下,会首先出问题的自然就是现金流和利润不足以支持韵味的那一部分.
这样的话,某种程度上来说,疫情造成的停工停产可能反而是一种保护措施.

因为降低了潜在的成本支出.
延缓了企业链条的退出.

更进一步的,如果疫情结束,或者说马上恢复正常的工作生产.
但是因为停工带来的收入降低,生产的恢复理论上造成的反而是立即的生产过剩.
叠加消费本身的衰弱,可能反而进一步加速经济的奔溃.

毕竟相比于停产,投入生产会产生更大消耗,而又不能够得到相应的收入回报自然就是一个更为恶化的场景.

这么想的话,内循环就是另外一个比较有意思的理论了.

2021-12-04

难民心态

大概是上周的这个时候吧,发微博的时候出现了未曾见的异常.
登录web端看了下,原来炸号了.

也尝试看了下解决方案,无非投诉再身份认证之类的.

想了想,还是放过彼此好了.

毕竟有时候你也不知道哪些能发哪些不能发.
或者说什么时候能发,什么时候不能发.

再者,从审核人员的角度来说,一定的自由裁量权一方面也算主宰了一个人的cyborg生存权.
一方面对它个人来说,也是一种达摩克利斯/负担.

毕竟,所谓的宁错杀不放过.
基层执行的点滴过错,其实可能是未来一个不是它能承受的一个事情的结束点.

就像地铁的安检一样.

尽责各自遵循大概是当前语境下一个较优的解.

毕竟当真出事的时候,前线人员失职追责是在所难免的.

所以,某种程度上来说,躺平是各种层面意义上的一个最优解.

当然,说完全看的看也是说不上的.
毕竟,也算事十几年的账号,差不多就是微博内测第一天开始.

碎碎念也有几万条.
说没有一丝的惆怅感叹,也是不真实的.

想想,上一次类似的事情就是中二时期的QQ空间.
大概也是十几年前大学的时候,某天几十篇千字文的空间说不能访问就不能访问了.

某种程度上来说,两件事都算是一种关键节点的缩影了.
 
至少从个人层面的经历来说是这样的了.

放弃幻想,直面当下.

有些事情就不是自以为的长袖善舞能辗转腾挪回避的了.

就像前面说的.
很多事,并不是一个人的决策活或者说能动性能解决的.

每个人无非只是一个庞大系统里的一环.

当然,这也不是说某个单独的现象.

互联网发展到今天,其实审查基本上是一个必须活着说必然的东西了.

每个平台都有着自己的立场和尺度在.

之所以早期互联网有一度的乌托邦式氛围.
就像最典型的Google的don`t be evil信条.

每个个体,或者说每个存在都有着自己的底线,和恪守标准.
而能不能坚持,更多的是一种自我尺度/掌控的东西.

怎么理解这句话呢.

其实就是所谓的能力越大责任越大.
而相对的,greater power和greater responsibility的同时,并不是保证始终是rightful的.

至少这个从不论是个人,还是受众,还是一般围观群众来说,对错和界限这种事情都是游移不变的.

就像社区管理的悖论一样.
你可能不希望有不友善/有害的信息伤害社区的发展,但同时这种想法带来的界限的consensus的达不成本身就是一种破坏.

所以现在谈的web3.0/去中心化,也不过是某种逃避主义而已.

形式上跟拉黑屏蔽做echo chamber是一个道理.

这个还只是平台向善的一个层面的东西.

而作为平台这种influencer中的influencer,即使是从商业角度来说,利益驱动导致的垄断和刻意的引导也不是什么新知识了.

像现在的反垄断抛去一些因素,本质上就是一种趋向明显的objective执行的结果.

也就是算法层面所谓的converge.

而更广义地来说,社交媒体造成的复杂性和声音的多样性也早就了一种管理上的under scale的问题.

不管明里暗里还是形态上的差异,各国的一致的点其实都在于如何能够保持层级结构的执行效率甚至于说执行可能性.

区别只是手段和实现思路的关注点差异而已.

可能用个稍微远古点的流行此来说,就是失控下的各种自救和self healing尝试.

至于能不能成功回到过去,就是另外一回事了.

再回头谈谈Web本身.

封号活着说更泛化的来说,平台追求系统稳定性的手段.
也就是The matrix里Agent smith和Neo的关系一样.

各自不过是by design的角色和命运而已.

从个人或者说从非平台的角度来说,当前Web的风险点在于digital asset的虚无性.

大白话来说,就是实际上你并不能控制你的虚拟身份的存活性.
平台理论上可以完全抹杀掉所有痕迹.

即使是一国总统也是如是.

越是大和基础的平台应用设施,越是被依赖的应用.
就越是本质上持有者一个人的数字存在意义.

这也是为什么说国民应用和大平台渐渐需要被反垄断和强调数据安全与管控的一个点.

形式上来说,这个就是数字时代的暴力机器/机关.

所以,民用即使不是不行,也是有一个更好层次的前置需求在的.

如果真的要有一个Web 3.0来解决这个问题或者说,出于个人角度的困境的话.
去中心化多多少少只是一种形式上的概念或者说思想.

去中心化并不代表着没有平台的存在.
也自然不能保证平台不会走着如今的权力与边界的管控困境之中.

而且可能更重要的一点是,即使是去中心化这个概念,隐含的还是没有脱离掉数字身份/digital identity这个概念的存在.

无论实现形式是如何,一个ID也总是有办法是不可达到/reachable的.

所以回过头来看.
会发觉,这里其实还是Web 2.0.

还是social network的思维.
还是一个以可标识的人或者身份的思路.

无论目的是交友聊天还是其他.
需要的都是唯一标识某个活跃实体.

也就自然的不能回避掉如何鉴定这个实体的问题.
以及如何拒绝resolve这个实体的问题.

所以当想逃离web现状的时候,真正需要的是什么.

如果说无论Web 1.0还是Web 2.0以及可能的Web X.0都一致的原教旨/初始理念的话.
就像两个时代都显著的Google曾经的愿景一样,让一切变得可检索.

换句话说,无论哪个时代.
Web给人的实质需求其实都是信息的流动和获取.

而在经历了凡此种种之后,回头看.
信息的获取和digest需要有标识这种东西么?

或许需要.
因为你可能需要authority或者credit.
或者只是为了减少fact check的负担等等.

但是仔细想想,这是必须的么.

也并不是.

每个人应该有每个人自己的判断方式.

可以是Web 1.0的,也可是Web 2.0的.
也可以是其他的.

比如untitled,anonymous等等.

重要的还是自己对自己负责.

所以可能来说,跟准确的来说是选择的权力.
或者说不依附特定形式的能力.

这么想的话,可能更合适Web 3.0的概念其实是一个更简单的概念.

难民心态.



2021-11-20

关于SQL的几件事

前两天内部confluence上看到有人在做一个go sql sharding的东西.

瞄了眼讨论大致思路是打算在客户端做.
对于这个方案不置可否.

一来毕竟谈了也没什么意义.
二来各人高兴就好.

主要是看到个举例pushdown优化的一个例子插了几句.

大致是类似一个select * from table_a where filed_a in (select * from table_b where field_b = x)这种嵌套的情况.

看讨论大致是觉得不太可能push down,只能做client side的gather + secondary filter.

但实际上是有可能的是有可能的.

因为本质上从logical plan的角度来说,就是一个各自带filter的两级scan.
类似于
scan table_a
  filter op in field_a
    shuffle/exchange
      gather 
        scan table_b
          filter op = filed_b x
之类的形态.
从各个shard filter出来之后,再在这个结果集做exchange/shuffle回对应的shard再做二次filter.
甚至是如果用client side方案的话,直接在client端做二次filter,直接gather回来做引擎执行.

而理论上是存在可能改写为
scan
  gather
    scan table_a
      filter op in filed_a
        scan table_b
          filter op = field_b x
这种形式.

即把整个过程pushdown到对应的shard直接执行再gather.

这个问题的麻烦点在于不是所有的filter都可以pushdown.
只有符合某些特性的才可以.

以这个例子来说,如果要允许push down的话,需要满足:
则对于任意可能的值m,n.
如果shard_of_a(m) == shard_of_a(n).
那么shard_of_b(m) == shard_of_b(n).

即same_shard_of_a(m,n) -> same_shard_of_b(m,n).
如果m n在table_a中是同一个shard,那么table_b里也是同一个shard.

这样的话,逻辑上应该就是类似于并行存在的独立库表,不存在overlay的情况.
自然也就不怕直接pushdown了.

所以某种程度上来说,写planer/optimizer之类的,也挺有意思的.

虽然从商业角度来说,没什么价值.
或者说很难看到直接的利益冲突.

本质上来说都是compiler,只不过是不同form的transform如何选择的问题.

前段时间因为某些原因需要写个PromQL/MetricQL到Cliekhouse SQL的transpiler.

看了一些实现都是相对比较粗暴的只是做了scan和filter一层,剩下的聚合都是在拉取结果集过来再计算的.
而这个恰恰是需要解决的问题的一个因素.

原本的问题是某个metric的label是个高cardinality的东西.
导致的一个问题是,Prometheus本身的execution engine也是简单scan加filter,然后全量汇聚到内存当中算的.
所以在本身数据比较大的情况下,基本上要么算不出来要么直接内存不足整个进程oom/pod被evict了.

更不用说一个附带的数量多带来的存储空间也比较大的问题.

后来尝试用VictoriaMetric.
它相较于Prometheus在这个场景的优势在于,它的execution engine是增量的,或者说是streaming风格的.
即不像Prometheus需要把整个数据集load进内存之后再计算,而是一边读取一边计算.
并且采用了类似sharding/portioning的方式,可以多个goroutine并行地计算不同存储区域.

所以从计算效率上来说,会比前者有优势.

但是它的问题同样一个是存储.
另外一个也可以说是存储.

它的一个存储优化是对每个不同label value的time serial做个了id,这样减少了label存储的开销.
但因为这样需要一个id到lable到结构.

这样对于这个high cardinality的场景来说,id膨胀会非常快.
而每个time serial又非常稀疏,所以对索引等会有性能上的压力.

再一个就是本身设计上有对id生成速率的一些保护机制.
虽然是一个可配置参数,但是理论上总是有可能被拒绝的.

而且关键的问题是,即使有着前述的一些优势,它的计算时效性在几分钟级别.
是不太实际/可用的.

另外一个考虑过的是timescaledb.
它的优势是本身支持PronQL/MetricQL,所以如果可用的话,差不多也是开箱即用.

问题主要在于可能作为商业开源产品多少会有些小心思.

比如它的chunk机制,尤其关于ttl/retire和size等相关的配置.

本身的一些调度比如compact/compress等是利用了postgresql的job scheduler做的.
存储是自己写的一个类似于前两者的针对time serial优化的一些压缩结构.

这个问题在于比如你要设置限定每个chunk/block大小的话,并不是document上写某个参数就能实现的.
去翻它对应实现的plsql的话会发现依赖于其他一些参数的设定.
有些还是从名字上根本关联/完全想不到有联系的参数.

而这个又基本上属于一个必要的tuning部分.
因为它稍微上层一点的实现其实是把某个时间段的数据作为一个独立表来处理的.

所以如果设置的大小太大或者关联的触发条件参数使得触发得很晚或者根本触发不了的话,会导致表膨胀到设计/预期外的大小从而影响查询性能.

更进一步的,它的索引机制的默认参数里里也有些看着是默认开的优化参数.
但是实际看执行计划会发现触发了不必要的扫描.

比如某些语句指定了某个时间范围,并且chunk/table已经按照预期的确定切割正确了,但是实际上还是会触发范围外的扫描.

但是如果把某些优化参数关掉,再看执行计划会发现符合预期了.

当然,往好处想想,这可能是planer/optimizer的bug.

另外一个维度的问题是timescaledb做ingestion的组件的质量问题.

中间有触发db连接失效,但是ingest没有重试直接退出导致chan block整个stuck的问题.
虽然简单提了pr然后隔几天他们自己看了又用另一方式fix了.

还有一个就是因为自己使用不是直接利用promscale那个组件,而是作为库引入了进来.
因为既然不用prometheus了,所以直接自己写scarp直接入库,整合为一个进程.

然后再剥离ingest的时候发现了很多奇怪和不必要使用方式以及接口调用风格.

最后放弃这个方案的原因大致是有点心累了.

在数据量到一定程度后,计算时间也分钟级以上了.
而且查询到时间范围并没有变化.

所以最后转向了clickhouse.

clickhouse作为最后方案的一个原因是没有一个类似timescale的pushdown引擎.
所以如果要用的话需要自己实现PromQL/MetricQL.

至少是场景所用到的语句和对应函数的支持.

AST部分是用的MetricQL的parser.
一方面是因为MetricQL语法上更松散一些,没有强要求区别instant vector和range vector.
另一方面是Prometheus并不太容易作为一个三方库引入进来,这个也是有相关issue明确了的.

所以剩下的就是到SQL到transpiler.

从结构上来说,MetricQL可以很直接的映射成一个嵌套的SQL.
语法上就是metric source scan + filter + function op -> metric source的递归过程.

而且label selector基本就直接解决了最下层的where和row column是什么了.
剩下的就是具体的函数的sql化问题.

比如sum/max等简单aggregate 函数的group 字段inference.
还有topk之类的window函数的应用.

对应到prometheus的http api的话,就有另外一些问题.

上面的只是针对instant value的查询生成.

当然是一般场景会有某个time range的time serial和time range维度的aggregate.
后者就是比如sum_over_time等函数的实现.

因为语法上限定了x_over_time是一个range vector,所以实际上实现也还好.
就是普通aggregate函数再加个time维度的聚合而已.

主要是range查询.

range查询的问题是形式上它是instant查询的不同时间点集合.
所以一个intuition就是直接生成各个时间点,然后再生成各个时间点的sql union起来.

这个从工程上来说是最直接的.

但实际效果却不是很理想.

虽然clickhouse的设计使得即使是底层复杂sql构成的instant查询,比如带metrci[5m]这种带短时lookback的也能在至多秒级出结果,基本无关总数据量多少.

这样一个直觉的话,最多执行时间会是差不多线性的.

但实际的结果却是出人意料地在AST->Plan的阶段.

像一个小时左右的range查询,step是15秒的话也是,240个instant的union.
一些比较复杂的instant sql本身嵌套的层次就比较多.

给每个嵌套生成一个序列table id的话,最后可能上千甚至几千的table.
sql本身的大小也可能到mb级别.

ClickHouse在处理这种大小的sql的编译优化的时候,就不太行了.
时间起码也是几分钟以上.
这在比如grafana端也早就超时了.

平心而论的话,这个应该多数planer都应付不太过来.
毕竟搜索空间膨胀太快.

另外一个思路是类似于x_over_time的聚合.
根据时间生成一个时间范围相关的pseudo group,当作一个普通字段参与到group by当中.
再在最外层remove替换为时间.

这个方式没再去实现.

可能遇到的问题一个是计算出来的时间跟实际存储数据的时间有一定的不一致情况.
这个倒不是关键问题.

另一个主要的是需要对对应的instant函数的处理实现一套range的版本.

当然,也可以以range的版本,用align之后的pseudo时间去生成instant的版本方式实现.

没有继续往下做的原因一个是有其他新的坑要填.

一个也是实际上原始的cardinality问题只需要instant版本的.
没什么太大的必要去完善支持用不到的部分.

至少是暂时用不到的部分.

这里另外一个题外话就是union的那个问题.

理论上来说,如果clickhouse支持类似presto/trino等直接执行plan的方式等话,可能就没解析的问题了.

毕竟归根到底,sql是plan表达能力的一个子集.
如果用plan的方式,可能有些实现就没那么麻烦.

而且这个union其实也算特定的一个场景.
由几乎同态的自查询构成.

想一下的话,不过也就是scan fitter calculate的时候分到不同的group罢了.
可以针对性地下推,避免膨胀的optimizer搜索.








    



2021-09-25

一些数据

拉统计局的发电数据看了下.

2021年8月全国7385.5亿千瓦时.
用过去36个月的数据肉眼forecast一下的话,大致是会比去年同期增加500亿千瓦时的样子.

而按照往年的话8月大致会是一个峰值,9-10两个月份会有一个周期性回落,12月的时候大致会跟一年的峰值相近.

所以如果安500亿千瓦时算的话,应该会是在7800亿千瓦时附近的.

另外一组数据是各类发电的构成.

核能风力大概各自在5%左右.

光伏太阳能虽然今年单比是成倍的增长,但也只占2%多一些.

大部分还是70%火力和18%水力发电.

所以总的来说,电力的构成还是以火力发电为主.

然后同样的看原煤产量数据.

2021年8月的产量是33524万吨.
看数据的话,这两年是某种程度上负增长的.

但大致还是在3w万吨的水平上.

那么一个问题就是,如果按500亿千瓦时的同期电力增幅需求的话,对应的需要多少煤呢?
在考虑全部由火力发电提供的前提下.

翻内蒙华电的2020年度报告.

年发电量是330.85亿千瓦时.
同期发电成本是120亿.
拆分的燃料成本70亿.

另外一个就是主营业务另外一项的煤炭收入.
实现营收平均单价是293.14元每吨.

假设其中的燃料成本就是煤炭成本的话,折算下大致是每亿千瓦时需要7.2万吨煤.

500亿千瓦时的话,就是需要3600万吨.
也即是大致占原煤产量的10%左右.

同样的,如果用这个数据折算8月发电量中的煤炭消耗的话.
对应的就是3.7w万吨左右的原煤,大于当期原煤产量的3.3w万吨.

类似的,如果按3.3w万吨计算发电量的话,则大致会在6651亿千瓦时的水平.
这个大致等于2019年数据的峰值.


考虑如果省份按照火电自给率来计算的话.
缺口比较大的省份是 江苏福建江西湖北广西四川.

如果把缺失数据认为是本身不产煤考虑的话,江苏浙江福建湖北广东四川云南.

两者做个交补,比较瞩目的省份就是浙江和广东了.

再一些比较不是那么权威的数据.

2021年8月进口煤炭2805.2万吨,同比增长35.76%.
换算一下就是大致增长1k万吨.
对比500w预期吨话,倒也是有空间.

另一份也是不那么权威的数据是炼焦煤进口渠道数据.
2019年全年主要依靠蒙古和澳大利亚进口,分别占45%(3377万吨)和41%(3094万吨).
2020前10月分别是1972万吨和3512万吨.

这么看的话,很多事情就比较微妙了.

从电力构成上来说,清洁能源尤其光伏是还有比较长一段路要走的.
即使不是不切实际.

而鼓励水电的发展,某种程度上来说,可以算是一种中短期的权宜之计.
毕竟相比于光伏的效能和对应的电力构成规模来说,水电本身的规模和效能还是相对实际一些的.

但考虑到实际的投入周期和生态影响.
尤其如果考虑气候变化因素的话,某种程度上来说不确定因素可能并不比光伏少.

火力发电的话,至少短期内比例上是不太会有什么可见变化的.
也就是说在原材料需求上压力还是比较迫切的.

加上如果考虑预期和周边的产业诸如新能源汽车等因素,电力需求和资源产出本身以及其他政策目标因素的综合影响.
倒像是个越来越无解的局面.

毕竟目前就属于勉强可堪的局面.






2021-08-29

一些计算

前段时间有个段子吧.
大概就是所有人努力的话,只会物价上涨.

简单的描述就是流通的过程都加一个固定百分比,剩下的就是类似现值计算的逻辑.

这里有个隐含假设就是这饿百分比是instantaneously propagate的.
或者v_{t+1} = v_{t}*(1*p) 的作用是即时超距的.

比较现实一点的模型是这种传导是有一定延迟和滞后的.
就像PPI和CPI一样.

因为供应链存在一定的生产以及更重要的账期时间.

这也是为什么有时候三角债是个难解的囚徒困境问题一样.

具体到个体的话,可能可以换一套描述.
比如何不食肉糜的模型.

给定个人的收入income i和对应的支出household,以及一定的再投资investment.
有income_{t+1}  = income_{t} - household_{t} - investment_{t} +  investment_{t}*k

即下期的收入相关与当期的收入减去当期生活/生存开支,以及当期投资项目.

引入investment的一个目的是描述某种程度的收入成长性量化方式.
可以是狭义的资产方面的投资,也可以是某种非物质性投入的折现.

非物质折现的合理性在于,它是基于当期的一些各种购买开销形成的.
比如培训和再搅匀等.

当个人的发展跟社会财富的增长幅度相匹配的时候.
比如简单的收入增长跟GDP增幅保持一致的情况.

那么,应该有income_{t+1} = income_{t} * (1+p)
->
income_{t} *p =  (k-1)*investment_{t} - household_{t}

因为househould水平是跟整体社会水平增长相关的.
即开头的household_{t+1} = (1+p)* household_{t}

再结合递推income_{t+1} *p =  (k-1)*investment_{t+1} - household_{t+1}
->
income_{t+1} *p =  (k-1)*investment_{t+1} - (1+p)* household_{t}
->
income_{t} * (1+p)*p = (k-1)*investment_{t+1} -  (1+p) * household_{t}
->
investment_{t+1}  =  (1+p)*(income_{t} *p + household_{t}) / (k-1)

当存在持续投入模式的情况下,均衡条件要求k>1,即roi应该是正的.

但是,同样地根据均衡条件,如果ROI为负的话,investment_{t+1}也为负的话.
形式上也是能维持个人和社会步调一致的.

此时有
income_{t+1}  = income_{t} - household_{t} + (k-1)*investment_{t}
->
income_{t+1}  = income_{t} - household_{t} - cost_{t}
即当一般认为的增值增长方式实际上是一个纯消费的情况,也是可以成立的.

recall一下,这个支撑的结论是要求个人收入水平跟社会总体平均水平是等同的.
即隐式地有p等同这个约束.

随之而来的就有几种模式.

一个是对于ROI为负的人群来说, investment也是负的.
或者更一般地
由income_{t+1}  = income_{t} - household_{t} - cost_{t},且要求income_{t+1} > income_{t}的话.
让数值都>0修正符号之后就形式上等价于
income_{t+1}  = income_{t} - household_{t} + funding _{t}
->
funding _{t} >  household_{t}
补助程度应该大于生存开销.

类似的,对于正ROI人群来说需要有
(k-1)*investment_{t} > household_{t} 
这可能有些meaning less.

重新考虑investment_{t+1}  =  (1+p)*(income_{t} *p + household_{t}) / (k-1)
随着增长率p的衰减,为保持平衡investment也将逐渐趋向于0.
即趋向income_{t+1}  = income_{t} - household_{t}的模式.

从通胀的角度来说,就是实际上flatten了.

这里的另外一个问题就是前面提到的.
一个隐含的假设是p是瞬时处处一致的.

但是当作一个动态宏观系统考察的话,是存在类似于弛豫时间的一个概念的.

热力学考察这个问题的时候是通过通过过程无关的最终状态模型来描述的.
因为理论上或者说目的描述上是需要converge到某个特定状态的.

在尝试用微观语义去解释的时候,引入的是系综/ensemble的概念.
即把一个大的动态系统划分为相对有限的isomorphic的子系统来解决的.

而通过这种量化方式可以用相对经典的力学框架去描述/解释状态变迁的驱动过程.

整个系统的状态converge就由这些小的构成部分的操纵来完成.

有时候你也很难说这种宏大叙事的理论框架是错的.
因为它确实能解释相当程度,并且具有一定的先验性质.

当从微观层面来看的话,又过于mystery/unstable.
以致于需要用概率去描述一些往复和纳入极端情况.

2021-08-15

路径无关

之前翻资本论有个比较有趣的衍生点.
即交易是非对称non-transitive的.

也就是所谓的使用价值和交换价值的区别.
一物之于一个人的utility是不一定等价的,所以交换价值是不定的.

从形式上来说,如果给定A=B.
那么A*C ?= B*C 是不一定成立的.

也就是说任意两个商品的交换价值是不可比或者说arbitrary的.

即relative/相对价值的概念.

而从以上形式来说,这个概念脱离其定义时刻的前后都是无意义的.
因为相对/交换价值具有任意性.

那么从理论上来说,所有交易的标价/交易价值都是可以有任意值的.

但实际上来说,真实世界里某一个商品通常具有相对确定的普适价值.

资本论给出的解释是基于劳动力/labor的ensemble.
商品的产出由一系列基准的劳动力投入来衡量.

而劳动力这一个概念又是由所谓的无差别来标准化的.

因为劳动力系统的计算中,劳动力本身被视为一种常数,所以它的标量是相关于时间的.
如果在现实中纯粹应用这个模型的话,会导致一个无视/反效率的存在.

一个例子就是机器生产与人力投入的例子.
两者的效率差导致人力投入的时间更多,但实际价值更低.

那么什么是无差别呢?

它是一种全行业的平均劳动投入.

这是一个稍微有点递归的定义.
注意,无差别是平均的话,那么什么是平均本身呢.

比如当有新技术投入的时候,这个平均值是如何变化的呢?
或者出现减产或者局部地区差异的时候,这个平均又是如何定义的呢?

热力学系统里又个类似的概念.

什么是温度.
温度是一个描述某个特定系统在热平衡时的整体状态的一个度量.

即不管平衡时内部粒子/micro system如何变化,从宏观上来说,它是一个平衡的/平均的.

用这个来解释的话,交易就是一个热力学系统的平衡过程.
或者说是其微观细节.
而价格或者说市场的概念是一种统计意义上的平均值/宏观量.

基于宏观角度的模型解决的事宏观层面的状态变迁依据和计算.

比如一种货币政策目标或者市场利率目标则类似于一个热力学系统的状态计算.
它的实现路径通常来说,并不是理论设计的一部分.

因为它的数学描述的构建就是依赖于这种势函数/路径无关性.

将压强体积等作为变量融入到系统模型到目的不过是为了便于通过这种实验易控制变量来达到状态变迁的predictable/manageable.

类似的就是宏观经济中的各个观测指标.

那么微观意义呢?
它具有微观角度的实用性/可解释性么?

热力学假设用经典力学推演微观细节的时候有个gibbs paradox.
大致就是从微观粒子角度套用热力学结论的时候,两个相同状态的系统混合时演算出现了熵不为零的情况.

熵是热力学系统描述能态变化积分路径无关的一个产物.
类似于描述一个系统不同状态的差值的函数.

即如果两个系统状态系统,那么它们的叠加状态应该也是相同的.
因为没有实际的状态变化.

但是计算的结果却是非零.

这里给出的一个补丁是计算微观状态的时候除以一个1/N!.
给出的intuition解释是N!作为N粒子系统的所有组合状态的可能数量.

但直觉上应该是为了数学上的便利/优雅性.
因为修补过程利用的斯特林公式,将lnN!近似展开得到的熵零结果.

但至少可以认为这个跟N组合相关的intuition有一定的合理性.
即宏观和微观存在一个状态空间大小N!的近似关系.

也就是基本的平均概念.

一个宏观系统要用路径无关的状态函数描述的话,那么它对应的微观表现是具体粒子状态的平均化函数.


牛来餐馆

看了欢迎来龙餐馆. 总的来说,作为一个院线电影,成品多少是有点不太匹配的. 看起来更多像是一部网络大电影. 尤其涉及到一些大场面特效的时候,可以看得出服化道的降本增效. 剧本层面有一些比较有意思或者说闪光点. 就是试图用一个餐馆或者厨师来串起一个比较宏大的叙事题材. 这个可以说是...