分类 默认分类 下的文章

基础数据准备

考虑我们有一张物料表和库存表。

CREATE TABLE IF NOT EXISTS public.mm_material
(
    "Id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    "Code" character varying(64) COLLATE pg_catalog."default" NOT NULL,
    "ShortName" character varying(256) COLLATE pg_catalog."default" NOT NULL,
    "Specification" character varying(50) COLLATE pg_catalog."default" NOT NULL,
    "Status" integer NOT NULL,
    "MeasureUnitId" integer NOT NULL,
    CONSTRAINT "PK_mm_material" PRIMARY KEY ("Id"),
    CONSTRAINT "AK_mm_material_Code" UNIQUE ("Code"),
    CONSTRAINT "FK_mm_material_mm_material_measureunit_MeasureUnitId" FOREIGN KEY ("MeasureUnitId")
        REFERENCES public.mm_material_measureunit ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE
)
-- 索引略
;



CREATE TABLE IF NOT EXISTS public.mm_inventory
(
    "Id" uuid NOT NULL,
    "IsLocked" boolean NOT NULL,
    "Locker" text COLLATE pg_catalog."default" NOT NULL,
    "WarehouseId" integer NOT NULL,
    "Slot" text COLLATE pg_catalog."default" NOT NULL,
    "Scope" text COLLATE pg_catalog."default" NOT NULL,
    "MaterialCode" text COLLATE pg_catalog."default" NOT NULL,
    "MaterialId" integer NOT NULL,
    "Batch" text COLLATE pg_catalog."default" NOT NULL,
    "ExternalCode" text COLLATE pg_catalog."default" NOT NULL,
    "Amount" numeric NOT NULL,
    "StockKind" integer NOT NULL,
    "Note" text COLLATE pg_catalog."default",
    "ProducedAt" timestamp with time zone,
    "ExpiredAt" timestamp with time zone NOT NULL,
    "CreatedAt" timestamp with time zone NOT NULL,
    CONSTRAINT "PK_mm_inventory" PRIMARY KEY ("Id"),
    CONSTRAINT "FK_mm_inventory_mm_material_MaterialId" FOREIGN KEY ("MaterialId")
        REFERENCES public.mm_material ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE,
    CONSTRAINT "FK_mm_inventory_mm_warehouse_WarehouseId" FOREIGN KEY ("WarehouseId")
        REFERENCES public.mm_warehouse ("Id") MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE CASCADE
)
-- 索引略
;

为了测试,我们向这张物料单表中插入大概10万条测试数据:

阅读剩余部分

one-hot 编码

对于一个分类问题,假设有N种类别,不妨记作 [ "A类", "B类", "C类", "D类", ...],有时候我们可能倾向于直接用数字编号表示,表示成 [ 0, 1, 2, 3, ...]。但是问题是数字编号预设了一个不应该存在的限制:我们在任意两个类别之间强加了比较关系,比如"D类"(类别3) > "B类"(类别2)。一方面,这种类别之间的大小比较毫无意义。另一方面,这种顺序会导致距离测算错误。

假设某个情况是"D类"(类别3) 。在第一种情况下,它被我们错误的分类成了"A类"(类别0) ,这时候二者距离是 3 - 0 =3;在第二种情况下,它被我们错误分类成了"C类"(类别2) ,这时候二者的距离是 3 -2 = 1。这表明,在这种机制下,把"D类"归类成"C类"这种情况,会被当做优于把"D类"归类成"A类"这种情况,这会极大程度上误导机器学习朝着更优的方向进行。

一种解决办法是采用one-hot编码。拿上面的例子来说:

  • A 类被编码成 [1, 0, 0, 0, ...]
  • B 类被编码成 [0, 1, 0, 0, ...]
  • C 类被编码成 [0, 0, 1, 0, ...]
  • D 类被编码成 [0, 0, 0, 1, ...]
  • ...

由于这些向量都是单位正交向量,任意两个向量之间的余弦距离都是一样的,这表明类别归类错误程度("距离")在这种机制下可以被正确计算。

阅读剩余部分

工业机器人用户坐标系是以机器人坐标系为参考,通过平移X、Y、Z生成用户坐标系原点,而后依次转动A、B、C三个轴得到。这里的机器人坐标系以底座为中心原点。

除了用户坐标系之外,工业机器人还有几个常见的直角坐标系:

  • 法兰坐标系:以法兰中心为原点,z轴垂直法兰面向外。
  • 工具坐标系:以法兰坐标系为参考,通过平移X、Y、Z生成工具坐标系的原点(Tool Center PointTCP), 而后依次转动A、B、C三个轴得到。

尽管从概念上讲,用户坐标系本身似乎和工具无关,但是用户坐标系却离不开工具坐标系。

阅读剩余部分

问题

考虑空间中有一个固定的点\(\vec{u}\)。现在建立一套坐标系\(A\),在坐标系\(A\)中,\(\vec{u}\)可以表示成\(\alpha_1 \vec{a_1} + ... + \alpha_n \vec{a_ n}\)。

现在坐标系\(A\)之外,再另建一套坐标系\(B\),基底是\(\vec{b_1}\), ... , \(\vec{b_n}\),问如何求点\(\vec{u}\)在\(B\)里的坐标?

记号和术语

由于涉及多套坐标系的转换,我们引入记号\([\vec{u}]_A\)表示向量\(\vec{u}\)在坐标系\(A\)下的各基向量的线性组合。

注意,\([\vec{u}]_A\)和\([\vec{u}]_B\)本质上描述的是同一个向量对象,你可以理解成我们在不同坐标系下为同一个物理点其起了不同的名字。

阅读剩余部分

在WPF中,ControlTemplateDataTemplate是两种用于定义UI的模板。

  • DataTemplate:用于定义数据对象如何显示。比如在ListBoxComboBoxItemsControl等控件中,程序员会直接绑定数据——这里我们可以使用DataTemplate来定义每一项的数据如何显示。注意,DataTemplate目标是数据对象,它定义了数据如何在UI中呈现,比如一个字符串、一个自定义对象,或者一个集合的每一项。
  • ControlTemplate:用于定义控件的外观。例如,你可以为一个Button控件定义一个ControlTemplate来改变按钮的外观。注意,ControlTemplate的目标是控件本身,比如ButtonTextBox等。它定义了控件的可视化树结构。

数据模板

数据模板提供了一种至关重要的能力:即可以自由灵活地展示数据外观。在不使用数据模板的情况下,WPF默认展示对象时总是固定调用对象的.ToString()方法,我们当然还可以使用绑定路径、自定义控件等方法。但是问题是,这些方案都不够灵活。

数据模板(DataTemplate) 提供的解决方案是,为控件关连的对象自动应用相应的数据模板。

阅读剩余部分