前言
以下问题以Q&A形式记录,基本上都是笔者在初学一轮后,掌握不牢或者频繁忘记的点
Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系,也适合做查漏补缺和复盘。
本文对读者可以用作自查,答案在后面,需要时自行对照。
问题集
数据集
Q1:什么是结构化数据与非结构化数据?二者有什么不同的处理方式?
Q2:对于一个数据集dataset,什么是feature?如果数据集是非结构化数据,他的特征(feature)的格式大致是什么?
Q3:回归任务(regression)的主要目标是什么?
Q4:逻辑回归是什么?逻辑回归的特性?(回归中有线性回归和多项式回归,这些和逻辑回归有什么关系?)
机器学习的分类
Q5:分类和回归都属于监督学习,这个说法正确吗?
Q6:数据的降维,从特征视角看是做了什么工作?降维和数据可视化属于什么学习?
Q7:数据降维有哪几种方法?
Q8:未来ai的重要问题:模型可信,小样本,推理而不是判断(缺乏抽象思维和逻辑推理)
下图四大工具的主要内容是否已经熟知?
Q9:jupyter的用法和魔法命令?
Q10:在jupyter中,%%whos %%lsmagic 是做什么的?
Q11: 对于以下代码,其输出的结果是什么?
x = [i for i in range(10)]
Q12:创建数组有两种方法:range 和 np.arange,二者显著的区别是什么?
Q13:在numpy中random.seed设置之后,执行的代码行数不同为什么有不同结果?
数组切片
Q14:numpy中,a[:] ,以及 a[::2] 代表什么?( 思考:a[x:y:z] )
Q15:对numpy的数组a,制造一个切片 a[1:3],并且对这个切片内容进行修改,a会发生改变吗?原生数组呢?
Q16:如果数组切片会改变,那么有效的处理方式是什么?(我就想要一个“不会改变的”切片之后的array,该怎么做?)
Q17:numpy中的均值?标准差?方差?
Q18:numpy中,如果想知道一个x[1000000]数组中,min值所在的数组下标,该怎么做?
Q19:如何合并和拆分数组?除了hstack和vstack?(最为原始的是哪一个?对应的拆分?)
Q20:用vstack和vsplit??
Q21:如何将 a[2,3] 这个数组的最后一列split开?(注意使用“最后一列”方法切片,而不是切“第3列”)
Q22:已知A=[1,2,3,4] ,如何获得 A2 = [1x2, 2x2, 3x2, 4x2]
Q23:神奇索引怎么使用?如何结合布尔数组使用?
Q24:numpy中,假设x是一个数组,那么 x[x>3] 是什么语法含义?
Q25:arg是用来干什么的?
Q26:np.all 和 np.any 是干什么的?
Q27:np.count_nonzero(x[x==3])
参考解答
数据集
Q1:什么是结构化数据与非结构化数据?二者有什么不同的处理方式?
A1:结构化数据可以是“鸢尾花→A参数:x,B参数y,....”,
非结构化数据可以是图片文字等参数与值一一对应的数据,其处理方式有:
1)映射成结构化特征 2)直接进行处理
Q2:对于一个数据集dataset,什么是feature?如果数据集是非结构化数据,他的特征(feature)的格式大致是什么?
A2:在机器学习和数据分析领域,数据集(dataset)通常由多个数据点组成,每个数据点可以是一条记录或一个实例。而特征(feature)则是指数据集中每个数据点的属性或测量值。特征可以是连续的数值,也可以是离散的类别。
例如,如果我们有一个数据集是关于不同汽车的信息,那么可能的特征包括:
- 汽车的制造商(离散特征)
- 汽车的年份(连续特征)
- 汽车的里程数(连续特征)
- 汽车的价格(连续特征)
- 汽车的类型(离散特征,如轿车、SUV等)
对于非结构化数据,例如图像一类的非结构化数据的feature可以是像素,我们也可以把一个32x32的像素集合当成一个特征向量。
Q3:回归任务(regression)的主要目标是什么?
A3:量化xx是xx的概率。
Q4:逻辑回归是什么?逻辑回归的特性?(回归中有线性回归和多项式回归,这些和逻辑回归有什么关系?)
A4:一种可解释性强,可并行的二分类任务,业界工程化中很受欢迎。不过他的 f() 与二分类有所不同,这部分深挖起来细节很多
机器学习的分类
Q5:分类和回归都属于监督学习,这个说法正确吗?
A5: √,监督学习的关键特点在于训练数据包含输入特征及其对应的标签或结果。
Q6:数据的降维,从特征视角看是做了什么工作?降维和数据可视化属于什么学习?
A6:无监督学习。数据的降维实际上是将多个特征合并成一个
Q7:数据降维有哪几种方法?
A7:在众多数据降维方法中,以下是最新或最著名的四种降维技术:
-
- 主成分分析(PCA):PCA是一种经典的线性降维技术,通过正交变换将原始数据转换到一组线性不相关的主成分上,以找出数据的“最大方差”方向,并将数据投影到这些方向上。它通常用于减少数据集的维度,同时尽可能保留数据中的变异性,也常用于可视化高维数据 。
- t-分布随机邻域嵌入(t-SNE):t-SNE是一种非线性降维技术,非常适合高维数据降维到2维或3维进行可视化。它基于概率分布的方式将高维数据映射到低维空间,尤其适用于数据具有复杂分布特征的数据集 。
- 局部线性嵌入(LLE):LLE也是一种非线性降维技术,核心思想是保持数据点的局部特性。它在每个点的邻域中找到最佳的线性表示,然后在低维空间中重建这些线性关系,尤其适用于那些局部区域结构重要的数据 。
- 自动编码器(Autoencoders):自动编码器是一种基于神经网络的非线性降维技术。它通过训练网络学习一个低维表示(编码),然后重构输出,以尽可能接近输入数据。在深度学习领域,它们广泛用于无监督学习的特征提取和数据压缩 。
A8:--
Q9:jupyter中的魔法命令?
A9:jupyter
Q10:在jupyter中,%%whos %%lsmagic 是做什么的?
A10: %whos 用来调试
%lsmagic 用来列出所有的魔法命令
Q11: 对于以下代码,其输出的结果是什么?
x = [i for i in range(10)]
A11:
1) x = [ i for i in range(10) ]
特别注意!输出的是数组 [0,1,...,9 ], 而不是10。python的range采用了左闭右开的设计规则!
2)如果在调用 random.seed() 之后,执行了其他未指定随机种子的操作,这些操作可能会影响随机数生成器的状态,从而导致不同的结果。
Q12:创建数组有两种方法:range 和 np.arange,二者显著的区别是什么?
A12:range的方式不限定数组元素类型,处理起来较慢,输出也是体量较大的多功能数组类型。
np.arange 的底层是 np.array ,更面向数学,处理速度快很多,像是向量和矩阵的概念。
Q13:在numpy中random.seed设置之后,执行的代码行数不同为什么有不同结果?
A13:一般是意外情况。如果你在代码的不同位置设置了不同的种子值,或者在某些地方没有设置种子,那么随机数生成器的起始点将会不同,从而导致生成的随机数序列也不同。一个典型例子:如果在代码的不同部分多次调用了 random.seed 并且使用了不同的值,每次设置都会改变随机数生成器的状态,导致后续生成的随机数序列不同。
数组切片
Q14:numpy中,a[:] ,以及 a[::2] 代表什么?( 思考:a[x:y:z] )
A14:numpy中,a[:] 代表整个a(切了没?如切!) a[::2] 代表隔一个取一个。
实际上 a[x:y:z] 是一个切片的完全体格式,代表着 切x~y,从x开始,每次增加z个偏移量的下标取数组元素
Q15:对numpy的数组a,制造一个切片 a[1:3],并且对这个切片内容进行修改,a会发生改变吗?原生数组呢?
A15:numpy中对数组的切片进行修改,则矩阵会被修改,而py不会。原因是为了效率考虑,设计时使用了引用。
Q16:如果数组切片会改变,那么有效的处理方式是什么?(我就想要一个“不会改变的”切片之后的array,该怎么做?)
A16:x = a[1:8].copy()
Q17:numpy中的均值?标准差?方差?
A17:平均值mean,方差std,标准差var。使用起来大概是这样:a.std()
Q18:numpy中,如果想知道一个x[1000000]数组中,min值所在的数组下标,该怎么做?
A18:
Q19:如何合并和拆分数组?除了hstack和vstack?(最为原始的是哪一个?对应的拆分?)
Q20:用vstack和vsplit??
A19:合并数组:c = np.concatenate( (a,b),axis=0 )
# 数组的合并 a = np.arange(10).reshape(2,5) b = np.full_like(a,1) print("a = \n",a,"\n","b = \n",b) # c = np.concatenate(a,b) c = np.concatenate((a,b)) # 这种就是以行的形式接上去了,默认是这样 print("concatenated c(axis=0) = \n",c) c = np.concatenate((a,b),axis = 1) # axis 可以指定合并哪个维度 print("concatenated c(axis=1) = \n",c)
输出结果:
对应的拆分:
x,y = np.split(c,2,axis=0) print(x," ",y) x,y = np.split(c,2,axis=1) x,y
A20:
# np.split? c1,c2 = np.vstack((a,b)), np.hstack((a,b)) x1,x2 = np.vsplit(c1,2) x1,x2 = np.hsplit(c2,2) x1,x2
Q21:如何将 a[2,3] 这个数组的最后一列split开?(注意使用“最后一列”方法切片,而不是切“第3列”)
A21:
a,b = np.split(c1, [-1] ,axis=1) # [-1] 代表最后一行/列,axis=1 代表列
b
Q22:已知A=[1,2,3,4] ,如何获得 A2 = [1x2, 2x2, 3x2, 4x2]
A22: numpy中,直接用 A*2 就可以。
但是注意,这个特性只有numpy有,对于py原生是不可以用的,这种情况写的就会比较麻烦:
Q23:神奇索引怎么使用?如何结合布尔数组使用?
A23:以二维数组为例,以下代码访问的分别是:D[1,2] , D[1,2], D[1,3]
D[ np.array([1,1,1]), np.array([2,2,3]) ]
或者
D[ [1,1,1],[2,2,2] ]
另外还有:
col = [1,3]
B[0,col] # 第0行,第col=[1,3]两列
B[1,1:3] # 第0行,第col=[1~3]列
Q24:numpy中,假设x是一个数组,那么 x[x>3] 是什么语法含义?
A24:x[x>3] 运用了 x>3 这一个比较索引,生成了一个 shape上等同于x的布尔索引数组
布尔索引和神奇索引连用就会产生这种效果。我们可以让任意表达式变成索引!不过一定要记得是 ndarray 才可以
Q25:arg是用来干什么的?
A25:arg主要用来返回地址,what is the index。使用了argxxx的函数最终返回的就是下标而非数据。
Q26:np.all 和 np.any 是干什么的?
A26:
Q27:np.count_nonzero(x[x==3]) 的含义?
A27:统计x[x=3]数组中非0元素的个数 → x中 =3 的元素个数