拍卖的价格怎么定?聊聊转转拍卖场的起拍定价算法演变

价格策略、定价调价算法是诸多中大规模电商不可或缺的一项能力,涉及到精准定价、智能调价、智能发券、成本控制等一系列智能运营场景,尤其对于二手行业来说,定价能力更是面临诸多挑战,却又不可或缺。本文将旨在介绍转转 TOB 拍卖场景下的二手机定价能力的技术演变,从场景特点引入,以指标为出发点,阐述转转 TOB 拍卖场这一特殊场景下起拍价定价能力的算法思路演变,希望对各位读者有所启发。

1 有些什么——场景特点

这里我们首先向读者介绍一下转转的 ToB 场景,也即 APP 采货侠的业务场景,采货侠是转转公司针对 B2B 场景下的二手手机交易平台,其包含暗拍手机、一口价手机、多品类暗拍等多业务场景,感兴趣的小伙伴可以自行下载了解哈,这里着重了解其中暗拍的概念。

暗拍,顾名思义,是一种拍卖的形式,想必大家多少都了解,涉及到不同用户对不同商品的竞价。暗拍则是其中一种竞价各方对其他方出价价格不可见的形式,从商业意义上来说,目的是避免恶意抬价,或用低价压价,尽可能让商品在合理的价格区间最大可能售出,并且争取更多利润,其基本模式如下图:

采货侠暗拍卖场每天包含下午与晚间两场,商品以起拍价标价上拍。卖场进行期间,买家可对不同商品进行出价,越高越有竞争力。当出价小于起拍价时则无法竞得商品,用户可查看特定时间段的竞价排名,以此决定后续是否继续出价。卖场结束后会自动对价最高者生成订单,该订单需要用户在后续完成支付结算。下面是基本流程示意与暗拍卖场的界面:

2 关注什么——核心指标

介绍完场景,笔者这里要谈的重点是起拍价。我们先从一个例子引入:

假设一件商品回收成本为800元,本身的客观市场价值平均为1000元,预期利润为100元。卖家如果按1元起拍,正常情况几乎100%成交,即使竞价抬价行为会促使其在1-1000元成交,但实际上仍有很大可能所获利润为0甚至为负,竞价不充分,存在丢失毛利的风险。同样的,卖家如果按5000元起拍,可能理论上一本万利,但几乎不能成交,也等于没有利润,即使通过流拍策略不断降价,周转过慢,一样丢失毛利。

聪明的读者可能已经发现了,如果在这个例子中以合适价位起拍,自然能在保证成交的情况下留有合理利润空间,比如按照950元起拍,或许成交价格可以在1000、1020、1100甚至更高。退一步来说,若不成交,其流转周期也相对较短可及时止损。即使仅仅获得了951元的出价,也达到了我们的预期——既成交了也保证利润空间,也说明该商品或许现阶段买家最大预期即是如此,无法苛求更多,说明竞价过程已然充分。

足见合理的起拍价既是卖家视角拍卖商品的底线价值衡量,也是对商品能够充分竞价的保证。讨论其制定,首先需要以下三个指标:

  • 成交率即售出占比,衡量的是商品对于买家来说的受欢迎程度,也是卖场好坏指标的直观体现。
  • 毛利则是销售额与回收成本的差值,代表着每次成交中卖家获得的利润,是根本的经营指标。
  • 溢价则指的是成交价格与起拍价的差值,代表着一种不确定性,溢价空间越小,说明起拍价格贴近真实市场价格,同时成交价格也会被逼近至理想值,竞价空间也会充分释放。

3 如何去做——衡量先行

那么如何定出合适的起拍价呢?回答这一问题前,要先回答一个问题,如何衡量起拍价是合适的?由果索因,有评价论才有方法论。有了指标,当然还需要知道如何去从指标反映效果。

如下图,从买家角度来看,起拍价是卖家给出的,是定量,出价是变量,最后的成交价必然是围绕着客观市场价值且大于起拍价的值,但作为制定起拍价的卖家一方来说,成交价才是定值,而起拍价是变量,起拍价一定是小于等于最终成交价且围绕着客观市场价值的值,而由于客观市场价值没有办法准确获取,最终成交价可以视为客观市场价值。

既然如此一定存在如下关系,假设对于单个商品,起拍价为sp,成交价为dp,成本价格为cp,用函数F(sp)衡量起拍价的好坏,函数η(sp)表示溢价率,函数γ(sp)表示成交率,则有:

该式有以下几个含义:

  • 起拍价制定的好坏标准与成交可能、准确度有关,成交可能越大,定价越准确,说明起拍价制定越好。当起拍价与最终成交价的差距越小时,相比最终成交价更接近,说明起拍价制定更为准确,这个差距正是溢价率;
  • 成交率的变化与成交价和起拍价的关系有关,假设一个商品已经以500元成交,对卖家成交价已然是定量,那么如果回到出售之前,是否可以认为1-500元定价,其成交率均为100%,而超过500定价,其成交率必然随着价格呈现指数型下降;
  • 溢价率为定义式,值越小,说明起拍价与成交价差距越小,起拍价的制定更加贴近真实成交,相对更能反映真实价值。

实际上,从卖家视角来看,最终的目标也是最初的优化出发点,是想提升毛利,从单一商品角度来看,毛利其实是不确定因素,因为成交价是由买家控制的,但我们仍然假设dp0为理想成交价,cp为固定成本价,即不会再有更高的成交价存在,设G(dp)表示毛利率与成交价的关系,g(sp)表示毛利率与起拍价的关系,那么存在以下关系转化:

以上关系可以推出,若成交价为定值,起拍价按照真实成交价制定时,其所获利润最大,我们再把成交率和溢价率与起拍价的关系画出函数图像如下:

可以看出当起拍价小于等于且逼近成交价时,成交率始终为1,溢价率逐渐趋近于0,而超出成交价时,成交率指数下降,溢价率也逐渐增大。自然不难发现,让F(sp)最大化即最大化成交率,最小化溢价率,而由于在小于成交价的范围内,成交率取得最大值1,那么理论上整个优化点则可以用如下式子描述:

最终优化目标归结于使得起拍价从正向趋近于真实成交价,则该起拍价制定最为合理。而从评价的角度,则当成交的情况下,溢价率越小说明起拍价制定更好。

下面借助图来说明:

当溢价越来越小时,利润空间右端点越向右,范围越大,毛利率也就越多。由于起拍价是从小于成交价的一边趋近,其成交率始终可视为1。
对于全局多商品来说,每个商品要么估价高了,模型向理想成交价降低价格促使成交,要么估低了,模型逼近成交价提升利润空间,同样适用降低溢价的理论。由此我们便找到了优化与评价的方向。

4 取经路上——早期实践与痛点

了解了指标和基本的思路,接下来就往前一些,从早期思路出发,探讨下演变过程中种种实践的得与失,优与劣。

4.1 基于回收价的实践

做电商必然要保证一定的利润预期,又要尽可能保证能成交,最直观的思路便是以下规则进行制定:

这样做的优点是,简单直接,实现比较容易,卖场直接与回收挂钩,获得的毛利比较稳定可控,适合品类与库存规模相对单一的场景。但缺点相对也很突出,主要有以下几点:

  • B端二手市场回收成本价格不稳定,由于卖家货源不同,即使是同SKU近似机况的两台机器,可能回收成本也相差较大,无法反映出客观的买家市场价值,放在同卖场无法按照统一标准定价上拍;
  • 对于预期毛利率,卖家乃至卖场方均无法给出或者持续给出一个合理的心理预期,尤其在不同SKU乃至不同机况的机器,可能预期均不相同,没有统一衡量的标准,制定困难;
  • 基于运营人力去制定预期利率,对于大体量的品类与库存规模下,非常缺乏人效;
  • 很大概率仍然存在成交与利润空间未被充分释放的可能,因为起拍价不能准确反映其买家市场价值,极易出现定价偏离等情况。反映在指标上则是,不同商品高成交高溢价或者低成交低溢价,整体方差极大且不稳定。

所以这种思路在发展初期尚且可行,但在规模逐渐变大的情况下,难以长期运营。

4.2 基于价目表逻辑的实践

既然买家市场价值是最好的制定起点,我们不妨就沿着这个思路进行。尽管市场价值无法准确获取,但作为运营方可以通过历史数据、经验、规则辅以人工校准等确定一个SKU维度价目表,根据成色等其他机况再乘以系数,思路举例如下:

该思路基于价目表这一先决条件的维护,用以模拟标品市场价格,随后再根据具体的成色、机况等确定系数进行微调。其优点是相对基于回收价出发,维护标准价格会使得整个链路模块化、细致化,制定相对准确。其不足之处也同样明显:

  • 价目表的维护仍然需要运营人力介入,人效较差,需要定期维护更新困难,难以形成自动化的算法方法论;
  • 价目表本身的准确性、时效性有待商榷,在庞大的类目体系下,不同类目的数据量、人力投入、人员经验不足以实时准确捕获其回归到SKU维度标品的价值情况;
  • 控制性较差,即使确保价目表一定准确实时,在从SKU向成色机况等细粒度落时,仍然需要确定庞大的系数体系。即使可随时配置调整,其不同品类机况下想保证覆盖准确,这点仍然非常吃力。

故在人力资源充盈且缺乏算法能力时,该方案值得一试,如果需要长期高效运营,自动化算法能力必不可少。

4.3 基于成交价策略的实践

如果需要自动化省时省力,又需要一定的准确性、时效性,再结合前一章中的内容,那么在已有的合适数据中能反馈其市场价值的首先是成交价。前面我们也提到,成交价对于卖家视角可以认为是定量,代表着买家的最终心理预期,基于历史成交价去制定起拍价,有以下好处:

  • 每日均会产生新的成交数据,成交价可按日期进行滑动窗口更新,保证稳定取到新数据,时效性强;
  • 成交价作为制定目标,理想情况下可以认为相同商品下次按照这个价格上架,成交率100%,溢价率0%。虽说理想,一定程度上也说明了作为目标其评价足够好。

出发点有了,要实现算法自动化,且效果足够理想,还需要设计整个算法系统,初期我们的框架构想如下:

其基本的设计理念与内容有以下几点:

4.3.1 首次与流拍划分

首先将起拍价的制定分为两块,首次上架与流拍,分别指第一次进入卖场和多次进入卖场的商品,前者使用模型自动化出价,后者按前次价格与预置比例折价后再上架。

为何如此划分?我们可以基于一个基本假设,如果是理想模型,对于每一个商品在首次上架时就能制定出成交率为100%,溢价为0的起拍价,理论上就不存在首次与流拍,显然不可能。

必然一部分可成交,认为小于等于买家预期,另一部分不可成交超过买家预期。如果我们仍然在第二天仍用模型对不可成交的部分报价,由于模型每日更新,新模型给出的结果必然会出现价格跳变这一不可控因素,影响买家印象。

若认为模型给出的价格相对靠谱,即使流拍,我们以此为价格高点,逐渐平滑下降,这样能确保低溢价的同时逐渐增大成交可能,也减轻了模型负担,如下所示:

4.3.2 SKU成交基准价

流拍策略较为简单的就缩小了求解范围,重点来到首次上拍商品定价模型。首先就是用成交价自动计算的“类价目表”,其基本逻辑如下:

每一种SKU维度的商品都基于该SKU下的全部N个商品成交价格关于业务系数α放缩后进行加权平均,这里的放缩操作考虑了不同机况下的平滑机制,防止异常价格和卖场差异的影响,使最后的基准更加趋近于真实价值,α详细逻辑基于不同业务进行单独条件设计,这里不再详述。

通过这样较为简单的设计,可以将基准价的获取基于成交价自动化,有效且可解释,并且天然低溢价。

4.3.3 系数调控模块

在上一节中我们知道,合理的起拍价区间介于回收成本与成交价之间,假如市场恒定,即库存、需求、供货等稳定不变,我们必然可以找到一个稳定的起拍价使得成交/溢价最大化。

但很显然的是,实际上市场不会这么理想,对于不可控的市场因素,基于已然发生的成交价结果很难、甚至不太能用算法去捕捉这种变化因素,自然,人工介入的调控机制也不可或缺,这里需要引入以下三个维度的可配置系数:

  • SKU基准系数,用于纠偏部分SKU基准价格,系数量等同SKU数量;
  • 成色等级系数,用于控制不同成色等级机况价格变化,数量等同质检成色等级数量;
  • 全局调控系数,仅一个,对所有模型输出结果生效,用以整体控制输出口径。

这样做从原本商品粒度人力调控转到SKU×成色粒度调控,理想情况下本身相对准确的价格不必需要频繁调整,只需要根据市场反馈适当监控即可。

4.3.4 风控模块

即使是非常清晰简单的模型构建,风控模块仍然在价格领域不可或缺,毕竟即使是一个badcase也是利润的损失。风控模块在起拍价定价中主要起到两个作用,一是过滤纠偏异常价格,二是提高报价覆盖度兜底。

异常价格一般出现在特殊机况,比如质检项难获取、质检有误等异常质检机器,会通过单独维护机况条件进行系数控制,并依据回收价设置价格上下限,防止定价过低或过高。

报价覆盖度逻辑主要解决新机、老旧机器等数据稀疏,成交缺失的部分,让模型报价能力更全面,这部分分层处理,对于报价要求高的新机进行异常处理交予人工,对于报价要求低的老旧机器使用均价降级策略兜底,即细粒度机况缺失便向粗粒度聚合报价即可,最粗可以到机型粒度,如下图:

整体来看,基于成交价策略的起拍价算法化的核心点是一种统计思路,并把问题拆解模块化,先拆报价范围,后拆策略模块,对于不同的模块制定不同的策略。在早期的实践中,该方案具有以下成效:

  • 使得成交率与溢价率进入一个比较可观的范围;
  • 模块化使得问题定位排查更清晰;
  • 微调反馈明显,可以及时跟上市场需要;
  • 基本实现了自动化,提高了人效。

但在实践过程中同样有很明显的问题亟需解决:

  • 定价粒度过粗,基本停留在SKU成色等级粒度,对于机况粒度捕捉较少,这使得整个起拍价格分布相比实际价值刻画欠拟合;
  • 成色等级是人为划分概念,在B端市场对于实际机况划分不准,这使得这一策略天然有偏;
  • 基于回收价格使用上下限进行风控,在3.1中提到的回收价的弊端在这里依然存在,以此风控使得部分正常报价也陷入异常;另外降级聚合兜底的方式也无法摒除异常数据、稀疏数据带来的覆盖难问题;
  • 调控模块系数量过大,即使光手机一个品类,其机型、SKU粒度便有成千上万,在交叉更细粒度后更有甚之,仅仅case by case去监控调整,也容易因为系数过多而难以判断调整思路,其调节复杂度是O(*N_sku*×*N_level*×...)。并且由于欠拟合状态下,系数的调控非常容易误伤,造成成交和溢价空间未充分释放,成交与溢价容易产生trade-off现象。

5 修成正果——现有模型构建思路

针对4.3中提出的思路与缺陷,我们顺着这个模式进行进一步优化迭代,首先需要肯定的是,该思路中对于起拍价制定问题的模块化拆解思路值得延续,虽存在缺陷但基本都囿于具体的模块内,仅需进行针对性改进。

5.1 现有模型框架

整体给出现有的模型框架如下图所示:

可以看到整体的模块设计与流拍逻辑基本上没有变化,不同在于模块内细节进行了大幅度调整,在首次定价模型上从SKU基准价直接跃升至商品粒度定价,下面将详述。

5.2 主要模块设计与思路

5.2.1 价格模块

相较于此前的SKU基准价格,本次价格模块丰富了较多内容,核心改进点有以下几个方面:

  • 粒度

价格分布的刻画拟合能力不足,核心原因还是模型只是通过统计手段给出了SKU粒度的价格,然后使用统一的等级机况系数去推进到商品粒度。本质上还是停留在SKU×等级的粒度,很难将报价精确到每一种机况上。而本模块则将模型报价能力聚焦至质检项粒度,针对每一种不同的SKU——验机项单独报价,摒弃了不够准确的等级粒度。

  • 模型

粒度更细,传统统计方法自然无法满足期待,我们需要拟合SKU——质检项数据与历史成交价数据二者间的关系,对于多维度特征来说,机器学习模型当然更好。这里可选用的模型较多,常见回归模型均可,这里笔者选用决策树模型,整体基本逻辑与使用的特征类型如下:

由于成交数据量不算庞大,且商品信息与质检项数据可以处理为纯表格数据,故而树模型更具有优势。另外在天然的可解释性前,不同商品、质检项特征可以根据重要性进行特征选择。

这里还有一些小trick,对于回归模型,可以将label价格取对数,调参时可适当增加树的复杂度以使得稍微过拟合,这样对于数据量有限的价格预测来说更具有稳定性。

  • 数据与特征

敲定粒度,选型模型,自然需要回到最初的数据选择与特征处理,除成交数据与商品的基础特征外,本次引入的数据包括质检项数据与出价数据。

质检项数据即每台机器质检报告中项目的明细,其检测结果一般以ID与程度词进行描述,对于机器学习模型来说很难直接使用,于是首先需要对其进行预处理,处理方式如下:

单一质检项的程度词(如细微、轻微、明显、严重)降序映射为分数(如8、6、4、2),而不同的质检项根据重要程度升序进行打分,另外根据价格排序下的质检项共现频次也可以获得不同机型下的核心质检项打分。通过这种方式就可以把离散程度值转为可比较的连续值,使机器学习模型可进行训练、验证、预测。

另外,每个商品在进入卖场后,无论是否最终成交,成交在什么价位,只要成交就一定有相应的出价,可能只有一个且等于成交价,也可能来自于不同买家的多个均小于等于成交价,其大致的分布如下:

这里引入出价的含义为,即便成交价代表了最理想的成交结果,但合理的出价所落的区域则更能反映该商品在买家心中的价格锚点,用作风控是非常理想的,如果模型给的价格过于偏离锚点,则进行纠偏的置信度相比回收价更高,如果按照成本基线风控,其附近的价格点均浮动在异常出价附近,与成交基线相去甚远。

5.2.2 系数调控模块

既然价格模块已经能做到商品粒度报价,那么调控模块自然减少压力,仅仅需要全局系数与流拍系数即可实现整体的指标影响,由于本身拟合度高一般不需要细粒度微调,若需要则根据需要按由细到粗的生效优先级配置个别系数即可实现,其调节复杂度是O(1)级别。

5.2.3 风控模块

在上一节中提到使用出价作为风控价格锚点相比回收价更准确,以及降级聚合进行兜底收效不佳。那么对风控模块的迭代将针对这两处进行:

  • 上下限逻辑

对于模型价格进行归正,直观的方式就是设置上下限,简单说就是需要模型报价落在合理区间,此前使用回收价作为锚点设置上下限反而倒反天罡,因小失大。作为锚点来说,历史成交价置信度最高,买家出价次之,最后才是成本价,这三种价格数据特点如下:

历史成交价买家出价成本价
覆盖率与数量最低中高最高
置信度与准度最高最低

可以看到三种数据在两种特征上呈逆序排布,成交价很难在所有机器上都能覆盖,毕竟不能说所有的SKU×等级机器都有售出且数量可观,长尾机器一定存在,但是作为商品价值反映一定是最可信的,其余两种数据同理,于是设计上下限风控逻辑时可以做阈值控制,其大概逻辑如下:

# 阈值集合
thres_value_set = [tv1, tv2, tv3, tv4, tv5]
# 历史成交价
historical_deal_price_set = [dp1, dp2, dp3, ...]
# 历史出价
historical_offer_price_set = [op1, op2, op3, ...]

# 最终报价初始为模型报价
final_price = model_price
# 阈值判断: 历史成交价与历史出价均置信 以成交为超限判断
if historical_deal_nums > thres_value_set[0] and historical_offer_nums > thres_value_set[1]:
    # 超出上下限判断
    if model_price < min(historical_deal_price_set) * thres_value_set[2] or model_price > max(historical_deal_price_set) * thres_value_set[3]:
        # 最终价格取成交与出价均值
        final_price = (np.average(historical_deal_price_set) + np.average(historical_offer_price_set))/2
# 阈值判断: 仅历史出价置信 以出价为超限判断
elif historical_offer_nums > thres_value_set[1]:
    if model_price < min(historical_offer_price_set) * thres_value_set[2] or model_price > max(historical_offer_price_set) * thres_value_set[3]:
        # 超限取模型与历史出价的较大值 以保利润优先 未售出可流拍
        final_price = max(model_price, np.average(historical_offer_price_set)) * thres_value_set[4]

根据阈值控制置信度与区间范围,再根据同SKU×等级下的价格聚合值控制是否超限,超限后如何处理。这样做的好处是基本上能将模型可能会出现的异常报价控制在一个合理的范围内,并且所用到的系数不多,调节方便,阈值可以通过数据分析求解。

  • 兜底逻辑

在提高覆盖率这部分逻辑中,先前的想法是细粒度的价格数据稀疏,就向粗粒度降级聚合,这样做虽然可以提高覆盖,但是很容易受货源结构影响,报价不准确且在稀疏侧容易被带偏。迭代中采取如下思路:

  1. 考虑商品的最低可接受报价粒度,在手机上则是机型×容量×等级;
  2. 现状是机型容量几乎满覆盖,但具体到等级甚至机况则历史缺失较多,要解决的低覆盖问题也在此;
  3. 基本思路是用粗粒度去推广泛化到细粒度,但直接用粗粒度聚合去替代报价,会发现偏差较大;
  4. 取而代之,将直接替代进行转化,举例说明如下:

简单来说,根据已有的机型容量×等级聚合出机型容量均价,将等级序列化后,考虑机型容量均价等级存在如下简单的线性关系,从而推广到全部机型容量×等级粒度,实现全覆盖,并且在划定价格段前提下一定程度内近似准确且严格防止等级倒挂,对于兜底报价需求能够满足。

至于求解上就比较容易了,使用一个简单的线性回归OLS模型即可对其进行求解,需要注意的是,在实际使用中对于这种简单模型,通常需要按照价格段划分缩窄成交价格值域后训练多组线性模型进行覆盖补全时,效果更好。

5.3 效果与后续优化空间

介绍清楚了当前最优版本的逻辑与架构,我们简单看一下该版本投入采货侠拍卖场起拍定价后的效果,并讨论其后续改进方向。

5.3.1 模型效果

我们从苹果与安卓手机分别进行举例说明这个效果,下面图中为模型AB实验,对照组A为第三节中的SKU成交均价策略,实验组B为第四节新模型体系,脱敏隐去实际值,相同指标处于同坐标刻度下,苹果手机效果如下图:

从品牌来看苹果手机特点是品类少,数据量大,高值商品多,价格方差小,所以本身在精确度,也即溢价率上本身效果较好,所以新模型在溢价率上小幅度降低,但在成交率上提升明显,说明模型在中低值商品上估价更准,使得商品流通速度更快。

而从安卓机上来看,其品类繁多,数据量相对少,低值机器更多,价格方差大,本身成交率已经很高,相应的价格拟合度差,溢价高,于是新模型通过商品粒度报价、风控兜底改进,主要在报价准确上获得较大提升,数据上体现于成交率持平,溢价率大幅度下降。

本质上来说,其实模型优化的都是价格准确度,即降低价格方差,提升拟合度,让起拍价更逼近真实成交,只是在不同的商品结构上呈现不同的侧重点,本质上都是双端优化,既降低溢价又提升成交,使看起来trade-off的两个指标都获得提升,释放了利润空间。

为什么可以这么说,还记得系数调控机制吗,实际上我们只要对其中一幅图像中的模型报价输出进行放缩,两幅图像就会获得相同的呈现形式。因为放缩系数不改变分布,只是让成交和溢价呈现同步变化。而这个双端优化加上同步变化既释放了利润空间又给出了可通过调控应对市场的能力,且调节成本不高,方向明确。

5.3.2 后续优化空间
  • 整个系统中虽然实现了几乎无人力介入,但在应对市场变化时仍然存在一定的滞后性,需要人工及时反馈给调控模块,这一点还需要继续精进以实现完全脱离人力;
  • 当前架构下,流拍商品的逻辑过于简单,虽然高位折价溢价低,但普遍设置的流拍系数不具备普适性,单独设置又耗费人效,部分商品折价过慢导致售出效率低,这里可以通过类似强化学习的方法进行动态折价优化;
  • 风控模块还不足以完全高准确率、高覆盖率的实现纠偏与兜底报价,期待更完备的方案设计;
  • 整体架构与模块设计可能亦是山外青山楼外楼。

6 再说两句——总结

本文主要从起拍价定价这一实际应用场景出发,以实际问题举例,指标先行提供指导方向,再逐步介绍每一种算法思路,步步为营,扬长避短进行优化,最终给出目前还比较work的一种方案。作为算法类技术分享来说,本文不包含复杂高深的算法理论,单从分析、解决问题的角度演进,旨在分享系统化、模块化、结构化的思考方式,希望广大读者有所裨益,疏漏、不足之处万望海涵。

关于作者

陈烨,转转高级算法工程师,负责转转B端搜索召回、排序算法设计优化,以及B卖场起拍价定价算法、C卖场调价系统迭代优化等价格方向工作。

转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。

关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883926.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kibana开启访问登录认证

编辑es配置文件&#xff0c;添加以下内容开启es认证 vim /etc/elasticsearch/elasticsearch.yml http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization xpack.security.enabled: true xpack.security.transport.ssl.enable…

解释器模式原理剖析和Spring中的应用

解释器模式原理剖析和Spring中的应用 解释器模式 是一种行为型设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并提供了一个解释器来处理该文法的表达式。解释器模式可以用于构建语法解释器&#xff0c;例如计算器、简单编程语言的解释器等。 核心思想&#xff1a…

Java框架学习(mybatis)(01)

简介&#xff1a;以本片记录在尚硅谷学习ssm-mybatis时遇到的小知识 详情移步&#xff1a;想参考的朋友建议全部打开相互配合学习&#xff01; 官方文档&#xff1a; MyBatis中文网https://mybatis.net.cn/index.html 学习视频&#xff1a; 067-mybatis-介绍和对比_哔哩哔…

人工智能时代,程序员如何保持核心竞争力?

引言 随着AIGC&#xff08;如ChatGPT、Midjourney、Claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作&#xff0c;也有人认为AI是提高效率的得力助手。面对这一…

一天面了8个Java后端,他们竟然还在背5年前的八股文!

今天面了8个Java候选人&#xff0c;在面试中我发现他们还停留在面试背八股文的阶段&#xff0c;5年前面试背八股文没问题&#xff0c;随着市场竞争越来越激烈&#xff0c;再问普通的Java八股文已经没有意义了&#xff0c;因为考察不出来获选人的真实实力&#xff01; 现在面试…

cpu路、核、线程、主频、缓存

路&#xff1a;主板插口实际插入的 CPU 个数&#xff0c;也可以理解为主板上支持的CPU的数量。每个CPU插槽可以插入一个物理处理器芯片。例如&#xff0c;一台服务器可能有2路或4路插槽&#xff0c;这意味着它最多可以安装2个或4个物理处理器。 核&#xff1a;单块 CPU 上面能…

C++ 异步编程中:future与promise、packaged_task、async

原文链接&#xff1a;C 异步编程之future与promise、async、packaged_task_std::promise和std::future异步发送-CSDN博客 1、std::future std::future类模板来关联线程运行的函数和函数的返回结果&#xff0c;这种获取结果的方式是异步的 std::future 通常由某个 Provider 创建…

unity 打包安卓 RenderTexture显示红色

1、ColorFarmat&#xff1a; 每个图形卡可能并不支持跨格式的所有用法。使用 SystemInfo.IsFormatSupported 可以检查图形卡支持的用法。 None未指定格式。R8G8B8A8_UNorm一种四分量、32 位无符号归一化格式&#xff0c;在字节 0 中具有 8 位 R 分量&#xff0c;在字节 1 中具…

Java面试篇基础部分-ReentrantLock详解(二)

Lock 接口的主要方法 void lock():给对象加锁,如果锁没有被其他线程使用,则当前线程获取到这个锁;如果锁正在被其他线程持有,则将禁用当前线程,直到当前线程获取到锁。boolean tryLock():试图给对象进行加锁操作,如果锁没有被其他线程使用,则将获取到这个锁并且返回tr…

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

【入门01】arcgis api 4.x 创建地图、添加图层、添加指北针、比例尺、图例、卷帘、图层控制、家控件(附完整源码)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title></title><link rel"s…

CDGA|数据治理:策略与价值的深度融合

在当今这个数据驱动的时代&#xff0c;企业数据治理的重要性日益凸显。数据不仅是企业的核心资产&#xff0c;更是驱动业务决策、优化运营流程、创新产品服务的关键力量。然而&#xff0c;要让数据治理真正发挥价值&#xff0c;企业需要采取一系列策略来确保数据的准确性、完整…

C++之二叉搜索

1.二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它有以下的特点。 1.如果它的左子树不为空&#xff0c;则左子树上所以结点的值都小于等于根结点的值 2.如果它的右子树不为空&#xff0c;则右子树上所有结点都大于等于根结点的值 3.它的左右子树也分别为二叉搜…

【C++笔试强训】如何成为算法糕手Day3

​ 学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;除2&#xff01; 第二题&#xff1a;dd爱框框 第三题&#xff1a;简写单词 第一题&#xff1a;除2&#xff01; 牛客网…

数据保护从现在开始:如何抵御 .[RestoreBackup@cock.li].SRC 勒索病毒

导言 勒索病毒是一种不断演变的网络威胁&#xff0c;.[RestoreBackupcock.li].SRC、[chewbaccacock.li].SRC勒索病毒便是其中一种新型的攻击手段。该病毒通过加密用户文件并要求支付赎金来恢复访问&#xff0c;给个人和企业带来了严重的安全风险和经济损失。本文91数据恢复将探…

25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20检测温度&#xff0c;滑动变阻器连接数模转换器模拟电流、电压&#xff0c;通过LCD1602显示&#xff0c;程序里设置温度阈值为40&#xff0c;电流阈值为60&am…

新版torch_geometric不存在uniform、maybe_num_nodes函数问题(Prune4ED论文报错解决)

这是在复现论文“Towards accurate subgraph similarity computation via neural graph pruning”时遇到的报错。 ImportError: cannot import name uniform from torch_geometric.nn.pool.topk_pool 一、报错原因 论文作者使用的是2.1.0版本的torch_geometric。而我安装了2.…

[vulnhub] Jarbas-Jenkins

靶机链接 https://www.vulnhub.com/entry/jarbas-1,232/ 主机发现端口扫描 扫描网段存活主机&#xff0c;因为主机是我最后添加的&#xff0c;所以靶机地址是135的 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-21 14:03 CST Nmap scan…

linux信号| 学习信号三步走 | 学习信号需要打通哪些知识脉络?

前言: 本节内容主要讲解linux下信号的预备知识以及信号的概念&#xff0c; 信号部分我们将会分为几个阶段进行讲解&#xff1a;信号的概念&#xff0c; 信号的产生&#xff0c; 信号的保存。本节主要讲解信号 ps:本节内容适合学习了进程相关概念的友友们进行观看哦 目录 什么是…

教练车一键启动应用‌案例

教练车一键启动应用‌主要提供了便捷的车辆启动方式&#xff0c;通过一个按钮实现车辆的启动和熄火&#xff0c;简化了传统的打火过程。这种智能配置不仅提升了车辆的科技感&#xff0c;还增加了市场竞争力。一键启动系统可以在原车钥匙锁头位置安装&#xff0c;也可以作为独立…