【问题标题】:How do i create a majority voting based in two arrays?如何创建基于两个数组的多数投票?
【发布时间】:2021-02-01 19:06:01
【问题描述】:

场景:

我想创建一个基于考虑到某人对N 观察结果的投票权重的多数投票系统。

因此,M 观察者将从 3 个类别 (1,2,3) 中选择对 N 观察结果的猜测。对于每个观察,每个观察者都会有一个与之关联的权重。

定义:

  • G:每个观察/观察者的猜测矩阵(N 观察 × M 观察者);
  • W:每个观察/观察者的权重(N观察×M观察者)

例子:

# 2 observations, 3 observers
G = [[1, 2, 3],
     [2, 2, 1]] 

# Weights (influence) each observer has about each observation
W = [[0.1, 0.2, 0.3],
     [0.3, 0.1, 0.2]]

我需要计算另一个形状为 (N 观察 × C 类) 的矩阵,该矩阵存储观察来自特定类的概率。

使用上述值的示例:

G = [[1, 2, 3],
     [2, 2, 1]] 

W = [[0.1, 0.2, 0.3],
     [0.3, 0.1, 0.2]]

P = [[0.1,    0.2,  0.3],
     [0.2, (0.3 + 0.1), 0]]

在计算出P 矩阵后,我可以逐行应用np.argmax() 来获得具有最高值的列(类):

P = [[0.1, 0.2, 0.3], #class 3 has highest value (0.3)
     [0.2, 0.4, 0]]   #class 2 has highest value (0.4)

result = [3, 2]

我想知道如何结合G 和W 来生成P 矩阵。

【问题讨论】:

  • P 不是正确的数据结构,概率是如何计算的?
  • 对不起,我不明白为什么P 不是一个正确的数据结构,它是一个矩阵。样本的概率来自所有观察者根据他们投票的类别的总和。
  • [[(0.1, 0.2, 0.3], [0.2, (0.3 + 0.1), 0]] 这个括号没有结束部分
  • 已修复,这是一个错字。谢谢。

标签: python numpy matrix


【解决方案1】:

您可以使用 NumPy 的 indices 和 advanced indexing 以矢量化方式完成工作:

In [569]: import numpy as np

In [570]: G = np.array([[1, 2, 3], [2, 2, 1]] )

In [571]: W = np.array([[0.1, 0.2, 0.3], [0.3, 0.1, 0.2]])

In [572]: C = 3

In [573]: M, N = G.shape

In [574]: row, col = np.indices((M, N))

In [575]: P3d = np.zeros(shape=(M, N, C))

In [576]: P3d[row, col, G-1] = W

In [577]: P = P3d.sum(axis=1)

In [578]: P
Out[578]: 
array([[0.1, 0.2, 0.3],
       [0.2, 0.4, 0. ]])

【讨论】:

  • 将此解决方案应用于特定案例时出现错误:indexError: arrays used as indices must be of integer (or boolean) type。你有什么线索我错过了什么吗?
  • 用这么少的信息很难弄清楚问题出在哪里。在解释器中输入G.dtype。你应该得到int32 或bool。否则您需要更改G 的数据提示。无论如何,为了获得进一步的帮助,我建议您发布一个新问题,并完整描述该特定案例(数据、代码和回溯)。
  • 好的,我去看看。谢谢!
  • 您能解释一下为什么G -1 在[row, col, G-1] = W 中吗?进行一些测试,比较来自投票的猜测和实际输出,所有答案都移动了 1,当我删除 G-1 时它会很好。
  • 您将这些类标记为1、2、3 等。在Python 中,索引从0 开始。因此,为了索引P3d 的正确元素,您需要从G 中减去1。
【解决方案2】:

用零值初始化 P 然后通过 G 的观察值/行和索引值进行迭代,即 g[observation][index] 如果类 1 然后将 weight[observation][index] 从 W 矩阵添加到 P[observation][class ]+=权重[观察][指数]。即在您的示例测试用例中。对于第 1 行。索引 0 的值为 1,权重 [0][0] 为 0.1,因此将 0.1 添加到第 0 行和 P 的索引 [类]。类似地,索引 2 和 3 的值与索引相同,因此在 P 中相同。

现在对于第 2 行,索引 1 具有类 2,因此我们将类 2 的权重添加到 p[2][class]+=0.3 并且对于索引 2,类再次为 2,因此该观察者的权重为 0.1,因此再次为 p[ 2][类]+=权重,即 0.1。最后一个索引类是 1 所以 p[2][class]+=weight 现在我们的矩阵已经准备好了,所以使用 np.argmax() 来获得所需的答案。

【讨论】:

  • P[1][2] 为 0,怎么办?
  • Bcz 没有人在第二次观察中,即 G[1][] 数组选择了第 3 类。只有第 2 类被选择了两次,第 1 类被选择了一次,因此只有在 P 数组中添加了权重。对于类3 原封不动,所以为 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多