比赛策划:谁对谁好?

机器算法验证 r 数据可视化 Python 网络
2022-03-27 16:59:15

我想深入了解谁对谁好。想象一下有 40 名参赛者的锦标赛设置*,而您想看看谁在前 10 名中表现出色:我们如何使用图形使这一点变得富有洞察力?

我最感兴趣的是找出一个好的(最好的)方法,尽管我也愿意接受特定的 R/Python/其他软件/包建议来完成它。

隐藏的目标是,您甚至可能会看到比赛风格的集群形成,因为一些球员对其他一些球员很好,而他们的风格可能对另一组球员很好!

* 所有参赛者互相对战,获胜者为人所知

2个回答

我建议在热图上使用波动图。这是一个例子: 在此处输入图像描述

波动图使用面积来表示计数,而不是颜色,这在克利夫兰的视觉技能层次中更高。

按获胜次数对玩家进行纵向和横向排序。

通过使用波动图,还可以在计数中包含一些置信度指标。在上图中,在给定边际频率(例如,无论对手是谁,玩家获胜的频率)或高于或低于预期值的情况下,进行了置换测试以确定实际计数是否接近预期值。

在上图中,实心灰色框表示实际计数。灰色轮廓表示预期计数,如果两个变量都是独立的(如果两个玩家有相同的机会被选中,您将使用)。如果盒子明显大于或小于预期数量,则重新着色。

哦,情节是使用 R 计算的。如果有人想要代码,我可以发送它。

我猜你有所有的成对胜率?然后也许在网格中绘制,颜色表示胜率。python中的一个实现:

from itertools import product

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

np.random.seed(34563)

# Create win_rates. Symmetric with .5's down the diagonal
win_rates = np.random.uniform(size=(10, 10))
for i, j in product(range(10), repeat=2):
    if i == j:
        win_rates[i, j] = .5
    if i > j:
        win_rates[i, j] = 1 - win_rates[j, i]

def plot_heatmap(win_rates):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.imshow(win_rates, cmap=cm.bwr_r, interpolation='none')
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    m = cm.ScalarMappable(cmap=cm.bwr_r)
    m.set_array(win_rates)
    fig.colorbar(m)

    return fig

自然排序只是通过在锦标赛中的位置。首先让我们试试整体胜率,这里假设每个人都与其他人进行相同数量的比赛。

overall_win_rates = np.mean(win_rates, axis=1)
sorted_indexes = np.argsort(-overall_win_rates)
win_rates = win_rates[sorted_indexes]    # Sort rows
win_rates = win_rates[:, sorted_indexes] # Sort columns
overall_win_rates = overall_win_rates[sorted_indexes]

fig = plot_heatmap(win_rates)

按总胜率排序


聚类也可用于对参赛者进行排序。将获胜率矩阵输入到一些聚类算法中(参见scikit-learn以了解 Python 中的各种算法),并将同一组中的人按顺序排列在一起。这将根据他们与特定人的胜率对人们进行聚类,这就是我希望提取一些相似的游戏风格的方式。将该排序与上面的图相结合。

这是一个使用亲和力传播的例子。我实际上对这个算法不是很熟悉,但它是少数没有集群数量作为参数的算法之一,这对应用程序来说很好。

from sklearn import cluster
ap = cluster.AffinityPropagation()
clusters = ap.fit_predict(win_rates)

sorted_indexes = np.lexsort([-overall_win_rates, clusters])
win_rates = win_rates[sorted_indexes]
win_rates = win_rates[:, sorted_indexes]
overall_win_rates = overall_win_rates[sorted_indexes]

fig = plot_heatmap(win_rates)

在此处输入图像描述

这里,最上面的行是一个簇​​,接下来的三行是一个簇​​,最后四行是一个簇​​。尽管请记住这只是使用提供的默认值,但实际上您可能希望调整聚类参数。

在集群中,行按总体赢率排序。您可以对该图进行的几项改进之一是增加一列或以某种方式在该图上显示总体赢率,并且还可能是集群的指标。