自训练算法

2024-03-01

我想针对特定问题开发一种自我训练算法。为了简单起见,我将把它归结为简单的例子。

更新:我添加了一个工作解决方案作为下面这个问题的答案。

假设我有来自数据库的大量实体列表。每个实体都是相同的类型,并且有 4 个字节类型的属性。

public class Entity
{
    public byte Prop1 { get; set; }
    public byte Prop2 { get; set; }
    public byte Prop3 { get; set; }
    public byte Prop4 { get; set; }
}

现在我想根据一个简单的条件动态测试每个实体的一个或多个属性。这基本上意味着我想针对这种条件测试所有属性的所有可能组合。

为了完成此任务,我为属性创建了一个位掩码。

[Flags]
public enum EEntityValues
{
    Undefined = 0,
    Prop1 = 1,
    Prop2 = 2,
    Prop3 = 4,
    Prop4 = 8,
}

并添加了一种获取位掩码最大值的方法。对于本示例,返回 15 (1 + 2 + 4 + 8)。

public static int GetMaxValue<T>() where T : struct
{
    return Enum.GetValues( typeof(T) ).Cast<int>().Sum();
}

在此阶段,我可以使用简单的循环迭代所有属性组合。在示例中,在第一次迭代中测试属性 Prop1,在第二次迭代中测试属性 Prop2,在第三次迭代中测试属性 Prop1 和 Prop2,依此类推。

for(int i = 1; i <= GetMaxValue<EEntityValues>(); i++)
{
     EEntityValues flags = (EEntityValues)i;

     if(flags.HasSet(EEntityValues.Prop1))
     {
         ....
     }
}

现在让我们将实体放入游戏中。

List<Entity> entities = GetEntitiesFromDb();

for(int i = 1; i <= GetMaxValue<EEntityValues>(); i++)
{
     EEntityValues flags = (EEntityValues)i;
     byte minProp1Value = 10, minProp2Value = 20, minProp3Value = 30, minProp4Value = 40;

     foreach(Entitiy entity in entities)
     {
         if(flags.HasSet(EEntityValues.Prop1) && entitiy.Prop1 >= minProp1Value)
         {
              ....
         } else { continue; }

         if(flags.HasSet(EEntityValues.Prop2) && entitiy.Prop2 >= minProp2Value)
         {
              ....
         } else { continue; }
     }
}

好吧,如果我的最小值是静态的,这非常有效。

现在让我们变得更复杂。我们记得,在第一次迭代中,我们仅测试属性 Prop1,因为位掩码为 1。Prop1 的值范围是 0..255。我还为此属性定义了一个最小值,其有效范围为 1..255。这个最小值只是一个过滤器,用于跳过 foreach 循环中的实体。

现在我想在提高最低水平的同时测试属性 Prop1。这些测试不是问题的一部分,因此我没有将它们包含在我的样本中。

     byte minProp1Value = 1;

     while(minProp1Value <= 255)
     {
         foreach(Entitiy entity in entities)
         {
              if(flags.HasSet(EEntityValues.Prop1) && entitiy.Prop1 >= minProp1Value)
              {
                  .... // Testing the matching entity and storing the result
              } else { continue; }
         }

         minProp1Value++;
     }

这对于单一财产来说很简单。在第三次迭代中,我必须处理 2 个属性,Prop1 和 Prop2,因为位掩码是 3。

     byte minProp1Value = 1, minProp2Value = 1;

     while(minProp1Value <= 255)
     {
         while(minProp2Value <= 255)
         {
              foreach(Entitiy entity in entities)
              {
                   ....
              }

              minProp2Value++;
         }

         minProp1Value++;
         minProp2Value = 1;
     }

正如您所看到的,在这个阶段,我正在根据不断上升的最低级别测试每个实体的 Prop1 和 Prop2。

由于我正在处理动态生成的多个属性集,因此我无法将 while 循环硬编码到我的代码中。这就是为什么我正在寻找一种更智能的解决方案来测试给定属性集(位掩码)的最小值的所有可能组合。


休息后我想出了一个似乎符合我要求的解决方案。限制是所有测试的属性应该具有相同的类型和相同的值范围,这对我来说很好,因为所有属性都是抽象的百分比值。

顺便说一句,我不确定“自训练算法”这个主题是否有点误导。有多种方法可以实现此类解决方案,但如果您不知道数据的行为方式以及值的影响,最简单的解决方案是强力使用所有可能的组合来确定最佳拟合结果。这就是我在这里展示的内容。

无论如何,出于测试目的,我在实体类中添加了一个随机数生成器。

public class Entity
{
    public byte Prop1 { get; set; }
    public byte Prop2 { get; set; }
    public byte Prop3 { get; set; }
    public byte Prop4 { get; set; }

    public Entity()
    {
        Random random = new Random( Guid.NewGuid().GetHashCode() );
        byte[] bytes = new byte[ 4 ];

        random.NextBytes( bytes );

        this.Prop1 = bytes[0];
        this.Prop2 = bytes[1];
        this.Prop3 = bytes[2];
        this.Prop4 = bytes[3];
    }
}

我的位掩码保持不变。

[Flags]
public enum EProperty
{
    Undefined = 0,
    Prop1 = 1,
    Prop2 = 1 << 1,
    Prop3 = 1 << 2,
    Prop4 = 1 << 3
}

我添加了一些新的扩展方法来处理我的位掩码。

public static class BitMask
{
    public static int GetMaxValue<T>() where T : struct
    {
        return Enum.GetValues(typeof (T)).Cast<int>().Sum();
    }

    public static int GetTotalCount<T>() where T : struct
    {
        return Enum.GetValues(typeof (T)).Cast<int>().Count(e => e > 0);
    }

    public static int GetFlagCount<T>(this T mask) where T : struct
    {
        int result = 0, value = (int) (object) mask;

        while (value != 0)
        {
            value = value & (value - 1);
            result++;
        }

        return result;
    }

    public static IEnumerable<T> Split<T>(this T mask)
    {
        int maskValue = (int) (object) mask;

        foreach (T flag in Enum.GetValues(typeof (T)))
        {
            int flagValue = (int) (object) flag;

            if (0 != (flagValue & maskValue))
            {
                yield return flag;
            }
        }
    }
}

比我写了一个查询生成器

public static class QueryBuilder
{
    public static IEnumerable<Entity> Where(this IEnumerable<Entity> entities, EProperty[] properties, int[] values)
    {
        IEnumerable<Entity> result = entities.Select(e => e);

        for (int index = 0; index <= properties.Length - 1; index++)
        {
            EProperty property = properties[index];
            int value = values[index];

            switch (property)
            {
                case EProperty.Prop1:
                    result = result.Where(e => Math.Abs(e.Prop1) >= value);
                    break;
                case EProperty.Prop2:
                    result = result.Where(e => Math.Abs(e.Prop2) >= value);
                    break;
                case EProperty.Prop3:
                    result = result.Where(e => Math.Abs(e.Prop3) >= value);
                    break;              
                case EProperty.Prop4:
                    result = result.Where(e => Math.Abs(e.Prop4) >= value);
                    break;   
            }
        }

        return result;
    }
}

最后我准备好进行培训了。

    private const int maxThreads = 10;

    private const int minValue = 0;
    private const int maxValue = 100;

    private static IEnumerable<Entity> entities;

    public static void Main(string[] args)
    {
        Console.WriteLine(DateTime.Now.ToLongTimeString());

        entities = Enumerable.Repeat(new Entity(), 10).ToList();

        Action<EProperty[], int[]> testCase = RunTestCase;
        RunSelfTraining( testCase );

        Console.WriteLine(DateTime.Now.ToLongTimeString());
        Console.WriteLine("Done.");

        Console.Read();
    }

    private static void RunTestCase( EProperty[] properties, int[] values ) 
    {         
        foreach( Entity entity in entities.Where( properties, values ) )
        {

        }
    }

    private static void RunSelfTraining<T>( Action<T[], int[]> testCase ) where T : struct
    {
        ParallelOptions parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = maxThreads };

        for (int maskValue = 1; maskValue <= BitMask.GetMaxValue<T>(); maskValue++)
        {
            T mask = ( T ) (object)maskValue;
            T[] properties = mask.Split().ToArray();         

            int variations = (int) Math.Pow(maxValue - minValue + 1, properties.Length);

            Parallel.For(1, variations, parallelOptions, variation =>
            {
                int[] values = GetVariation(variation, minValue, maxValue, properties.Length).ToArray();   
                testCase.Invoke(properties, values);        
            } );
        }
    }

    public static IEnumerable<int> GetVariation( int index, int minValue, int maxValue, int count )
    {
        index = index - 1; 
        int range = maxValue - minValue + 1;

        for( int j = 0; j < count; j++ )
        {
            yield return index % range + minValue;
            index = index / range;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自训练算法 的相关文章

  • 当“”可以分配给std::string时,为什么有“clear”方法?

    一个可以用string clear函数清空字符串 也可以使用空双引号 来执行此操作 有什么不同 当您分配一个空字符串时 编译器必须在数据部分存储一个空的 C 字符串 并创建代码以将指向它的指针传递给赋值运算符 然后 赋值运算符必须从数据部分
  • 使用 gcc 编译 C 时,预处理的 .i 文件中的数字意味着什么?

    我想了解编译过程 我们可以使用以下命令查看预处理器中间文件 gcc E hello c o hello i or cpp hello c gt hello i 我大致知道预处理器的作用 但我很难理解某些行中的数字 例如 1 usr incl
  • 具有长期运行对象上下文的实体框架

    我对 WinForms 我敢说 WPF 中的 Linq to SQL 的主要烦恼之一是缺乏对长时间运行的数据上下文的支持 请参阅here http blogs msdn com dinesh kulkarni archive 2008 04
  • 将 LINQ to Entities 查询中的每个项目转换为接口的最佳方法是什么?

    我有一个实现 IUser 的实体对象 User IQueryable
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection

    我有一个项目需要显示合同列表 Class Affaire 每个合约都有一个阶段列表 类别阶段 我使用绑定在 2 个不同的 ListView 中显示它们中的每一个 问题是当我从 ListView 中删除一个 Phase 时 显示 Phases
  • 优化对绑定到 DataGridView 的 DataTable 的更新

    我的应用程序中有一个显示一些数据的表单 当我第一次显示表单时 我将一些数据加载到 DataTable 中 然后将 DataTable 绑定到 DataGridView 我还启动了一个异步方法来执行一些较慢的数据库查询 当这些慢查询完成时 我
  • ResourceDictionary 源中的 Uri 语法(通用 Windows 平台)

    我正在迁移我的Windows 8 1项目到Windows 10 通用 Windows 平台 这时我被拦住了ResourceDictionary改变在UWP 为了简单起见 我有包含 2 个项目的 Windows 8 1 解决方案 App pr
  • 有哪些 API 可在 Windows 中使用 C# 配置扬声器设置?

    我环顾了很多不同的地方 但似乎找不到一个简单的方法来做到这一点 我在 Windows 7 中有多个声卡 并使用 HDMI 将声音输出到我的 AVR 放大器 我遇到的问题是 当放大器关闭时 它会导致窗口丢失扬声器配置 所以我想做的是编写一个小
  • 整数与双精度算术性能?

    我正在编写一个 C 类来使用整数执行 2D 可分离卷积 以获得比双对应更好的性能 问题是我没有获得真正的性能提升 这是 X 过滤器代码 对于 int 和 double 情况都有效 foreach pixel int value 0 for
  • 了解 MVC-5 身份

    我创建了一个新的ASP NET MVC 5申请与Individual User Accounts然后更新了所有的Nuget packages在解决方案中 现在我尝试遵循一些教程中显示的一些指南 但遇到了一些问题 第一个是一个名为Applic
  • 了解最大池层之后的全连接层的尺寸[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在下图 架构 中 4096 个单元的 全连接 密集层是如何从最后一个最大池层 右侧 维度导出的256x13x13 而不是 4096 不应该
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 最小对的总和

    Given 2N点 in a 2D plane 你必须将它们分组为N pairs使得所有对的点之间的距离的总和是最小可能值 所需的输出只是总和 换句话说 如果a1 a2 an分别是第一对 第二对 和第 n 对点之间的距离 则 a1 a2 a
  • C# Linq 可以做组合数学吗?

    我有这个数据结构 class Product public string Name get set public int Count get set var list new List
  • 一些涉及类析构函数和删除运算符的内存管理问题?

    在阅读了一些教程后 我仍然不清楚 C 中内存管理的一些观点 1 当使用 new 运算符声明的类超出范围时 是否会调用其析构函数并释放内存 是否有必要调用删除运算符来释放类的内存并调用其析构函数 class Test void newTest
  • Windows Phone HttpClient PostAsync 挂起且无响应

    我在拨打电话时遇到问题HttpClientWP 应用程序的 post 方法 PostAsync总是挂起并且不给出任何响应 当我从 WPF 应用程序中尝试时 相同的代码可以工作 这是我正在做的事情 服务器Web API代码 public cl
  • C++ std:.auto_ptr 或 std::unique_ptr (支持多个编译器,甚至是旧的 C++03 编译器)?

    我正在尝试更新一些 C 代码 我想转向更现代的代码 c 11 但我仍然需要使用一些较旧的编译器 兼容 c 03 来编译代码 因为支持的平台限制 我知道在 C 11 编译器中 std auto ptr 已被弃用 但由于较旧的编译器支持 我不能
  • 检测用户是否正在滚动 dataGridView 滚动条

    我正在更新一个dataGridView与一个新的数据表使用 dataGridView1 DataSource table 但是 我不想在用户滚动 dataGridView 时执行此操作 如何检查滚动条是否正在滚动或已完成滚动 即拖动而不是单
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功

随机推荐

  • 如何安排Makefile来编译具有多个.c文件的内核模块?

    如何安排Makefile来编译具有多个 c文件的内核模块 这是我当前的 Makefile 它是由自动生成的KDevelop http www kdevelop org TARGET nlb driver OBJS nlb driver o
  • 如何在 Mongoose 数组中的每个值前面添加一个字符串?

    假设我有一个这样的文档集合 name Bob listIDs 1c2f 32a1 0ebf name Meg listIDs a844 8132 b246 如何在每个文档的 listIDs 中的每个值前面添加字符串 0000 例如 name
  • 基本 Springboot 应用程序抛出 NullPointerException

    我在使用 SpringBoot 时遇到问题 我的控制器中有一个异常处理程序 每次我抛出一个被控制器捕获的异常时 它都会向客户端返回正确的值 但它也会在日志中放入大量 NPE 这主要是一种烦恼 但日志中的许多无关紧要的错误可能会掩盖真正的问题
  • 在正则表达式中将一组模式中的模式列入受控多次出现的白名单

    我希望以下示例返回匹配项 I like foob ar com 我喜欢 google com 和foob ar com I like foob ar com和 google com 我喜欢 foobargoogle com 和 google
  • 如何检查sd卡目录中是否存在文件

    我想检查 android SD 卡中是否存在给定的文件 我正在尝试使用绝对路径创建文件并检查file exists 但它不起作用 该文件的 URL 是 file mnt sdcard book1 page2 html 并且该文件确实存在 但
  • 如何在另一个滚动视图中滚动ListView

    我有个问题 我有一个布局 其滚动视图位于三个列表视图 A B C 上 我想要滚动孔布局以及滚动每个列表视图 Problem 当布局滚动时 列表视图不会滚动 如果我删除滚动布局 则列表会滚动 但布局不会滚动 可能的解决方案是什么 使用以下方法
  • AWK 关联数组、映射或哈希映射

    假设我有两个文件 文件1 地图 txt 1 178246 2 289789 3 384275 4 869282 文件2 关系 txt 178246 289789 384275 178246 384275 869282 预期结果是 1 2 3
  • 如何使用组类型查看主题成员

    有一个默认值ClusterRoleBinding named cluster admin 当我跑步时kubectl get clusterrolebindings cluster admin o yaml我得到 apiVersion rba
  • Python中%的意义是什么[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对编程语言和 Python 都是全新的 尽管我已经阅读了 3 个简短的教程来解释它 但我仍然无法理解 的意义 有人能分解一下 在这段代码
  • EJB中@Resource注解的mappedName和lookup属性有什么区别?

    我对以下两个属性感到困惑 Resource注解 Java 文档说 映射名称 该资源应映射到的产品特定名称 该资源的名称 由 name 元素定义或默认 是使用该资源的应用程序组件的本地名称 它是 JNDI java comp env 命名空间
  • 多轴断裂

    我正在尝试在 Matlab 上创建一个具有多个轴中断的图 如下所示 我尝试过使用类似的东西breakyaxis and breakaxis来自 Matlab 文件交换 但这些只允许一次中断 而不是多次 有没有办法实现这个 The NaN N
  • unordered_map 以引用作为值

    值类型为引用 C 11 的 unordered map 是否合法 例如std unordered map
  • 如何以编程方式读取 AWS Glue 数据目录表架构

    我有一组结构统一的日常 CSV 文件 我将其上传到 S3 有一个下游作业将 CSV 数据加载到 Redshift 数据库表中 CSV 中的列数可能会增加 从那时起 新文件中将包含新列 发生这种情况时 我想检测更改并自动将该列添加到目标 Re
  • 在android中,当一张图像移动时,如何知道两个图像是否相交?

    在我的应用程序中 我使用以下方法在屏幕上移动图像onTouchListener 我在同一视图中还有另外两张图像 我的问题是 当移动图像接触任何其他图像时 我需要执行特定操作 这意味着如果图像相交 则执行某些操作 如何实现这一点 请尽快帮助我
  • 从订单表中提取本周的记录

    我有一张包含以下信息的表格 Id orderNumber orderDate customerId orderDate是 MySQL 日期时间字段 当前日 月 年和时间在写入记录时插入数据库 所以我的问题是如何提取本周某一天的订单列表 我的
  • 克服 NSURL 的 checkResourceIsReachableAndReturnError 的意外行为

    在我为 iOS 5 创建的程序中 我遇到了 NSURL 的 checkResourceIsReachableAndReturnError 方法的意外行为 我创建了一个新项目来验证该问题 并仅包含代码 NSURL url NSURL URLW
  • Pandas:两个 datetime64 对象的差异产生 NaT 而不是正确的 timedelta 值

    这个问题 被问了很多 但仔细查看其他答案后 我还没有找到适合我的情况的解决方案 遗憾的是 这仍然是一个症结所在 我有一个pandas带列的数据框datetime我只是想计算数据覆盖的时间范围 以秒为单位 比如说 from datetime
  • 查询一段时间内的 DAU/MAU(每日)

    我有一个每日会话表 其中包含 user id 和日期列 我想绘制每天的 DAU MAU 每日活跃用户 每月活跃用户 图表 例如 Date MAU DAU DAU MAU 2014 06 01 20 000 5 000 20 2014 06
  • Spring Cloud Stream Kafka - 方法必须是声明性的

    我已经使用 Spring Cloud Stream 配置了一个基于 Spring Boot 的应用程序 我正在尝试处理 KStream 但不断收到错误 java lang IllegalArgumentException 方法必须是声明性的
  • 自训练算法

    我想针对特定问题开发一种自我训练算法 为了简单起见 我将把它归结为简单的例子 更新 我添加了一个工作解决方案作为下面这个问题的答案 假设我有来自数据库的大量实体列表 每个实体都是相同的类型 并且有 4 个字节类型的属性 public cla