【发布时间】:2021-01-18 07:09:52
【问题描述】:
我确信这个主题之前已经研究过,我不确定它叫什么或者我还应该研究什么技术,因此我在这里。我主要在 Python 和 Pandas 中运行它,但它不限于这些语言/技术。
举个例子,假设我有这个数据集:
| PID | A | B | C |
| --- | ---- | ---- | ---- |
| 508 | 0.85 | 0.51 | 0.05 |
| 400 | 0.97 | 0.61 | 0.30 |
| 251 | 0.01 | 0.97 | 0.29 |
| 414 | 0.25 | 0.04 | 0.83 |
| 706 | 0.37 | 0.32 | 0.33 |
| 65 | 0.78 | 0.62 | 0.25 |
| 533 | 0.24 | 0.15 | 0.88 |
PID 是该行的唯一 ID。 A、B 和 C 是一些因素(在本例中已标准化)。这些数据集可以是历史上某个体育联盟的球员,也可以是库存中的产品,也可以是选民数据。具体的上下文并不重要。
现在假设我有一些输入数据:
| A | B | C |
| ---- | ---- | ---- |
| 0.81 | 0.75 | 0.17 |
此输入与原始数据集(A、B、C)共享相同的因素。我想要做的是找到与我的输入数据(“群组”)相似的行。解决这个问题的最佳方法是什么?
我想到了聚类,使用kNN算法,但问题是队列的数量没有设置。您可能有独特的输入并且很少/没有“群组”,或者您可能有非常常见的输入并且有数百个“群组”。
我接下来尝试的解决方案是欧几里得距离。所以对于这个数据集和输入,我会做这样的事情:
my_cols = ['A', 'B', 'C']
inputdata = pd.Series([0.81, 0.75, 0.17], index=['A', 'B', 'C'])
# df = pandas data frame with above data
df['Dict'] = (df[my_cols] - inputdata).pow(2).sum(1).pow(0.5)
这将在数据集上创建一个新列,例如:
| PID | A | B | C | Dist |
| --- | ---- | ---- | ---- | ---- |
| 508 | 0.85 | 0.51 | 0.05 | 0.27 |
| 400 | 0.97 | 0.61 | 0.30 | 0.25 |
| 251 | 0.01 | 0.97 | 0.29 | 0.84 |
| 414 | 0.25 | 0.04 | 0.83 | 1.12 |
| 706 | 0.37 | 0.32 | 0.33 | 0.63 |
| 65 | 0.78 | 0.62 | 0.25 | 0.16 |
| 533 | 0.24 | 0.15 | 0.88 | 1.09 |
然后您可以“过滤”掉低于某个阈值的那些行。
cohorts = df[df['Dist'] <= THRESHOLD]
然后问题变成(1)您如何确定最佳阈值? (2) 如果我在数据集和 Euclid 计算中添加第 4 个因子(“D”),它似乎会“破坏”结果,因为从结果来看,同类群组不再具有直观意义。
所以我的问题是:过滤/选择“群组”(类似于输入行的那些行)的技术或更好的方法是什么?
谢谢
【问题讨论】:
-
你不能得到
Dist最低的行吗?那将是最接近您的输入数据的吧? -
这将是“最相似”的同类群组,而不是“所有相似的”同类群组。
-
这个问题很难以目前的形式回答,应该编辑以包含更多信息或关闭。最佳相似度指标完全取决于您想要实现的目标。如果你给我足够的例子,我可以尝试以最小的错误来设计一个过滤器,但如果没有那个或者你想要的相似性的明确定义,我担心什么都做不了。这取决于问题,并且没有普遍最优的相似性度量。
标签: python pandas statistics data-modeling