权重概率问题-根据value的权重随机求key

题目要求:
定义一个keystringvalueint类型的map,分别表示奖项和对应的权重,请你根据value权重设计一个抽奖系统。

我们可以将问题转化为概率区间映射问题,通过构建累计权重区间,在区间内生成随机数,选择区间。

具体代码实现:

func WeightedRandomChoice(d map[string]int) (string, error) { 
	// 分别存储区间i对应的key,以及累计权重区间的右端点
    keys := make([]string, 0)  
    sum := make([]int, 0)  
  
    curSum := 0  
    for k, v := range d {  
       curSum += v  
       keys = append(keys, k)  
       sum = append(sum, curSum)  
    }  
    // 在区间中生成随机数
    r := rand.Intn(sum[len(sum)-1])  
    // 通过二分查找随机数掉落在哪个区间
    index := sort.Search(len(sum), func(i int) bool {  
       return sum[i] > r  
    })  
  
    return keys[index], nil  
}  
  
func main() {  
    weights := map[string]int{  
       "Apple":  2,  
       "Banana": 3,  
       "Cherry": 5,  
    }  
  
    result, err := WeightedRandomChoice(weights)  
    if err != nil {  
       fmt.Println("Error:", err)  
       return  
    }  
    fmt.Println("随机选择结果:", result)  
}
### Query-Key-Value 的概念与实现 在信息技术领域,Query、KeyValue 是一种广泛应用于数据检索和处理的概念,尤其是在深度学习中的注意力机制(Attention Mechanism)中。以下是对这些概念的详细解释及其实现方式: #### 1. Query (查询) Query 是一个向量,表示对某个特定信息的需或兴趣点。它通常用于寻找与自身最相关的 Key 向量。在自然语言处理中,Query 可以理解为当前需要关注的词或片段[^2]。 #### 2. Key (键) Key 是另一个向量,用来表示数据中的某些特征或属性。它可以看作是数据的一个标识符,通过与 Query 进行匹配来确定相关性。例如,在句子中,每个词都可以生成一个 Key 向量,用于衡量其与 Query 的相似度[^2]。 #### 3. Value (值) Value 是实际的数据内容或信息载体。当 Query 和 Key 匹配成功后,Value 就会被提取出来作为输出的一部分。Value 向量直接决定了最终输出的质量和意义[^2]。 #### 计算过程 注意力机制的核心计算步骤如下: 1. **计算得分**:通过点积或其他方法计算 Query 和所有 Key 的匹配程度,得到一组得分。 ```python scores = Q @ K.T ``` 2. **归一化处理**:使用 softmax 函数对得分进行归一化,确保权重总和为 1。 ```python weights = softmax(scores / sqrt(d_k)) ``` 其中 `d_k` 是 Key 向量的维度,用于缩放点积结果。 3. **加权和**:根据归一化的权重Value 向量进行加权和,得到最终输出。 ```python output = weights @ V ``` #### 示例代码 以下是一个简单的 Transformer Attention 实现示例: ```python import torch import torch.nn as nn import math class ScaledDotProductAttention(nn.Module): def __init__(self, d_k): super(ScaledDotProductAttention, self).__init__() self.d_k = d_k def forward(self, Q, K, V): # 计算得分 scores = torch.matmul(Q, K.transpose(-1, -2)) / math.sqrt(self.d_k) # 归一化处理 attn_weights = nn.Softmax(dim=-1)(scores) # 加权和 context = torch.matmul(attn_weights, V) return context, attn_weights ``` #### 应用场景 Query-Key-Value 的概念不仅限于深度学习领域,还可以扩展到其他技术场景中。例如,在协程间传递数据时,可以通过类似的方式定义上下文中的键值对[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值