机器学习


引言

学习问题:如果一个计算机针对某类任务T的用P衡量的性能根据经验E来自我完善,那么我们称这个计算机程序在从经验E中学习,针对某类任务T,它的性能用P来衡量。

  • 训练错误
  • 测试集错误
  • 评测指标
    • 准确率
    • 召回率
    • 平方误差等

一、概念学习

概念:可被看作一个对象或事件集合(或:这个较大集合中定义的布尔函数)。

概念学习:给定某一类别的若干正例和反例,从中 获得 该类别的 一般定义

变型空间:与训练样例一致的所有假设组成的集合,表示了目标概念的所有合理的变型

一般边界G:假设空间H和训练数据D相一致的 极大一般 成员的集合。
特殊边界S:假设空间H和训练数据D相一致的 极大特殊 成员的集合。

  • 机器学习的目标是寻找一个假设h,使得对所有的x,都有 h(x) = c(x)

  • 表示假设

    • 形式:实例的 各属性约束的合取式
    • 属性范围:
      • 本属性可接收任意值
      • 不接受任何值
      • 指定的属性值
  • 搜索目标假设

    • 在预定义的假设空间中搜索假设,使其与训练样例有最佳的拟合
    • 利用假设空间的偏序结构(偏序:自反的,反对称的,传递的)
  • 概念学习的方法

    • Find-S:寻找极大特殊假设
    • candidate-elimination,候选消除算法
      • 变型空间被表示为极大一般和极大特殊的成员
      • 输出与训练样例一致的所有假设的集合
  • 无偏学习的无用性:学习器如果不对目标概念的形式做预先的假定,它从根本上无法对未见实例进行分类。

  • 归纳学习需要预先假定,称为归纳偏置

    • 无偏的较大空间,有偏的算法(如梯度下降)
    • 有偏的较小空间,,,穷尽搜索
  • 一种算法的有偏性越强,他的归纳能力越强,可以分类更多的未见实例。

一些理解

特殊:属性可接收的值,变得越来越少,? -> 指定值 ->

二、决策树学习

决策树:通过实例从根节点排列到某个子节点来分类实例。

  • 对空间划分,最后的树完备互斥
  • 叶子节点,为实例所属的分类
  • 每个节点,说明了对实例的某个属性的测试
  • 节点的每个后继分支,对应于属性的一个可能值

决策树代表实例属性值约束的合取的析取式

  • 基本的决策树学习算法
    • 特征选择
    • 决策树构建
    • 决策树后修剪

gap较高时,可能发生过度拟合(over-fitting)

$$E_{test}=E_{test}+\underbrace{(E_{train}-E_{test})}_{gap}$$

过拟合

学习时选择的模型所包含的参数过多,以至出现这一模型对已知数据预测得很好,但对未知数据预测得差的现象。

//信息增益比率

三、贝叶斯学习

$P(D)$表示训练数据D的先验概率, $P(D|h)$表示h成立时D的概率,称为似然概率(似然度)

贝叶斯公式

$$P(h|D)=/frac{P(D|h)P(h)}{P(D)}$$

极大后验假设MAP

四、KNN

$K-NearestNeighbor$,每个样本都可以用它最近的K个近邻值来代表。

基本步骤:

  1. 准备数据,数据预处理
  2. 计算测试样本点到其它样本点的距离
  3. 在各个距离中选出最小的K个
  4. 将测试样本点归入K个中的最大类
class KNN:
    def __init__(self, X_train, y_train, n_neighbors=3, p=2):
        """
        parameter: n_neighbors 临近点个数
        parameter: p 距离度量
        """
        self.n = n_neighbors
        self.p = p
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X):
        # 取出n个点
        knn_list = []
        for i in range(self.n):
            dist = np.linalg.norm(X - self.X_train[i], ord=self.p)
            knn_list.append((dist, self.y_train[i]))

        for i in range(self.n, len(self.X_train)):
            max_index = knn_list.index(max(knn_list, key=lambda x: x[0]))
            dist = np.linalg.norm(X - self.X_train[i], ord=self.p)
            if knn_list[max_index][0] > dist:
                knn_list[max_index] = (dist, self.y_train[i])

        # 统计
        knn = [k[-1] for k in knn_list]
        count_pairs = Counter(knn)
#         max_count = sorted(count_pairs, key=lambda x: x)[-1]
        max_count = sorted(count_pairs.items(), key=lambda x: x[1])[-1][0]
        return max_count

    def score(self, X_test, y_test):
        right_count = 0
        n = 10
        for X, y in zip(X_test, y_test):
            label = self.predict(X)
            if label == y:
                right_count += 1
        return right_count / len(X_test)

六、感知机

感知机时神经网络的起源算法,感知机接受多个输入信号,输出一个信号,
这里的信号可以理解为电流样“流动性”的东西,输入信号配以权重,用阈值$\theta$判定这个神经元是否被激活。

$$f(x;\theta)=sign(w\cdot x+b)$$
w: n维权重向量
b: 偏置
sign: 符号函数
H: 所有线性函数的集合

线性可分性、

七、SVM

八、集成学习

九、logistic回归与Softmax

二分类、多分类

十、神经网络与深度学习基础

作业代码

二:概念学习中的Find-S算法和候选消除算法

三:决策树

四:朴素贝叶斯

五:K 近邻

六:感知机

七:支持向量机

八:文本分类

九:逻辑回归的梯度下降算法

十:集成学习


文章作者: ╯晓~
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ╯晓~ !
评论
  目录