Python机器学习中常用类库的使用

[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
2
3
4
5
%run    #调用并且 加载对应的脚本/方法。
%timeit #只能写一句话!测试 耗费时间
%%timeit #测试下面耗时
%time #测试一句话的cpu和人类感知的实际时间
%%time #测试多行代码耗时

%run? #查看对应方法的 帮助文档

lsmagic #查看当前环境下,所有的魔法命令

numpy.array基础

选择为什么不选择List

Python List 的特点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
L = [i for i in range(10)]
# 像是cell 可以放置多种不同类型的元素在List中。
# List十分灵活
import array
arr = array.array('i',[ i for i in range(10) ])
#array模块是python中实现的一种高效的数组存储类型。它和list相似,但是所有的数组成员必须是同一种类型,在创建数组的时候,就确定了数组的类型
#array.array(typecode,[initializer]) --typecode:元素类型代码;initializer:初始化器,若数组为空,则省略初始化器
arr = array.array('i',[0,1,1,3])
print(arr)
#array('i', [0, 1, 1, 3])

#array.typecode -- 对象属性
print('\n 输出 用于创建数组的类型代码字符:')
print(arr.typecode)
# 输出 用于创建数组的类型代码字符:
#i

区别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 NOT X
    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
    A
    B 是指对应元素及进行运算! 不是标准矩阵之间惩罚
  • 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
2
3
4
5
6
7
8
9
l1, l2 = -1, 1

X_new = np.empty((len(x), 2))
# 将一维数据 映射到二维上面了,利用 高斯核函数.
for i, data in enumerate(x):
X_new[i, 0] = gaussian(data, l1)
X_new[i, 1] = gaussian(data, l2)

# enumerate( x ) 讲x的数值放入到data中,索引放入到i中.

关键学会 enumerate的使用。

读取数据和简单的数据探索

  • from sklearn import datasets
  • iris = datasets.load_iris() # 鸢尾花数据集
  • iris.keys()
  • iris.data #相对应的数据
  • iris.target #相对应的种类
    1
    2
    3
    4
    5
    6
    y = 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

(っ•̀ω•́)っ✎⁾⁾ 坚持技术学习、内容输出与分享,您的支持将鼓励我继续创作!(*/ω\*)
( • ̀ω•́ )✧如有疑问或需要技术讨论,请留言或发邮件到 aclearzhang@qq.com.(*・ω< )