最近一次听到离散数学四个字还是在复试的时候,英语部分结束后第一个问题就是:“你本科是数学专业的哈,那你说说离散数学在计算机科学中的应用”
我:“我暂时只能想到在写代码的时候会涉及到命题逻辑的相关内容,整个函数的流程与各种条件判断都有关联,没记错的话应该是离散数学课本第一章的内容,其他的应用就不清楚了”。
然后今天看了下成绩单:
大二下学期的课程,而且才68分。差不多是学过,也没学过,下面的内容基于闵老师原文和大二那本没丢的离散数学教材。
书中说,集合是不能精确定义的基本概念。集合的表示有2种方法,列元素法和谓词表示法。
如: A = { 0 , ± 1 , ± 2 , ± 3 } A=\{0,±1,±2,±3\} A={ 0,±1,±2,±3} —列元素法
B = { x ∣ x ∈ Q ∧ x ² ≤ 9 } B=\{x|x∈\textbf{Q}\wedge x²≤9\} B={ x∣x∈Q∧x²≤9} —谓词表示法
A,B其实是同一个集合的不同表示。
习题 1: { 0 , 1 , { 0 , 1 } , { 1 , 2 } } \{ 0 , 1 , \{ 0 , 1 \} , \{ 1 , 2 \}\} { 0,1,{ 0,1},{ 1,2}} 有几个元素? 机器学习中, 这类形式的集合有什么优点和缺点?
答:有4个元素,集合本身也可以作为集合的元素。(类似数据结构的广义表?)
对机器学习的影响 (纯猜测):
1、优点:以集合作为元素时,容纳了比同样基数的另一个集合更多的数据,可以包含更多种类的数据。
2、缺点:预处理数据时可能会碰到麻烦,比如如果要先找数据的中位数、三分位数、平均数,那么作为元素的集合应该如何参与平均值的计算呢。集合作为在划分训练集和测试集时或许也会有问题。
集合 A \mathbf{A} A的基数,即其元素个数, 记为 ∣ A ∣ |\mathbf{A}| ∣A∣或 c a r d A cardA cardA.
习题2: ∅ \emptyset ∅ 的基数是多少? { ∅ } \{\emptyset\} { ∅} 呢?
答:不含任何元素的集合称为空集, ∅ \emptyset ∅的基数为0
{ ∅ } \{\empty\} { ∅}有一个空集元素,基数为1
笛卡尔积定义: A 1 × A 2 . . . A n = { ( x 1 , x 2 , . . . x n ) ∣ x 1 ∈ A 1 , . . . x n ∈ A n } A_1 \times A_2...A_n = \{(x_1,x_2,...x_n)|x_1\in A_1,...x_n\in A_n\} A1×A2...An={ (x1,x2,...xn)∣x1∈A1,...xn∈An}
【二维数轴上的点(a,b)和(b,a)不一样, x n x_n xn应该对应 A n A_n An】
书中定义:设集合 A , B A,B A,B, A A A中元素和 B B B中元素构成有序对,所有这样的有序对组成的集合称作 A A A和 B B B的笛卡尔积,记作 A × B A\times B A×B.
A × B = { ⟨ x , y ⟩ ∣ x ∈ A ∧ y ∈ B } A\times B = \{\langle x,y\rangle |x\in A\wedge y\in B\} A×B={ ⟨x,y⟩∣x∈A∧y∈B}.
笛卡尔积 可以完美地表示混合类型的数据. 任何实例都可以用这种元素描述, 但反过来, 并非所有的元素都对应于数据集中的一个实例.
数据集的表示方法:
1):矩阵表示法
当各个属性都为实型值 [实数或浮点数],数据集可表示为 D ∈ R m × n \mathbf{D}∈\mathbb{R}^{m×n} D∈Rm×n,表示每个实际数据集都是 n × m n×m n×m维空间的一个点而已。如果记 D = ( x 1 , x 2 , … , x n ) T \mathbf{D}=(x_1,x_2,…,x_n)^T D=(x1,x2,…,xn)T,则 x i ∈ R m x_i∈\mathbb{R}^m xi∈Rm.
2):集合与向量混合法
D = { x 1 , x 2 , … , x n } \mathbf{D}=\{x_1,x_2,…,x_n\} D={ x1,x2,…,xn},其中 x i ∈ R m x_i∈\mathbb{R}^m xi∈Rm
优缺点对比:
i) 集合与向量混合法中, 元素可以随意交换顺序, 这与现实数据的独立性一致; 【矩阵表示法是有序的】
ii) 集合与向量混合法中, 不允许两个元素相同, 这与现实情况不一致;
iii) 矩阵表示法可以支持矩阵的相乘, 易于表示加权等操作, 用于神经网络, 线性回归时方便.
书上定义:设 A A A为集合,把 A A A的全部子集构成的集合称作 A A A的幂集。可记作 2 A 2^A 2A或者 P ( A ) P(A) P(A) 【 2 A 2^A 2A的每个元素都是一个集合】
例: A = { 1 , 2 , 3 } A=\{1,2,3\} A={ 1,2,3},将 A A A子集分类:
0元子集: ∅ \empty ∅ 【空集是任何集合的子集】
1元子集: { 1 } , { 2 } , { 3 } \{1\},\{2\},\{3\} { 1},{ 2},{ 3}
2元子集: { 1 , 2 } , { 1 , 3 } , { 2 , 3 } \{1,2\},\{1,3\},\{2,3\} { 1,2},{ 1,3},{ 2,3}
3元子集: { 1 , 2 , 3 } \{1,2,3\} { 1,2,3}
对于 n n n元集,子集总数为 C ( n , 0 ) + C ( n , 1 ) + … C ( n , n ) = 2 n C(n,0)+C(n,1)+…C(n,n)=2^n C(n,0)+C(n,1)+…C(n,n)=2n
即,例 A A A中, ∣ 2 A ∣ = 2 ∣ A ∣ = 2 3 = 8 |2^A|=2^{|A|}=2^3=8 ∣2A∣=2∣A∣=23=8
关系的本质是集合。
集合满足以下任一条件都可以称作为一个关系,如 R = A × B R=A\times B R=A×B
1):集合非空,且它的元素都是有序对。
2):空集
老师博客中给出的Definition 3. Let A A A and B B B be two sets. Any R ⊆ A × B \mathbf{R} \subseteq \mathbf{A} \times \mathbf{B} R⊆A×B is a binray relation. R R R集合是笛卡尔积 A × B A\times B A×B的子集,由笛卡尔积的定义,R集合必然满足条件1
定义域、值域
老师提出的10号坑:函数是否是关系呢?
函数是关系,但关系不一定是函数。因为函数需要自变量有唯一确定的因变量。
y = 1 − x 2 y = \sqrt{1 - x^2} y=1−x2 可以写成集合 R 1 = { ⟨ 0 , 1 ⟩ , ⟨ − 1 , 0 ⟩ , ⟨ 1 , 0 ⟩ } R_1=\{\langle0,1\rangle,\langle-1,0\rangle,\langle1,0\rangle\} R1={ ⟨0,1⟩,⟨−1,0⟩,⟨1,0⟩}, R = D × V R=D\times V R=D×V,每个 x i ∈ D x_i\in D xi∈D都有唯一对应的 y i ∈ V y_i\in V yi∈V所以是函数。
反之,单位圆 x 2 + y 2 = 1 x^2+y^2=1 x2+y2=1 ,可以举反例 R 2 = { ⟨ 0 , 1 ⟩ , ⟨ 0 , − 1 ⟩ . . . } R_2=\{\langle0,1\rangle,\langle0,-1\rangle...\} R2={ ⟨0,1⟩,⟨0,−1⟩...},所以不是函数。
习题 5: 多标签学习中, 输出为一个向量,相应的学习器算不算函数呢?
答:算,标签信息 → \rarr →向量是一个关系,输出的向量可以由自变量唯一确定,所以是个函数。
从数据结构的角度, 元组就是抽象数据类型; 从面向程序设计的角度, 元组就是一个类。
关于老师对树的定义,我只看懂部分,我的理解如下:
首先定义树 T = ( V , r , p ) , T=(\mathbf V,r,p), T=(V,r,p),其中集合 V \mathbf V V是节点集, r ∈ V r\in \mathbf V r∈V是根节点, r r r是 { v 1 , v 2 . , . . . , v n } \{v_1,v_2.,...,v_n\} { v1,v2.,...,vn}中的任一个, p p p不是很明白,猜测是要满足节点到节点的函数??暂时抽象为节点到节点的边。
条件a:节点 v v v不会回到 v v v,即 无环路
条件b:每个节点 v v v都有到根节点的唯一路径
本来看到条件a的时候还有疑问:如果是这样的图,自己到自己有一条边,在a条件k>1的情况,不就不满足树了吗,然后看到条件b,那没事了。
但是看了下教材,似乎可以这样把条件缩减成一个:任意2个节点间存在唯一路径。
试着写一下: ∀ v 1 , v 2 ∈ V , ∃ 1 k > 0 , 使 p k ( v 1 ) = v 2 \forall v_1,v_2\in \mathbf V,\exist1k>0,使p^k(v_1)=v_2 ∀v1,v2∈V,∃1k>0,使pk(v1)=v2
习题 6: 元组只能表达对象的数据部分, 还是可以完整地表达 (既包括数据, 也包括方法/函数)? 用一个具体的程序来说明.
答:完整表达。用老师文中的例子说明。
public class Academy{
private Staff stf[]; // 教职工集合
private String presidentNum; // 院长工号
private String partySecretaryNum; // 书记工号
private Student std[]; // 学生集合
private Laboratory lbr[]; // 实验室集合
//元组也包括方法\函数
public boolean isStd(String stdNumber){
//...
//由学号判断是否为本学院学生的方法
}
}
// 教职工
public class Staff{
private String name;
private String sNumber; // 工号
//...
}
// 学生
public class Student{
private String stdNumber;
//...
}
// 实验室
public class Laboratory {
private String lbrName;
//...
}
习题 7: 定义二叉树
T = ( V , r , p ) , V , r , p T=(\mathbf V,r,p),V,r,p T=(V,r,p),V,r,p和老师定义的树的含义一样,二叉树的话应该加点条件
1:节点的度不大于2 ,我的理解是,除了根节点,有不超过3条边(1入2出),根不超过2条
1.1:非根节点:任意非根节点相邻的节点都属于一个V的子集合A,A的基数小于等于3
∀ v ∈ V \ { r } → A , p 1 ( v ) = w i , ∀ w i ∈ A ⊆ V , ∣ A ∣ ≤ 3 \forall v\in \mathbf V\backslash \{r\}\rarr\mathbf A,p^1(v)=w_i,\forall w_i \in \mathbf A\subseteq\mathbf V,|\mathbf A|\leq3 ∀v∈V\{ r}→A,p1(v)=wi,∀wi∈A⊆V,∣A∣≤3
1.2:根节点,根节点相邻节点属于一个V的子集合B,B基数小于等于2
p 1 ( r ) = w i , ∀ w i ∈ B ⊆ V , ∣ B ∣ ≤ 2 p^1(r)=w_i,\forall w_i\in\mathbf B\subseteq\mathbf V,|\mathbf B|\leq2 p1(r)=wi,∀wi∈B⊆V,∣B∣≤2
2:任意2个节点间存在唯一路径,满足树的定义
∀ v 1 , v 2 ∈ V , ∃ 1 k > 0 , 使 p k ( v 1 ) = v 2 \forall v_1,v_2\in \mathbf V,\exist1k>0,使p^k(v_1)=v_2 ∀v1,v2∈V,∃1k>0,使pk(v1)=v2
3:左子树右子树有区别,是有序树
不太会,函数自变量加一个? f : V × D → V , D = { l e f t , r i g h t } f:\mathbf V\times D\rarr\mathbf V,D=\{left,right\} f:V×D→V,D={ left,right}
函数是关系,关系是集合,那么这样列举表示函数应该没问题? { ⟨ r 1 , l e f t , r 2 ⟩ , ⟨ r 1 , r i g h t , r 3 ⟩ , ⟨ r 3 , l e f t , r 4 ⟩ } \{\langle r_1,left,r_2\rangle,\langle r_1,right,r_3\rangle,\langle r_3,left,r_4\rangle\} { ⟨r1,left,r2⟩,⟨r1,right,r3⟩,⟨r3,left,r4⟩}
习题7
T = ( V , r , D , f ) T=(\mathbf V,r,\mathbf D,f) T=(V,r,D,f)
V = { v 1 , v 2 , . . . , v n } \mathbf V=\{v_1,v_2,...,v_n\} V={ v1,v2,...,vn} 节点集
r ∈ V r\in\mathbf V r∈V 根节点
D = { d 1 , d 2 } D=\{d_1,d_2\} D={ d1,d2} 左右子树区分 d1=left d2=right
f : V × D → V \ { r } f:\mathbf V\times D\rarr\mathbf V\backslash \{r\} f:V×D→V\{ r} 找子节点的函数
满足:
a): ∀ v ∈ V , ∀ d ∈ D , ∀ k > 0 , f k ( v , d ) ≠ v \forall v\in \mathbf V,\forall d\in \mathbf D,\forall k>0,f^k(v,d)≠v ∀v∈V,∀d∈D,∀k>0,fk(v,d)=v 对任意节点执行k次找子节点的函数,不会找到自己,即无环路
a条件改进思路1:反函数
f f f应该满足双射条件,所以有 f − 1 : V \ { r } → V × D f^{-1}:\mathbf V\backslash\{r\}\rarr\mathbf V \times\mathbf D f−1:V\{ r}→V×D
那么 ∀ v ∈ V \ { r } , ∀ k > 0 \forall v\in\mathbf V\backslash\{r\},\forall k>0 ∀v∈V\{ r},∀k>0有 f − 1 k ( v ) ≠ ( v , d 1 ) o r ( v , d 2 ) {f^{-1}}^k(v)≠(v,d_1)or(v,d_2) f−1k(v)=(v,d1)or(v,d2)
即:任意非根节点执行f的反函数 (父节点+自己是左孩子or右孩子)k次,不会找到自己,即无环路
思路2:把 d d d的任意性由符号语言表达清楚。
∀ v ∈ V , ∀ k > 0 \forall v\in \mathbf V,\forall k>0 ∀v∈V,∀k>0有 f 1 ( f 1 ( f 1 ( . . . f 1 ( v , q 1 ) . . . , q k − 2 ) q k − 1 ) , q k ) ≠ v f^1(f^1(f^1(...f^1(v,q_1)...,q_{k-2})q_{k-1}),q_{k})≠v f1(f1(f1(...f1(v,q1)...,qk−2)qk−1),qk)=v,其中 q i ∈ D q_i\in\mathbf D qi∈D
对任意节点执行k次找子节点的函数,不会找到自己,中 q i q_i qi随便取左还是右,不限于单边树,说明无环路
b): ∀ v ∈ V , ∀ d ∈ D , ∃ 1 k > 0 , 使 f k ( r , d ) = v \forall v\in \mathbf V,\forall d\in \mathbf D,\exist 1k>0,使f^k(r,d)=v ∀v∈V,∀d∈D,∃1k>0,使fk(r,d)=v 根节点到任意非根节点都有唯一路径
上述两点满足树的定义,且满足二叉树的有序性(左右子树)
c):节点的度不大于2
任意节点的子节点都属于一个V的子集合A,A的基数小于等于2
∀ v ∈ V , ∀ d ∈ D , f 1 ( v , d ) = w i , ∀ w i ∈ A ⊆ V , ∣ A ∣ ≤ 2 \forall v\in \mathbf V,\forall d\in \mathbf D,f^1(v,d)=w_i,\forall w_i \in \mathbf A\subseteq\mathbf V,|\mathbf A|\leq2 ∀v∈V,∀d∈D,f1(v,d)=wi,∀wi∈A⊆V,∣A∣≤2