飞道的博客

枯燥乏味之离散数学集合

557人阅读  评论(0)

1. 集合

  话不多说,先甩一张图。


1.1 集合定义

  由上图可知,集合通常有三种表示方法。

  • 列举法:无疑是最没有技术含量的,一股脑把集合中的元素全部写出来。如: A \Alpha A = {0, 1, 2, 3, 4, 5} 是阿拉伯数字的集合; N \Nu N = {0, 1, 2,…} 是自然数的集合;
  • 描述法:有些地方叫谓词法。如: A \Alpha A = { x x x N \Nu N | x x x mod 2 = 1};
  • 韦恩图:通常用一个圆来代表一个集合;

  问题来了:集合 A \Alpha A = {0, 1, {0, 1} , {1, 2}} 有几个元素? 机器学习中, 这类形式的集合有什么优点和缺点?

  1. c a r d card card 表示有限集 A \Alpha A 中的元素个数, c a r d card card( A \Alpha A) = 3。
  2. 在机器学习中,我们通常会用自然数表示分类任务中的标签。例如,0 通常表示第一类,1 表示第二类,依次类推。集合 A \Alpha A 通常会被用在多标签分类任务中。一个实例可能有一个或多个标签,类似于选择题中的不定项选择题。对于集合 A \Alpha A,我们可以认为它的标签数目不是固定的,有的一个标签,有的有两个标签,但是标签的总数是固定的,有 3 类。我们在标签编码时,可以使用标签补齐的方法,将缺失的标签全部用 0 标记,这样就不能使用 one-hot 编码了。例如,标签总数为 10,编号 0-9,一张图片中包含 0,3,9 号标签,那么这张图片的标签编码为:1 0 0 1 0 0 0 0 0 1。而且在多标签分类任务中,最后一层的输出就不能看成一个分布了,因为加起来不为 1,可以把输出层每个神经元看作一个二项分布,这相当于将一个多标签问题转化为在每个标签上的二分类问题。

1.2 基数

1.2.1 无穷集合比较大小

  说到基数,先提一下无穷集合比较大小。

  首先提出一个问题 “自然数的个数和正偶数的个数哪个多呢?” 有人说,当然是自然数的个数多,因为自然数包括正偶数;也有人说这两类数的个数都是无穷大,所以应该是一样多。

  这里面引出来一个很本质的问题,到底比较两个集合元素个数多少的标准是什么?虽然我们还是孩子的时候,就知道自己分了一个苹果而其他小朋友分到了两个苹果是不公平的,但是直到19世纪末,才由伟大的集合论开创者康托尔提出集合元素个数之间严格比较大小的标准。

  我们平时一般靠数数来记录一个集合元素的个数,再比较这两个数字大小来确定两个集合之间谁的元素更多,实际上这是在拿一个集合的元素去与自然数集合的元素做对应。如果某个集合中的元素能够与从小到大排列的自然数某个子集建立一一对应,那么就认为这个集合中元素的个数就是自然数子集中最大的那个数。

  再提出一个问题?下面的两条线段哪一条中包含的点更多?
          
  我第一次看到这个问题就觉得肯定有鬼。肯定不是下面这条长,应该是一样长,但是又不知道为什么它们一样长。我的导师直接画了两条线,我就恍然大悟了。
          
  下面那条线中的任一点总能在上面那一条线找到一一对应的点。这就是康托尔提出集合之间元素个数多少的判定标准,集合之间元素个数多少的比较,本质上在于集合间的对应(映射)。

  如果两个集合 A 和 B 之间能够建立一一对应(集合论中将这种对应叫做双射),那么就说这两个集合的元素个数一样多,记作 ∣ A ∣ |\Alpha| A = ∣ B ∣ |\Beta| B;如果能够建立 A 到 B 的单射(指每个 A 中的元素都对应一个 B 中的元素,且不同的 A 中元素对应的B中元素也不同),那么就说集合 B 的元素个数不少于 A 的元素个数,记作 ∣ A ∣ ≤ |\Alpha| \leq A ∣ B ∣ |\Beta| B ∣ B ∣ ≥ |\Beta| \geq B ∣ A ∣ |\Alpha| A

  对于元素个数有限的有限集来说,这种判定标准与日常人们熟悉的“数数”判定标准是一样的。一个有着100个元素的集合肯定能够与另外一个也有着100个元素的集合建立一一对应,但是绝不能与一个有着101个元素的集合建立起一一对应。

  设 N \Nu N = {1, 2, 3, …} 是自然数集合, E \Epsilon E = {2, 4, 6,…} 是正偶数集合, n ∈ n ∈ n N \Nu N e ∈ e ∈ e E \Epsilon E,则建立集合 N \Nu N E \Epsilon E 之间的映射 f f f N \Nu N → \to E \Epsilon E e = f ( n ) = 2 n e = f(n) = 2n e=f(n)=2n。由此我们知道了,自然数的个数与正偶数的个数是一样多的


1.2.2 基数

  有了前面关于集合元素个数比较大小的标准,我们就可以定义一个概念 —— 集合的基数。作为普及性文章,我们没有必要给出严格的基数定义,描述性的来说,

基数就是一个集合元素的个数(集合的基数有时也被叫做集合的势)。

  显然,对于有限集合来说,其基数就是这个集合的元素的个数,必然是一个自然数。但是对于无限集合来说,由于其元素个数无穷多,没有一个自然数能够表示,我们需要定义一些新的 “数”。我们首先定义自然数的个数是 ℵ₀ (这个符号来自于希伯来字母,可以读作阿列夫,自然数的个数就是阿列夫零)。显然,我们知道有理数、整数、奇数、偶数、代数数的个数都是 ℵ₀ 。

  那么问题来了,∅ 的基数是多少? { ∅ } 呢?

   c a r d ( ∅ ) card(∅) card() = 0; c a r d card card( {∅} ) = 1


1.3 笛卡尔积

  我们最常用的是笛卡尔坐标系,一维数轴可表示为 R \Bbb{R} R,二维平面可表示为 R \Bbb{R} R × \times × R \Bbb{R} R = R 2 \Bbb{R}^2 R2 n n n 维空间当然就是 R n \Bbb{R}^n Rn 了。

一维数轴上的点就是一个实数 x x x R \Bbb{R} R
二维数轴上的点就是一个实数对 ( x , y ) (x, y) (x,y) R 2 \Bbb{R}^2 R2
一维数轴上的点就是一个向量( x 1 , x 2 , . . . , x n ) x_1, x_2,..., x_n) x1,x2,...,xn) R n \Bbb{R}^n Rn

  设 A \Alpha A B \Beta B 是两个集合,称集合 A \Alpha A × \times × B \Beta B = {< x , y x, y x,y> | ( x ∈ x∈ x A \Alpha A) ∧ \wedge ( y ∈ y∈ y B \Beta B) } 为集合 A \Alpha A B \Beta B笛卡尔积

由笛卡尔积定义可以看出:

  1. A \Alpha A, B \Beta B 是任意两个集合,则不一定有 A \Alpha A × \times × B \Beta B = B \Beta B × \times × A \Alpha A,即笛卡尔积不满足交换律;
  2. A \Alpha A × \times × B \Beta B = ∅ 当且仅当 A \Alpha A = ∅ 或者 B \Beta B = ∅;
  3. A \Alpha A, B \Beta B, C C C 是任意三个集合,则不一定有 A \Alpha A × \times × ( B (\Beta (B × \times × C ) C) C) = ( A \Alpha A × \times × B \Beta B) × \times × C C C,即笛卡尔积不满足结合律;
  4. 当集合 A \Alpha A, B \Beta B 都是有限集时, ∣ A |\Alpha A × \times × B ∣ \Beta| B = ∣ B |\Beta B × \times × A ∣ \Alpha| A = ∣ A ∣ |\Alpha| A × \times × ∣ B ∣ |\Beta| B;
  5. 笛卡尔积对并运算和交运算满足分配律。

  上述 4 在机器学习中最为常见,可以完美地表示混合类型的数据。任何实例都可以使用这种元素描述,但反过来,并非所有的元素都对应于数据集中的一个实例,即数据不会填满整个空间, 甚至通常在这个空间内是非常稀疏的。找出数据在空间中的分布规律,这也是数据挖掘的基本意义。

  说到数据集,这里介绍两种表示方法。

  1. 矩阵表示法
    当各个属性都为实型值时,数据集可表示为 D D D R n × m ) \Bbb{R}^{n \times m)} Rn×m) ,它表示每个实际的数据集,都是 n × m n \times m n×m 维空间的一个点而已。如果记 D = ( x 1 , x 2 , . . . , x n ) T D = (x_1, x_2,..., x_n)^T D=(x1,x2,...,xn)T,则 x i x_i xi R m \Bbb{R}^ m Rm;
  2. 集合与向量混合法
    D D D = { x 1 , x 2 , . . . , x n x_1, x_2,..., x_n x1,x2,...,xn},则 x i x_i xi R m \Bbb{R}^ m Rm;

优缺点

  1. 集合与向量混合法中,元素可以随意交换顺序,这与现实数据的独立性一致。
  2. 集合与向量混合法中,不允许两个元素相同,这与现实情况不一致。
  3. 矩阵表示法可以支持矩阵的相乘,,易于表示加权等操作,,用于神经网络, 线性回归时方便。

注意:在机器学习中,经常用一个列向量表示一个实例。


1.4 幂集

  设 A \Alpha A 为任意集合,以 A \Alpha A 的子集为元素所组成的集合,称为 A \Alpha A 的幂集。

P ( A ) = P(\Alpha) = P(A)= { x ∣ x | x x ⊆ A x \subseteq \Alpha xA}; 若 ∣ A ∣ |\Alpha| A = n n n,则 ∣ P ( A ) ∣ = |P(\Alpha)| = P(A)= 2 n 2^n 2n


举例:
P ( ∅ ) P(\emptyset) P() = { ∅ \emptyset }
P P P({ ∅ \emptyset }) = { ∅ \emptyset , { ∅ \emptyset }}
P P P({1, {2, 3}}) = { ∅ \emptyset , {1}, {2,3}, {1, {2, 3}}}

  幂集不仅限于有穷集,对于任意无穷集也有效。


2. 二元关系

  其实不用想得太复杂,关系就是关系。比如,1 < 2 是二元关系,我爱学习也是二元关系。我认为如果两个东西之间有联系,并且说明了联系的方式,那就可以称之为关系。

  另外,两个集合的笛卡尔积是遍历了所有的 “对”,之所以是子集是因为上述 “联系的描述” 可能对某些对有效,对某些对无效。

  在平面直角坐标系中, 等于关系就是 45 度方向的一条线 ( x = y x = y x=y);小于关系就是这条线的左上部分 ( x < y x < y x<y);同理,大于关系就是这条线的右下部分 ( x > y x > y x>y)。


3. 函数

  函数也叫映射、变换或对应。但是我们需要区别函数与方程的区别以及与关系的区别。

  函数定义:设 f f f 是集合 A \Alpha A B \Beta B 的关系,如果对每个 x ∈ A x ∈ \Alpha xA,都存在唯一的 y ∈ B y ∈ \Beta yB,使得 < x , y x, y x,y> ∈ f f f,则称关系 f f f A \Alpha A B \Beta B 的函数,记作 f f f: A → B \Alpha \to \Beta AB A \Alpha A 为函数 f f f 的定义域, f ( A ) f(\Alpha) f(A) 为函数 f f f 的值域。

注意

  1. f ( x ) f(x) f(x) 表示一个变值, f f f 代表一个集合。因此 f ≠ f ( x ) f \neq f(x) f=f(x)
  2. f ( x ) f(x) f(x) B \Beta B 的子集,即 B \Beta B 中有些元素跟 A \Alpha A 不对应也可以。
  3. 如果存在元素 a ∈ A a ∈ \Alpha aA,在 B \Beta B 中没有对应元素,那么关系 f f f 就不是函数。
  4. 如果存在元素 a ∈ A a ∈ \Alpha aA,在 B \Beta B 中有两个或两个以上对应的元素,那么关系 f f f 就不是函数。

辨别函数与方程:从本质上,方程就是一个等式,而函数是一个对应关系。

辨别函数与关系的联系与区别

  1. 在离散数学中,函数可以看作是一种特殊的二元关系
  2. A \Alpha A B \Beta B 的不同的关系有 2| A \Alpha A|| B \Beta B|个,但从 A \Alpha A B \Beta B 不同的函数却只有 | A \Alpha A|| B \Beta B| 个。(每个 B \Beta B 中的元素都可以有 ∣ A ∣ |\Alpha| A A \Alpha A 中元素匹配)。
  3. 关系的第一个元素可以相同;函数的第一个元素一定是互不相同的。

  举个栗子,令函数的定义域为 D D D, 值域为 V V V,可以认为函数 D × V D \times V D×V 的子集,也就是一种特殊的关系。如 x 2 + y 2 = 1 x^2 + y^2 = 1 x2+y2=1,它是二维平面 R 2 \Bbb{R}^2 R2 中的一个单位圆,为若干平面中的元素 (点) 所构成, 因此为 R \Bbb{R} R 上(即定义域、值域均为 R \Bbb{R} R)的二元关系。但它不是一个函数。 y = 1 − x 2 y = \sqrt{1 - x^2} y=1x2 就既是函数,也是二元关系。

  在机器学习中,单标签任务学习器可以看做一个函数(毫无疑问)。对于多标签分类器,一个实例 x x x 虽然同时拥有多个标签,但是可以把多个标签看作一个标签组合,每个实例对应的标签组合是唯一的,所以多标签分类器仍然是一个函数。


4. 元组(tuple)

  百度百科中提到。元组是关系库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。在二维表中,元组也称为行或记录。

  笛卡尔积中每一个元素 ( d 1 , d 2 , . . . , d n ) (d_1, d_2,..., d_n) (d1,d2,...,dn),叫做一个 n n n 元组或简称为元组。

  以 Python 为例。元组也是一种序列,元组使用小括号表示,元素中各元素之间用逗号隔开。元组不支持修改或删除其所包含的元素。这也是与列表最本质的区别,列表是动态数组,如果想要修改元组中的元素,可先将其转换成列表。

  C++中也引入了元组 tuple, 可以定义任意多个类型的对象的组合,下面是 C++ tuple 的栗子。

#include <iostream>  
#include <vector>  
#include <string>  
#include <tuple>  
  
using namespace std;  
  
std::tuple<std::string, int>  
giveName(void)  
{
     
    std::string cw("Caroline");  
    int a(2013);  
    std::tuple<std::string, int> t = std::make_tuple(cw, a);  
    return t;  
}  
  
int main()  
{
     
    std::tuple<int, double, std::string> t(64, 128.0, "Caroline");  
    std::tuple<std::string, std::string, int> t2 =  
            std::make_tuple("Caroline", "Wendy", 1992);  
  
    //返回元素个数  
    size_t num = std::tuple_size<decltype(t)>::value;  
    std::cout << "num = " << num << std::endl;  
  
    //获取第1个值的元素类型  
    std::tuple_element<1, decltype(t)>::type cnt = std::get<1>(t);  
    std::cout << "cnt = " << cnt << std::endl;  
  
    //比较  
    std::tuple<int, int> ti(24, 48);  
    std::tuple<double, double> td(28.0, 56.0);  
    bool b = (ti < td);  
    std::cout << "b = " << b << std::endl;  
  
    //tuple作为返回值  
    auto a = giveName();  
    std::cout << "name: " << get<0>(a)  
            << " years: " << get<1>(a) << std::endl;  
  
    return 0;  
} 

输出结果:

num = 3  
cnt = 128  
b = 1  
name: Caroline years: 2013  

转载:https://blog.csdn.net/qq_41033011/article/details/116322404
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场