0

我现在有一个关于使用标准偏差的问题。如果我在我的情况下正确使用它,如下所述。

索引都是唯一的,这里有几个关于标准偏差的问题:1)由于我使用了所有数据,我应该使用总体标准偏差还是
应该使用样本标准偏差?2)完整播放列表的长度(范围)是多少(1...15)是否重要

我有一个程序,它需要一个歌曲播放列表并从 Spotify 获取每首歌曲的推荐。

假设播放列表的长度为 15。
每个曲目都有一组大约 30 首曲目的 Suggestions。
最后,我的程序将过滤掉所有建议,以创建一个只有 15 首曲目的新播放列表。

经常有重复的被推荐。
我设计了一种方法来查找这些重复项,然后将它们的索引放入 NSIndexSet。


在我的示例中,在索引 4、6、7、12 处为原始播放列表中的曲目建议了重复曲目

我试图计算出哪个是最好的重复选择。所有 NSSet 方法等都不会帮助我,也不会考虑重复的“位置”在哪里。对我来说,在“区域”内建议的曲目越频繁,在最终建议的播放器中的该位置“使用”它最有意义。

最初我只是选择最接近平均值的指数(7.25)
,但对我来说,我认为 6 会比 7 更好
。12 似乎把它扔掉了。

所以我开始调查 StdDev 并认为这可以帮助我解决
你认为我在这里的方法是什么?


NSMutableIndexSet* dupeIndexsSet;  // contains indexes 4,6,7,12
// I have an extension on NSIndexSet to create a NSArray from it
NSArray* dupesIndexSetArray = [dupeIndexsSet indexSetAsArray]; 
// @[4, 6, 7, 12]
NSUInteger dupeIndexsCount = [dupeIndexSetArray count]; // 4
NSUInteger dupeIndexSetFirst = [dupeIndexsSet firstIndex]; // 4
NSUInteger dupeIndexSetLast = [dupeIndexsSet lastIndex]; // 12

// I have an extension on NSArray to calculate the mean
NSNumber* dupeIndexsMean = [dupeIndexArray meanOf]; // 7.25;

the populationSD is 2.9475  
the populationVariance is 8.6875  

the sampleSD is 3.4034  
the sampleVariance is 11.5833

我应该使用哪个 SD?
或者这很重要

我了解到 SD 是平均值的范围,
所以我想我会计算出这些值是什么。


double mean = [dupeIndexsMean doubleValue];
double dev = [populationSD doubleValue];

NSUInteger stdDevRangeStart = MAX(round(mean - dev), dupeIndexSetFirst);
// 7.25 - 2.8475 = 4.4025, round 4, dupeIndexSetFirst = 4
// stdDevRangeStart = 4;

NSUInteger stdDevRangeEnd = MIN(round(mean + dev), dupeIndexSetLast);
// 7.25 + 2.8475 = 10.0975, round 10, dupeIndexSetLast = 12
// stdDevRangeEnd = 10;

NSUInteger stdDevRangeLength1 = stdDevRangeEnd - stdDevRangeStart; // 6
NSUInteger stdDevRangeLength2 = MAX(round(dev * 2), stdDevRangeLength1);
// 2.8475 * 2 = 5.695, round 6, stdDevRangeLength1 = 6
// stdDevRangeLength2 = 6;

NSRange dupeStdDevRange = NSMakeRange(stdDevRangeStart, stdDevRangeLength2);   
// startIndex = 4, length 6

所以我想这个新范围是否会给我一个更好的范围,
包括更准确的 stdDev 而不包括 12。


我从仅包含从我的新 dupeStdDevRange 中 包含的索引的原始索引集创建一个 newIndexSet


NSMutableIndexSet* stdDevIndexSet = [NSMutableIndexSet new];
[dupeIndexsSet enumerateIndexesInRange:dupeStdDevRange 
options:NSEnumerationConcurrent 
usingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) 
{
[stdDevIndexSet addIndex:idx];
}];

// stdDevIndexSet 的索引 = 4, 6, 7

新的 stdDevIndexSet 现在包括索引 4,6,7
12 不包括在内,这是很好的原因,我认为这是抛弃一切

现在有了这个新的“stdDevIndexSet”,我将它与原始 IndexSet 进行对比。如果 stdDevIndexSet 计数较少,那么我将这个新的 indexSet 重新加载到整个过程中并再次计算所有内容。


if ([stdDevIndexSet count] < dupeIndexesCount) 
{
[self loadDupesIndexSet:stdDevIndexSet];
}
else {
doneTrim = YES;
}

所以它是不同的,所以我重新开始整个过程​​,索引集
包括 4,6,7

更新的计算

dupeIndexsMean = 5.6667;  

populationSD = 1.2472;  
populationVariance = 1.5556;  
sampleSD = 1.5275;  
sampleVariance = 2.3333;  

stdDevRangeStart = 4;  
stdDevRangeEnd = 7;  

newTrimmed IndexSet 现在“适合”标准偏差范围。

因此,如果我使用四舍五入到 6 的新平均值。

我最好使用的索引是原始索引中的 6 (4, 6, 7, 12),
现在发送给我。


这么大的问题我是否正确地解决了这个问题?

“潜在”范围的原始大小(长度)之类的东西重要吗?
IE 如果原始播放列表长度是 20 首曲目而不是 40 首曲目?(我认为不是)。

4

0 回答 0