慕课网机器学习笔记(1)

内容提要


一些专有名词

  • 数据集(data set) 数据的整体
  • 样本(sample) 每一行的数据
  • 特征(feature) 除最后一列,每一列所表达的信息
  • 标记(label) 最后一列



机器学习的分类

监督学习

给机器训练的数据拥有“标记”或“答案”

  • 分类任务

    • 二分类
    • 多分类 数字识别,图像识别
    • 多标签分类
  • 回归任务:结果是一个连续数字的值,而非一个类别

    • 房屋的价格

非监督学习

对没有标记的数据进行分类-聚类分析,对数据进行降维处理

  • 特征提取:信用评级和胖瘦
  • 特征压缩:PCA算法,对数据进行降维处理
  • 异常检查:不符合数据集的一般性特征

半监督学习

标记缺失,先对数据集进行非监督学习排除异常项,之后再进行监督学习


增强学习

根据采取行动的结果,学习行动方式


其他的分类

  • 批量学习:对大量的数据进行分析,缺点是无法适应环境变化
  • 在线学习:及时反映新环境变化,缺点是新数据可能带来不好的变化

  • 参数学习:Parametric Learning 学习参数:线性 y=ax+b,对问题进行建模

  • 非参数学习:Nonparametric Learning

对学习算法选取的原则

奥卡姆剃刀(简单的就是好的)


学习环境的安装

使用集成开发环境anaconda,集成了python机器学习的相关库以及一些开发工具,比如Jupyter notebook,自动配置环境变量,安装成功界面如下

选择第二个启动Web版Jupyter notebook,选择一个路径新建notebook,一个新的以ipynb为后缀的文件将被创建

使用pycharm CE IDE进行python开发,社区版足以胜任python机器学习相关开发。新建工程的时候注意选用anaconda内置的python,否则无法使用相关的机器学习库


Jupyter notebook的一些使用技巧

相关运行指令

  • 使用%run来运行本地文件
  • 使用import引入模块,和普通的python语法一样,可以随意随地引入模块,比较灵活

测试指令

  • %timeit 测试运行时间,会执行多次指令

  • %time 测试指令只运行一次的时间

  • %%timeit 测试程序块运行时间,会多次测试

  • %%time 测试程序块运行一次的时间


numpy对于矩阵的基本操作

1
2
'''先引入numpy模块,并自定义模块名'''
import numpy as np

生成矩阵

  • 根据list生成整型一维矩阵
1
2
3
4
5
np.array([1,2,3,4])
# array([1, 2, 3, 4])

np.array([i for i in range(10)])
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
  • 根据list生成浮点型一维矩阵
1
2
np.array([1,2,3, 4.0])
# array([1., 2., 3., 4.])
  • 自定义维度零矩阵,默认是类型float64,通过dtype设置类型
1
2
3
4
np.zeros(shape=[3,5], dtype=int)
# array([[0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0]])
  • 自定义维度一矩阵,默认是类型float64,通过dtype设置类型
1
2
3
4
np.ones(shape=[3,5], dtype=int)
# array([[1, 1, 1, 1, 1],
# [1, 1, 1, 1, 1],
# [1, 1, 1, 1, 1]])
  • 自定义维度自定义n矩阵,通过fill_value设置n
1
2
3
4
np.full(shape=[3,5], fill_value=666.0)
# array([[666., 666., 666., 666., 666.],
# [666., 666., 666., 666., 666.],
# [666., 666., 666., 666., 666.]])
  • 指定步长的一维矩阵,前闭后开
1
2
np.arange(start=0, stop=5, step=0.5)
# array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
  • 制定段数,起点,终点的一维矩阵
1
2
3
np.linspace(start=0, stop=20, num=10)
# array([ 0. , 2.22222222, 4.44444444, 6.66666667, 8.88888889,
# 11.11111111, 13.33333333, 15.55555556, 17.77777778, 20. ])
  • 生成随机整型矩阵,前闭后开
1
2
3
np.random.randint(low=0, high=10, size=[2,3])
# array([[0, 5, 9],
# [7, 2, 3]])
  • 生成随机浮点型矩阵,[0, 1),均匀分布
1
2
3
np.random.random(size=[2,3])
# array([[0.20563368, 0.87398834, 0.42730182],
# [0.02330145, 0.86551274, 0.13535112]])
  • 数学期望,均值为0,方差为1
1
2
np.random.normal()
# -0.0596168406592007
  • 数学期望,均值为10,方差为100
1
2
3
np.random.normal(10, 100, size=[2,3])
# array([[ -28.77946605, 86.25440072, -121.67334245],
# [ 47.71220376, -31.4960128 , 80.58300816]])

查看矩阵

1
2
3
4
5
6
''' 预定义一个一维矩阵一个二维矩阵 '''
x = np.arange(6)
# array([0, 1, 2, 3, 4, 5])
X = np.arange(6).reshape([2,3])
# array([[0, 1, 2],
# [3, 4, 5]])
  • 矩阵数据类型
1
2
3
NA = np.array([1,2,3, 4.0])
NA.dtype
# dtype('float64')
  • 矩阵维度
1
2
3
4
x.ndim
# 1
X.ndim
# 2
  • 矩阵形状
1
2
3
4
x.shape
# (6,)
X.shape
# (2, 3)
  • 矩阵大小
1
2
3
4
x.size
# 6
X.size
# 6
  • 访问多维矩阵指定点
1
2
3
4
X[(1,2)]
# 5
X[1,2]
# 5
  • 倒序访问单个点
1
2
x[-1]
# 5
  • 顺序访问指定连续点
1
2
x[0:5]
# array([0, 1, 2, 3, 4])
  • 顺序访问,指定结束点
1
2
x[:5]
# array([0, 1, 2, 3, 4])
  • 顺序访问,指定起始点
1
2
x[5:]
# array([5])
  • 顺序间隔访问点
1
2
x[::2]
# array([0, 2, 4])
  • 倒序访问全部点
1
2
x[::-1]
array([5, 4, 3, 2, 1, 0])
  • 截取部分二维矩阵
1
2
3
4
X[:2,:2]
# 两行两列
# array([[0, 1],
# [3, 4]])
  • 截取第一行
1
2
X[0, :]
# array([0, 1, 2])
  • 截取第一列
1
2
X[:, 0]
# array([0, 3])

基础操作矩阵

1
2
3
4
5
6
''' 预定义一个一维矩阵一个二维矩阵 '''
x = np.arange(6)
# array([0, 1, 2, 3, 4, 5])
X = np.arange(6).reshape([2,3])
# array([[0, 1, 2],
# [3, 4, 5]])
  • 倒置矩阵
1
2
3
X[::-1, ::-1]
# array([[5, 4, 3],
# [2, 1, 0]])
  • 将一维矩阵变形成二维
1
2
3
x.reshape([2,3])
# array([[0, 1, 2],
# [3, 4, 5]])
  • 对numpy.arange进行切变后的结果和源数据共享内存,若想完全复制需要使用copy方法
1
2
3
X[:2, :2].copy()
# array([[0, 1],
# [3, 4]])
  • 升维,只要求有两列,只要求行的同理
1
2
3
4
x.reshape(-1, 2)
# array([[0, 1],
# [2, 3],
# [4, 5]])
  • 列向量变为行向量
1
2
3
ll = np.array([[0],[1],[2]])
ll[:, 0]
# array([0, 1, 2])

拼拆矩阵

1
2
3
4
5
6
7
'''预定义两个二维矩阵'''
XX = np.full(shape=[2,3], fill_value=233)
# array([[233, 233, 233],
# [233, 233, 233]])
YY = np.full(shape=[2,3], fill_value=666)
# array([[666, 666, 666],
# [666, 666, 666]])
  • 列合并
1
2
3
np.concatenate([XX, YY], axis=1)
# array([[233, 233, 233, 666, 666, 666],
# [233, 233, 233, 666, 666, 666]])
  • 行合并
1
2
3
4
5
np.concatenate([XX, YY], axis=0)
# array([[233, 233, 233],
# [233, 233, 233],
# [666, 666, 666],
# [666, 666, 666]])
  • 一维矩阵分割
1
2
3
4
5
6
SS = np.arange(10)
s1, s2, s3, s4 = np.split(SS, [3, 6, 8])
# s1 array([0, 1, 2])
# s2 array([3, 4, 5])
# s3 array([6, 7])
# s4 array([8, 9])
  • 二维矩阵,行分割
1
2
3
np.split(YY, [1], axis=0)
# [array([[666, 666, 666]]),
# array([[666, 666, 666]])]
  • 二维矩阵,列分割
1
2
3
np.split(YY, [1], axis=1)
# [array([[666],[666]]),
# array([[666, 666],[666, 666]])]
  • 矩阵和向量合并,行
1
2
3
4
5
6
7
xx = np.array([1,2,3])
np.concatenate([XX,np.reshape(xx, (1, -1))])
# 或
np.vstack([XX,xx])
# array([[233, 233, 233],
# [233, 233, 233],
# [ 1, 2, 3]])
  • 矩阵和向量合并,列
1
2
3
4
5
6
yy = np.array([[1],[2]])
np.concatenate([XX, yy], axis=1)
# 或
np.hstack([XX, yy])
# array([[233, 233, 233, 1],
# [233, 233, 233, 2]])