[TOC]
本文引用和使用的类库
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn import datasets
Jupyter Notebook’s Learning to writing
Toolbar
- 可以进行 Cell代码行的编写运行
- 可以切换Cell编写模式——为Markdown的模式
- Help当中可以快速浏览并且更改使用的快捷键
快捷键
- a/b 快速插入一行(在相应的选中行的上面或者下方)
- x 剪切/删除一行
- m 切换为markdown模式
- y 切换为coding模式
优点
每次不用总是重新加载数据
只需要加载一次就可以!所以方便注意:下面定义的变量,在上方也可以用!除非点击Kernel——Restart & run all
以上就可以充值变量上下文。
Jupyter Notebook 高级-魔法命令
1 | %run #调用并且 加载对应的脚本/方法。 |
%run? #查看对应方法的 帮助文档
lsmagic #查看当前环境下,所有的魔法命令
numpy.array基础
选择为什么不选择List
Python List 的特点
1 | L = [i for i in range(10)] |
区别List 、 array、 numpy.array
- Python的List不要求存储同样的类型,带来效率问题。
- array的缺点是没有将数据当做向量或者矩阵,不支持基本运算。
- nparr.dtype —— 只有一种类型的数据类型在nparr中!
而且 nparr可以有 整型 和 浮点型
而且 nparr可以用来生成 矩阵和向量之类的。使用 range 创建list列表
- range(start, stop[, step])
参数说明:
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等>价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, >5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, >5, 1)
函数方法
- np.arange(0, 20, 2)
[0, 20) 步长为2的
- np.linspace(0, 20, 10)
[0, 20] 区间中截取出10个数字
- np.random.randint( 0, 10, 10/(3,5) )
[0,10)的随机10 个数字;或者 3行5列!
- np.random.random( 10/(3, 5) )
0-1之间均匀的浮点数
- np.random.seed( 666 )
给予一个伪随机数,就能对应生成确定的随机矩阵。
- np.random.normal( 10, 100, (3,5))
默认:均值为0 方差为1,的随机的浮点数。上面是均值为10、方差为100的 3行5列的矩阵!
- np.random.uniform( 0., 10., size = 100 )
产生100个 [0,100) 的浮点数
查看文档
- np.random?
- help(np.random)
其它创建numpy.array的方法
- np.zeros(10)
- np.ones((3,5))
- np.full( (3,5), 666 )
numpy.arrary 的基本操作
- X = np.arange(15).reshape((3, 5))
15个元素 重新构成3*5的矩阵 - X.ndim #2(二维数组)
- X.shape #(3,5)
注意: X.shape[0] == 3
- X.size #15
数据访问方法
多维数组不建议:X[0][0]
建议使用:X[0, 0]
切片
切片访问:x[0:5:2]
【0,5) 步长为2 NOTX
X[:2, :3] #前两行的 前三列
X[ :, 0] #取第一列子矩阵 在父亲矩阵中使用的引用!所以也会改变 父亲矩阵!
除非 X[:2, :3].copy() —— 来进行非引用拷贝Reshape
不改变 原来的数据、而是改变成矩阵!但是需要复制!不会
- B = x.reshape(1, 10)
- B
注意这个有两个维度!
- array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
- x.reshape( 2, -1)
注意这里是让 x转化成两行的元素,自动化分列数
np.array的合并和分割
np.concatenate()
- A = np.array([[1, 2, 3],
[4, 5, 6]])
- np.concatenate([A, A])
array([[1, 2, 3],
[4, 5, 6], [1, 2, 3], [4, 5, 6]])
- np.concatenate([A, A], axis=1)
- array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
默认为:(轴)axis=0,表示进行第一维度链接
等于1 表示进行第二维度连接 np.concatenate([A, z.reshape(1, -1)])
注意concat 只能进行相同纬度的叠加!需要把z向量转化为 矩阵!
np.vstack([A, z])
进行A z的纵向链接, 相当于加上一行,在自己这一行后面
- np.hstack([A, z]) #加上一列
进行A z的横向矩阵链接, 相当于加上一列,在自己这一行一列 后面
强制转化 数据类型
x = np.array( X, dtype=float )
np.slit()
- x1, x2, x3 = np.split(x, [3, 7])
切分点 0—2 3—6 7—9(x = 0—9)
- A1, A2 = np.split(A, [2], axis=1)
切分矩阵,默认0-第一维度-行方向 第二行切割
注意:矩阵是从第0行开始的!,所以 第二行在A2中!
- upper, lower = np.vsplit(A, [2])
进行垂直方向 上下切分矩阵。
- left, right = np.hsplit(A , [2])
进行水平方向 进行左右切分
- y = array([[ 3],
[ 7], [11], [15]])
为了进行4行1列的矩阵—转变为向量
- y[:, 0]
抽出所有的行,只要第一列。变为:array([ 3, 7, 11, 15]) —— 向量了!
是为了,对数据进行 预处理而进行学习使用的!
np.delete()
X.shape
(150,2)
X_new = np.delete( X, 138, axis=0 )
直接把X的第138行给删除了
numpy.array
中的运算
numpy直接就能 数组看做矩阵、向量进行运算!
Universal Functions
numpy 遵循这个直接运算要求而且快!
直接 + - ×
/ 浮点数出发
// 证书的出发!
x ** 2 幂运算
x % 2
1 / x
- np.abs()
- np.sin()
- np.cos()
- np.tan()
- np.exp(x) #e的x次方
- np.power(3, x) #3的x次方
- np.log(x) #以e为底的 函数
- np.log2(x) # 以2为底的函数
- np.log10(x) #以10为底的 函数
矩阵运算
- A + - B
AB 是指对应元素及进行运算! 不是标准矩阵之间惩罚- A.dot(B)
A和B 两矩阵进行标准的惩罚运算。- A.T
矩阵转置方法。向量v和矩阵A的运算
- v+A
相当于:np.vstack([v] * A.shape[0]) + A
- np.tile(v, (2, 1))
堆叠向量v, 行堆叠2次,列堆叠1次相当于上方!- v*A
v.dot(A) —— 矩阵乘法!
A.dot(v) —— v会根据矩阵A进行 自动调整自己是行向量,还是列向量!
矩阵的逆
- np.linalg.inv(A)
linear algebra //线性代数
方阵才有 逆矩阵 - pinvA = np.linalg.pinv(X)
伪 逆矩阵!可求出不是方阵的伪逆矩阵!
- X.dot(pinvA)
仍然是一个 方阵.
向量的模
- w1 = np.linalg.norm(w)
求出向量w的模
- w / w1
对应求出 w的单位向量
矩阵的聚合操作
- np.sum(L)
- np.min() / np.max()
等同于 array.min()
- np.sum( X, axis=0 )
沿着行方向进行运算 相加,所以最终是列加和。
- np.prod(X)
X中进行乘积
- np.mean(X) / np.median(X)
求均值 和 中位数
- np.percentile( big_arrary, q=50 )
找百分位 for percent in [0,25,50,75,100]:
- np.var(big_array) / np.std(big_array)
求方差/ 标准差
索引
arg方式
为了查看最小值,以及最小值的位置在哪
- np.argmin(x)
198532 == x[198532]排序和使用索引
- np.random.shuffle(x)
直接进行乱序处理- np.sort(x)
返回修改后的数组- x.sort()
排好x的顺序- np.sort(X , axis=1)
沿着列进行排序, 把每一行排好顺序了。- np.argsort(x)
拍好 索引顺序的数组,通过索引,找大小。- np.partition(x, 3)
标定点3, 小于3的在左边, 大于3的在右边- np.argpartition(x, 3)
仍然是进行 索引的标定3将数组打乱随机排列 两种方法:
- np.random.shuffle(x):在原数组上进行,改变自身序列,无返回值。
- np.random.permutation(x):不在原数组上进行,返回新的数组,不改变自身数组。
Fancy Indexing
- x[3:9:2]
2为步长 进行索引
- ind = [3, 5 ,8]
- x[ind]
对应进行索引!
- ind = np.array([[0, 2], [1, 3]])
- x[ind]
对应进行索引,根据ind索引,建立 新的x矩阵。
- col = np.array([1, 2, 3])
- x[:2, col]
x中前两行的
第0行 和 第1行
, 1 2 3列 - col = [True, False, True, False]
x[ 1:3, col]
numpy.array的比较
- example_digits = noisy_digits[y==0,:][:10]
只要对应前十行
- x > 3
返回bool值
- np.sum(x<=3) //统计x中 小于等于3的个数。
np.count_nonzero(x<=3)
- np.any(x==0) //true 有就行
np.all(x>=0) //true
- np.sum( x%2==0 )
np.sum(x%2==0, axis=1)
- np.all( x > 0, axis=1 )
np.sum( (x>3) & (x<10) )
- np.sum( (x%2==0) | (x > 10) )
np.sum( ~(x==0) )
- x[x[:,3]%3==0, :]
最后一列被三整除为 0,3个True——转化为第0行和第3行
Pandas
- Pandas进行预处理——然后转化为 numpy——再把numpy加入到 sklearn之中进行处理、操作!
以上!numpy进行机器学习矩阵进行处理的方法,完成。
因为 sklearn是需要numpy的数据进行操作的,然而Pandas方便进行处理,所以 需要进行这样的过度。
matplotlib 基础
- import matplotlib as mpl
- import matplotlib.pyplot as plt
plt.plot绘制直线图
- plt.plot(x, y, color=”red”, linestyle=”—“, label=”cos(x)” )
应该再加上:
plt.legend()
用来显示对应曲线的图例
- plt.show()
linestyle 绘制出来 : -, — -不同的图像形式。
- plt.xlim(-5, 15)
- plt.ylim(0, 1)
更改 x,y轴的范围.
- plt.axis([-1 ,11 ,-2 ,2])
- plt.xlabel(“”x value)/ pltylabel(“y value”)
- plt.title(“添加对应标题.”)
plt.scatter 绘制散点图
- plot.scatter(x, siny, alpha=0.5)
通常绘制二维特征/两个特征的时候 用散点图。
不透明度—— 0完全透明,1完全不透明。 - plt.scatter(X[y==0,0], X[y==0,1], color=”red”, marker=”o”)
plt.scatter(X[y==1,0], X[y==1,1], color=”blue”, marker=”+”)
plt.scatter(X[y==2,0], X[y==2,1], color=”green”, marker=”x”)
plt.show()
高斯核函数讲解
1 | l1, l2 = -1, 1 |
关键学会 enumerate的使用。
读取数据和简单的数据探索
- from sklearn import datasets
- iris = datasets.load_iris() # 鸢尾花数据集
- iris.keys()
- iris.data #相对应的数据
- iris.target #相对应的种类
1
2
3
4
5
6y = iris.target
plt.scatter(X[y==0,0], X[y==0,1], color="red") #找出鸢尾花对应的种类所在行,
#然后显示 这一行的,0\1两个特征~ OK~
plt.scatter(X[y==1,0], X[y==1,1], color="blue")
plt.scatter(X[y==2,0], X[y==2,1], color="green")
plt.show()
数据处理代码操作注意事项
使用copy()数值
y = digits.target
y = digits.target.copy() # 这样写作为一个拷贝才正确使用try except
try:
return 2 precision recall / (precision + recall)
except:
return 0.0