第二章:稀有度算法入门

好,咱们直接进入正题。稀有度算法,说白了就是给NFT排个座次。谁稀有、谁普通,不能光靠感觉,得有个数学标准。我最早做NFT项目时,团队里有人提议「我觉得这个特征好看,应该更稀有」——嗯,这种主观判断在链上可没法执行。

2.1 稀有度排名:最简单的思路

先讲最直观的方法。假设一个NFT有5个特征,每个特征有若干种属性。最简单的稀有度排名,就是看「这个属性组合出现的概率」。概率越低,排名越高。

举个例子:

  • 背景:金色(1%)、银色(9%)、蓝色(90%)
  • 帽子:皇冠(0.5%)、棒球帽(9.5%)、无(90%)

如果一个NFT同时拥有「金色背景+皇冠」,那它的稀有度排名就非常高。因为这两个低概率属性同时出现的概率只有 1% × 0.5% = 0.005%。

核心公式: 稀有度分数 = 1 / (所有特征概率的乘积)

分数越高,排名越靠前。

我在项目中遇到过一个问题:如果某个特征概率为0怎么办?比如某个属性从未出现过。嗯,这时候直接除零会报错。我的处理方式是加一个极小值,比如 1e-8,避免程序崩溃。

2.2 特征权重:不是所有特征都平等

你想想看,背景颜色和帽子形状,对稀有度的影响应该一样吗?我个人习惯是给不同特征分配权重。比如「背景」权重0.2,「帽子」权重0.5——因为帽子更显眼,更能决定NFT的视觉稀有度。

加权稀有度公式:

加权分数 = Σ (权重_i × 稀有度分数_i)

这里有个坑:权重怎么定?我建议用社区投票或者专家评分。曾经有个项目,团队自己拍脑袋定了权重,结果社区不买账,闹得挺不愉快。后来他们改成链上投票,权重由持有者决定,这才平息争议。

特征 权重 说明
背景 0.2 视觉影响较小
帽子 0.5 视觉焦点
眼睛 0.3 表情关键

小技巧: 权重总和最好等于1,这样分数范围可控。我习惯用Python的numpy做归一化,省事。

2.3 统计学稀有度:更科学的视角

统计学稀有度,说白了就是看「这个NFT的特征组合,在整个集合中偏离平均值的程度」。用Z-score(标准分数)来衡量。

公式:

Z = (X - μ) / σ

其中X是某个特征的出现次数,μ是平均出现次数,σ是标准差。Z值越大,说明这个特征越稀有。

为什么要用统计学方法?因为单纯的概率乘积有个问题:如果某个特征有100种属性,每种概率1%,那乘积会非常小,但实际并不一定稀有。统计学方法能消除这种「维度灾难」。我记得在CryptoPunks的稀有度分析中,统计学方法就比简单概率法更准确。

注意: Z-score假设数据服从正态分布。如果特征分布严重偏态(比如某个属性占99%),Z-score会失真。这时候我建议改用百分位数排名。

2.4 特征稀有度计算:逐个击破

最后讲特征级别的稀有度。有时候我们不光要看整体排名,还要知道「这个NFT的哪个特征最稀有」。比如一个NFT,背景很普通,但帽子极其稀有——那它的价值可能主要来自帽子。

计算方法:

  1. 统计每个特征属性的出现频率
  2. 计算每个属性的稀有度分数(1/频率)
  3. 对单个NFT,找出所有特征中分数最高的那个

代码示例(Python):

def feature_rarity(nft, collection_stats):
    rarity_scores = {}
    for feature, value in nft.items():
        freq = collection_stats[feature][value]
        rarity_scores[feature] = 1 / freq
    return rarity_scores

我曾经帮一个项目做稀有度分析,发现有个NFT的「背景」特征稀有度分数高达500,但其他特征都很普通。结果这个NFT在市场上被低估了,因为买家只看整体排名。后来我建议他们单独标注「最稀有特征」,交易量直接翻倍。

实战建议: 在NFT的元数据中,除了整体稀有度排名,最好也存储每个特征的稀有度分数。这样市场、钱包、分析工具都能直接读取,不用重复计算。

小结

这一章我们讲了四种稀有度算法:简单排名、加权排名、统计学方法、特征级计算。没有哪种是绝对正确的,关键看你的应用场景。我个人习惯是先用统计学方法做初步筛选,再用加权法做最终排名。嗯,下一章我们会把这些算法搬到链上,用Solidity实现——那才是真正的挑战。

课后思考: 如果NFT集合有10000个,每个有10个特征,用Python计算所有稀有度需要多久?你能优化到1秒以内吗?