gpt4 book ai didi

c# - 根据类次列表创建时间表的摘要说明

转载 作者:太空狗 更新时间:2023-10-29 22:20:49 24 4
gpt4 key购买 nike

假设我有一个事件的类次列表(格式为开始日期/时间,结束日期/时间)-是否可以使用某种算法来创建时间表的概括性摘要?大多数轮类都陷入某种常见的复发模式是很常见的(例如,星期一从上午9:00到1:00 pm,星期二从10:00到3:00 pm,等等)。但是,该规则可能会有(并且将会有)异常(exception)情况(例如,其中一个类次是在假期休假,并已安排在第二天)。将这些内容排除在我的“摘要”中会很好,因为我希望提供有关此事件通常在何时发生的更一般的答案。

我想我正在寻找某种统计方法来确定日期和时间的发生,并根据列表中最常见的发生来创建描述。是否有某种适用于此类情况的通用算法?有没有人创造类似的东西?

理想情况下,我正在寻找C#或VB.NET的解决方案,但不介意从任何其他语言进行移植。

提前致谢!

最佳答案

您可以使用Cluster Analysis
群集是一种将一组数据分离为相似组件(子集)的方法。 “相似性”概念涉及点之间的“距离”的一些定义。存在许多常用的距离公式,其中包括常用的欧几里得距离。
实际案例
在向您介绍该交易的怪癖之前,让我们为您的问题演示一个实际案例,以便您可以参与算法和程序包,或者预先丢弃它们。
为了简便起见,我在Mathematica中对问题进行了建模,因为软件中包括了聚类分析,并且设置起来非常简单。
首先,生成数据。格式为{DAY,START TIME,END TIME}。
开始时间和结束时间添加了一个随机变量(+半小时,零,-半小时},以显示该算法应对“噪声”的能力。
有三天,每天三类,还有一个额外的(最后一个)“异常”类,开始于上午7点,结束于上午9点(可怜的家伙!)。
每个“正常”类次中有150个事件,而异常事件中只有两个。
如您所见,某些转变彼此之间相距不远。
如果您可以访问该软件,我会将代码包含在Mathematica中。我试图避免使用函数语法,以使“外国人”更容易阅读代码。
这是数据生成代码:

Rn[] := 0.5 * RandomInteger[{-1, 1}];

monshft1 = Table[{ 1 , 10 + Rn[] , 15 + Rn[] }, {150}]; // 1
monshft2 = Table[{ 1 , 12 + Rn[] , 17 + Rn[] }, {150}]; // 2
wedshft1 = Table[{ 3 , 10 + Rn[] , 15 + Rn[] }, {150}]; // 3
wedshft2 = Table[{ 3 , 14 + Rn[] , 17 + Rn[] }, {150}]; // 4
frishft1 = Table[{ 5 , 10 + Rn[] , 15 + Rn[] }, {150}]; // 5
frishft2 = Table[{ 5 , 11 + Rn[] , 15 + Rn[] }, {150}]; // 6
monexcp = Table[{ 1 , 7 + Rn[] , 9 + Rn[] }, {2}]; // 7
现在我们结合数据,获得一个大数据集:
data = Join[monshft1, monshft2, wedshft1, wedshft2, frishft1, frishft2, monexcp];
让我们对数据进行聚类分析:
clusters = FindClusters[data, 7, Method->{"Agglomerate","Linkage"->"Complete"}]
“聚集”和“链接”->“完整”是在Mathematica中实现的聚类方法的两个微调选项。他们只是指定我们正在尝试找到非常紧凑的集群。
我指定尝试检测7个群集。如果未知正确的移位数,则可以尝试几个合理的值并查看结果,或者让算法选择更合适的值。
我们可以得到一个带有结果的图表,每个簇使用不同的颜色(不用管代码)
ListPointPlot3D[ clusters, 
PlotStyle->{{PointSize[Large], Pink}, {PointSize[Large], Green},
{PointSize[Large], Yellow}, {PointSize[Large], Red},
{PointSize[Large], Black}, {PointSize[Large], Blue},
{PointSize[Large], Purple}, {PointSize[Large], Brown}},
AxesLabel -> {"DAY", "START TIME", "END TIME"}]
结果是:
alt text

您可以在其中清楚地看到我们的七个集群。
那解决了部分问题:识别数据。现在,您还希望能够对其进行标记。
因此,我们将获得每个聚类并采取均值(四舍五入):
Table[Round[Mean[clusters[[i]]]], {i, 7}]  
结果是:
Day   Start  End
{"1", "10", "15"},
{"1", "12", "17"},
{"3", "10", "15"},
{"3", "14", "17"},
{"5", "10", "15"},
{"5", "11", "15"},
{"1", "7", "9"}
这样一来,您将再次获得七堂课。
现在,也许您想对转变进行分类,无论白天如何。如果同一个人每天在同一时间执行相同的任务,那么将其称为“星期一从10到15转变”是没有用的,因为它也发生在星期三和星期五(在我们的示例中)。
让我们分析不考虑第一列的数据:
clusters=
FindClusters[Take[data, All, -2],Method->{"Agglomerate","Linkage"->"Complete"}];
在这种情况下,我们没有选择要检索的簇数,而是将决定权交给了程序包。
结果是
image

您可以看到已识别出五个集群。
让我们尝试像以前一样“标记”它们:
Grid[Table[Round[Mean[clusters[[i]]]], {i, 5}]]
结果是:
 START  END
{"10", "15"},
{"12", "17"},
{"14", "17"},
{"11", "15"},
{ "7", "9"}
这正是我们“怀疑”的内容:每天同一时间有重复的事件可以组合在一起。
编辑:隔夜类次和规范化
如果您有(或计划有)从一天开始到下一天结束的类次,最好进行建模
{Start-Day Start-Hour Length}  // Correct!
{Start-Day Start-Hour End-Day End-Hour}  // Incorrect!  
这是因为,与任何统计方法一样,必须明确变量之间的相关性,否则该方法将失败。该原理可以运行“使您的候选数据标准化”之类的东西。这两个概念几乎相同(属性应该是独立的)。
-编辑结束-
到目前为止,我想您已经很了解这种分析方法可以做什么。
一些引用
  • 当然,Wikipedia,其“引用”和“更多阅读”是不错的指南。
  • 一个不错的视频here,展示了Statsoft的功能,但是您可以在其中找到很多
    关于您可以使用该算法进行其他操作的想法。
  • Here
  • 涉及的算法的基本解释
  • Here您可以找到R令人印象深刻的功能来进行聚类分析(R是非常好的选择)
  • 最后,在here中,您可以找到一长串免费的和商业的统计软件,这些软件通常用于统计,包括聚类。

  • HTH!

    关于c# - 根据类次列表创建时间表的摘要说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3165867/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com