我必须构建一些复杂的系统,因为它的一部分存在以下问题(这或多或少是形式化的描述): 让我们假设,我们有一组对象O = {objects},以及一个特征列表,每个对象可以包含F = {features}。因此,我们可以将每个对象视为它具有的特征列表:object o = {f1,f3,f15}。每个对象也有整数值。现在,我们必须找到每个特征的平均值和中值。大致解决问题是可以接受的(我感觉可能的算法可能具有指数复杂性)。
set可能很大(如10 ^ 5个元素)。我们还可以想象数据库表中的所有对象如下:
objectid|value|f1|f2|f3|f4|...|f30
100 |3456 |0 |1 |0 |1 |...|0
101 |61234|0 |0 |1 |1 |...|1
102 |8761 |1 |0 |0 |1 |...|0
.........................
9999 |8080 |1 |1 |0 |0 |...|1
如果我们有少量元素,就有可能建立一个线性方程组并解决它们。但这显然不会成为thouthands元素的工作。
任何想法如何进行?
添加:示例。 让我们继续一个简单的人为例子。 假设我们在市场上有一些具有0到3特征的物体类型(即带有锤子,螺丝刀,钻头和凿子的工具箱)。 我们在市场上有以下对象,保存到db表中:
object| f0 | f1 | f2 | f3 | price
obj0 | 1 | 1 | 0 | 0 | 700
obj1 | 1 | 1 | 0 | 0 | 750
obj2 | 1 | 1 | 1 | 0 | 950
obj3 | 1 | 1 | 1 | 0 | 1200
obj4 | 0 | 1 | 1 | 1 | 980
obj5 | 0 | 1 | 1 | 1 | 1020
obj6 | 0 | 1 | 1 | 0 | 790
obj7 | 0 | 1 | 1 | 0 | 820
obj8 | 1 | 0 | 1 | 0 | 690
obj9 | 1 | 0 | 1 | 0 | 780
然后我们可以轻松计算每个功能的平均价格: 首先,我们按要素列表对元素进行分组,然后为每个组计算平均价格。 然后,对于每个特征,我们找到仅通过该特征区分的所有组。 我们找到各组之间的价格差异,然后我们找到所有这些差异的平均值。
例如,对于f0: 1."按功能列表分组元素" {f0,f1} - > {obj0,obj1} {f0,f1,f2} - > {obj2,obj3} {f1,f2,f3} - > {obj4,obj5} {f1,f2} - > {obj6,obj7} {f0,f2} - > {obj8,obj9}
"然后对于每个组,我们计算平均价格" {f0,f1} - > 725 {f0,f1,f2} - > 1075 {f1,f2,f3} - > 1000 {f1,f2} - > 805 {f0,f2} - > 735
"我们找到仅通过该功能区分的所有组。 " 我们只能获得一次特征f0:{f0,f1,f2}减去{f1,f2}。
"我们发现各组之间的价格差异" {f0,f1,f2}费用为1075,{f1,f2}费用为805,因此功能f0费用为1075-805 = 270.
"我们找到所有这些差异的平均值" 价格将是270。
以同样的方式我们可以计算其他价格: f1成本340,f2成本350,f3平均成本195.
现在,让我们说,我想向市场推出一个新工具箱,其功能为f0,f1,f3。我可以说,平均成本应该是805。 我明白,这种方法非常简单。对于这类任务的数学/算法方法,我将不胜感激。
答案 0 :(得分:1)
由于问题不受限制(因为每个对象中的特征显然可能具有不同的值),因此在一般情况下,不能为单个特征计算明确的平均值或中值。
一种方法是找到特征矩阵的Moore-Penrose伪逆,然后将其乘以对象值向量;这将导致特征值的最小二乘解,从而最小化对象值的总平方误差。这不是闪电般的快速,但对于10 ^ 5个对象,它应该没问题,假设你使用了一个优化良好的实现。