最近写一些用python编程的作业,发现很多知识点都不记得了,在这里把作业中用到的知识点记录下来,方便之后查阅
numpy基本函数
numpy.random
- np.random.random
- `np.random.random((1000, 20))
- 上面这个就代表生成1000行 20列的浮点数,浮点数都是从0-1中随机。
numpy.random.randn()
- 返回标准正态分布
- 标准正态分布又称为u分布,是以0为均值、以1为标准差的正态分布,记为N(0,1)
- 如果没有参数——单个数
- 根据参数返回相应的维数
np.random.randn(2,4)
result:
array([[ 0.27795239, -2.57882503, 0.3817649 , 1.42367345],
[-1.16724625, -0.22408299, 0.63006614, -0.41714538]])
numpy.random.multivariate_normal()
- 从多元正态分布中随机抽取样本的函数
multivariate_normal(_mean_,_cov_,_size=None_,_check_valid='warn'_,_tol=1e-8_)
数据集随机化
rng.permutation
# 随机生成2000个训练集和1000个测试集
rng = np.random.default_rng()
data_shuffle = rng.permutation(data,axis=0)
#print(data_shuffle)
data_train = data_shuffle[0:2000,:]
data_test = data_shuffle[2000:3000,:]
np.random.shuffle
- 函数shuffle与permutation都是对原来的数组进行重新洗牌(即随机打乱原来的元素顺序);区别在于shuffle直接在原来的数组上进行操作,改变原来数组的顺序,无返回值。而permutation不直接在原来的数组上进行操作,而是返回一个新的打乱顺序的数组,并不改变原来的数组。
简单运算
- 点乘
A.dot(B)
A是numpy的一个变量,所以可以直接用这个方法np.dot(A,B)
是numpy库里的一个函数@
指矩阵乘法,同np.dot()
np.tile()
- 在numpy中,
np.tile(a,(2))
函数的作用就是将函数将函数沿着X轴扩大两倍。如果扩大倍数只有一个,默认为X轴 np.tile(a,(2,1))
第一个参数为Y轴扩大倍数,第二个为X轴扩大倍数。本例中X轴扩大一倍便为不复制。- 也可以使用广播机制
- 在numpy中,
z2 = W1.dot(patches) + np.tile(b1, (10000, 1)).transpose()
z1 = W1.dot(patches) + b1.reshape(196,1)
A.sum(axis=0)
- axis用来指明要进行的运算是沿着哪个轴执行的
- 0是垂直的,列
- 1是水平的,行
- 不写的话,默认全部求和
np.mean()
- 可以写成
a.mean(1)
- axis = 0:压缩行,对各列求均值,返回1 ∗ * ∗n的矩阵
- axis = 1: 压缩列,对各行求均值,返回m ∗ * ∗ 1的矩阵
- 可以写成
np.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None,aweights=None)
- m:一维或则二维的数组,默认情况下每一行代表一个变量(属性),每一列代表一个观测
np.ceil()
向下取整np.linalg.inv()
矩阵的逆det_sigma2 = np.linalg.det(sigma2)
矩阵的行列式X, Y = np.meshgrid(t1, t2)
生成t1行,t2列的网格点,X为横坐标,Y为列坐标x.ravel()
将x变为1维数组np.c_[]
将返回的间隔数值点配对- 生成网格数据:
X, Y = np.meshgrid(t1, t2)
d = np.c_[X.ravel(), Y.ravel()]
np.diagonal(a, offset=0, axis1=0, axis2=1)
取出对角线的元素值
取出特定行列的数
- 希望能取出数组中第三列特定索引的值
data1 = data_train[data_train[:,2]==0]
# 取出第三列等于0的部分
data_train[:,2]==0
# array([ True, False, True, ..., False, False, False])
求数组每一维的长度
- 使用
len()
,第一维的长度:len(array),第二维的长度len(array[0]) - 直接使用
array.shape[]
,第一维的长度:array.shape[0],第二维的长度array.shape[1] - 三维以上数组,用shape
保存数组
- 保存数组文件
np.save("filename.npy",a) # 保存文件
b = np.load("filename.npy") # 读取文件
numpy小tips
- 不确定矩阵维度时,要使用reshape来确保是想要的,时间复杂度是O(1),调用成本极低
- 用
assert
确保是我们想要的shape
- 用
- broadcasting
- 广播机制
- 如果两个数组一个维度的轴长度相同,其中一方的轴长度为1,则认为它们是广播兼容的
- 广播会在缺失维度和轴长度为1的维度上进行
ValueError: operands could not be broadcast together with shapes (196,10000) (196,)
- 注意shape,可以通过reshape来改正
- 一行写不完时
cost = np.sum((h - data) ** 2) / (2 * m) + \
(lambda_ / 2) * (np.sum(W1 ** 2) + np.sum(W2 ** 2)) + \
beta * np.sum(KL_divergence(rho, rho_hat))
matplotlib.pyplot.plot — Matplotlib 3.6.0 documentation
plt.plot(*sample1.T,‘.’,label = ‘sample 1’)
plt.plot(sample2.T,'',label = ‘sample 2’)
matplotlib
画出两类的散点图
# x是横坐标,y是纵坐标,t是标签,共两类,分为0和1
figure(1)
x = data[:, 0]
y = data[:, 1]
t = data[:, 2]
plt.scatter(x, y, c=t)
plt.show()
画方程
python作图之plt.contour详解_你大佬来啦的博客-优快云博客_plt.contour
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 50) # 生成连续数据
y = np.linspace(-3, 3, 50) # 生成连续数据
X, Y = np.meshgrid(x, y)
# 生成能够在坐标系中形成点阵的数组,这个可以去参考一下别的文章
# https://lixiaoqian.blog.youkuaiyun.com/article/details/81532855 这里讲的比较详细
Z = X**2 + Y**2 # 这里将高度设置为x^2+y^2,就能画一个圆形的等高线
C=plt.contour(x, y,Z,[2,5,8,10]) # 画等高线 # 使用plt.contour(X, Y,Z,[2,5,8,10])也是没问题的
plt.clabel(C, inline=True, fontsize=10)
![[Pasted image 20221107200035.png]]
- 生成连续数据
- 生成网格数据,就是我们的变量x和y
- 写方程,写成Z = f(X,Y)
- 生成等高线,当高度为0的时候即为我们的方程
画分界面
可视化技巧:分类问题中的决策面画法 (直观理解plt.contour的用法)_此人姓于名叫罩百灵的博客-优快云博客_plt.contour
# 这里我稍微调整了下plt.contour中的参数,使得结果更好看一点
def plot_decision_boundary(model, x, y):
x_min, x_max = x[:, 0].min() - 0.5, x[:, 0].max() + 0.5
y_min, y_max = x[:, 1].min() - 0.5, x[:, 1].max() + 0.5
h = 0.01
# 绘制网格
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
# 生成与网格上所有点对应的分类结果
z = model(np.c_[xx.ravel(), yy.ravel()])
z = z.reshape(xx.shape)
# 绘制contour
plt.contour(xx, yy, z, levels=[0.5], colors=['blue'])
plt.scatter(x[:, 0], x[:, 1], c=y)