# AILearning **Repository Path**: cjfjack/AILearning ## Basic Information - **Project Name**: AILearning - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README - [监督学习](#监督学习) - [线性回归](#线性回归) - [分类](#分类) - [logistic](#logistic回归) - [KNN-近邻算法](#KNN-近邻算法) - [决策树](#决策树) - [朴素贝叶斯](#朴素贝叶斯) - [支持向量机](#支持向量机) # 监督学习 ## 线性回归 说到回归,一般都是指 线性回归(linear regression)。线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。 回归系数公式: ![AI](https://raw.githubusercontent.com/CJFJack/AILearning/master/line_regression/pic/line_regression_w.png) ## 分类 ### logistic回归 #### 须知概念 - Sigmoid函数 - 回归概念: 用一条直线拟合一些数据点,这条直线叫作最佳拟合直线,这个过程称为回归 - 二值型输出分类函数 - 函数公式: ![AI](https://raw.githubusercontent.com/CJFJack/AILearning/master/classfy/logistic_regression/pic/sigmoid_expression.png) - 函数图像: ![AI](https://raw.githubusercontent.com/CJFJack/AILearning/master/classfy/logistic_regression/pic/sigmoid_chart.png) - 基于最优方法的回归系数确定 - 令函数输入 z 等于: ![AI](https://raw.githubusercontent.com/CJFJack/AILearning/master/classfy/logistic_regression/pic/best_param.png) - 其中 x 是分类器的输入数据,w 为要求的最佳参数 - 梯度上升法(梯度下降法) #### 工作原理 ```angular2html 每个回归系数初始化为 1 重复 R 次: 计算整个数据集的梯度 使用 步长 x 梯度 更新回归系数的向量 返回回归系数 ``` #### 项目案例1: 使用 Logistic 回归在简单数据集上的分类 完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/5.Logistic/logistic.py 项目概述 在一个简单的数据集上,采用梯度上升法找到 Logistic 回归分类器在此数据集上的最佳回归系数 #### 项目案例2: 从疝气病症预测病马的死亡率 完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/5.Logistic/logistic.py 项目概述 使用 Logistic 回归来预测患有疝病的马的存活问题。疝病是描述马胃肠痛的术语。然而,这种病不一定源自马的胃肠问题,其他问题也可能引发马疝病。这个数据集中包含了医院检测马疝病的一些指标,有的指标比较主观,有的指标难以测量,例如马的疼痛级别。 ### KNN-近邻算法 - 小结: 监督学习 - 基本原理: 通过距离度量来计算查询点(query point)与每个训练数据点的距离,然后选出与查询点(query point)相近的K个最邻点(K nearest neighbors),使用分类决策来选出对应的标签来作为该查询点的标签。 - KNNN三要素: - K值:k值小的时候 近似误差小,估计误差大。 k值大 近似误差大,估计误差小。可使用交叉验证(cross validation,即使用一部分训练数据作为测试数据,统计错误率)选择合适的值 - 距离度量 Metric/Distance Measure:通常为 欧式距离(Euclidean distance),还可以是 Minkowski 距离 或者 曼哈顿距离。也可以是 地理空间中的一些距离公式 - 分类决策 (decision rule):分类决策 在 分类问题中 通常为通过少数服从多数 来选取票数最多的标签,在回归问题中通常为 K个最邻点的标签的平均值 #### KNN项目案例1: 优化约会网站的配对效果 完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py3.x/ml/2.KNN/kNN.py 项目概述: 海伦使用约会网站寻找约会对象。经过一段时间之后,她发现曾交往过三种类型的人: - 不喜欢的人 - 魅力一般的人 - 极具魅力的人 #### 开发流程 ``` 收集数据:提供文本文件 准备数据:使用 Python 解析文本文件 分析数据:使用 Matplotlib 画二维散点图 训练算法:此步骤不适用于 k-近邻算法 测试算法:使用海伦提供的部分数据作为测试样本。 - 测试样本和非测试样本的区别在于: - 测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。 使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否为自己喜欢的类型。 ``` #### KNN项目案例2: 手写数字识别系统 完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py3.x/ml/2.KNN/kNN.py 项目概述: 构造一个能识别数字 0 到 9 的基于 KNN 分类器的手写数字识别系统。 需要识别的数字是存储在文本文件中的具有相同的色彩和大小:宽高是 32 像素 * 32 像素的黑白图像。 ##### 开发流程 ```angular2html 收集数据:提供文本文件。 准备数据:编写函数 img2vector(), 将图像格式转换为分类器使用的向量格式 分析数据:在 Python 命令提示符中检查数据,确保它符合要求 训练算法:此步骤不适用于 KNN 测试算法:编写函数使用提供的部分数据集作为测试样本,测试样本与非测试样本的 区别在于测试样本是已经完成分类的数据,如果预测分类与实际类别不同, 则标记为一个错误 使用算法:本例没有完成此步骤,若你感兴趣可以构建完整的应用程序,从图像中提取 数字,并完成数字识别,美国的邮件分拣系统就是一个实际运行的类似系统 ``` ### 决策树 #### 须知概念 - 信息熵(entropy):是一种信息的度量方式,指的是信息的混乱程度,信息越有序,信息熵值越低,反之越高 - 信息增益(information gain):在划分数据集前后信息发生的变化称为信息增益 ### 定义 一种对实例进行分类的属性结构 ### 组成 - 结点(node) - 内部结点(internal node):表示实例的一种特征或属性,即没有到达最后子结点的结点 - 叶结点(leaf node):表示实例的分类,即最后的子结点 - 有向边(directed edge) ### 开发流程 ```angular2html 收集数据:可以使用任何方法。 准备数据:树构造算法 (这里使用的是ID3算法,只适用于标称型数据,这就是为什么数值型数据必须离散化。 还有其他的树构造算法,比如CART) 分析数据:可以使用任何方法,构造树完成之后,我们应该检查图形是否符合预期。 训练算法:构造树的数据结构。 测试算法:使用训练好的树计算错误率。 使用算法:此步骤可以适用于任何监督学习任务,而使用决策树可以更好地理解数据的内在含义。 ``` #### 项目案例1: 判定鱼类和非鱼类 项目概述 根据以下 2 个特征,将动物分成两类:鱼类和非鱼类。 特征: 1. 不浮出水面是否可以生存 2. 是否有脚蹼 完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/3.DecisionTree/DecisionTree.py 开发流程 ```angular2html 收集数据:可以使用任何方法 准备数据:树构造算法(这里使用的是ID3算法,因此数值型数据必须离散化。) 分析数据:可以使用任何方法,构造树完成之后,我们可以将树画出来。 训练算法:构造树结构 测试算法:使用习得的决策树执行分类 使用算法:此步骤可以适用于任何监督学习任务,而使用决策树可以更好地理解数据的内在含义 ``` 计算香农熵公式: ![AI](https://raw.githubusercontent.com/CJFJack/AILearning/master/classfy/decision_tree/shannong.jpg) ### 朴素贝叶斯 利用贝叶斯公式进行分类:给定某个由 x、y 表示的数据点,那么该数据点来自类别 c1 的概率是多少?数据点来自类别 c2 的概率又是多少?记为p(c1|x, y) 和 p(c2|x, y),注意这些概率与概率 p(x, y|c1) 并不一样,不过可以使用贝叶斯准则来交换概率中条件与结果。具体地,应用贝叶斯准则得到: ![AI](https://raw.githubusercontent.com/CJFJack/AILearning/master/classfy/bayes/bayes.png) #### 项目案例1: 屏蔽社区留言板的侮辱性言论 完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/4.NaiveBayes/bayes.py 项目概述 构建一个快速过滤器来屏蔽在线社区留言板上的侮辱性言论。如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当。对此问题建立两个类别: 侮辱类和非侮辱类,使用 1 和 0 分别表示。 #### 项目案例2: 使用朴素贝叶斯过滤垃圾邮件 完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/4.NaiveBayes/bayes.py 项目概述 完成朴素贝叶斯的一个最著名的应用: 电子邮件垃圾过滤 #### 项目案例3: 使用朴素贝叶斯分类器从个人广告中获取区域倾向 完整代码地址: https://github.com/apachecn/AiLearning/blob/master/src/py2.x/ml/4.NaiveBayes/bayes.py 项目概述 广告商往往想知道关于一个人的一些特定人口统计信息,以便能更好地定向推销广告。 我们将分别从美国的两个城市中选取一些人,通过分析这些人发布的信息,来比较这两个城市的人们在广告用词上是否不同。如果结论确实不同,那么他们各自常用的词是哪些,从人们的用词当中,我们能否对不同城市的人所关心的内容有所了解。 文档词袋模型 我们将每个词的出现与否作为一个特征,这可以被描述为 词集模型(set-of-words model)。 如果一个词在文档中出现不止一次,这可能意味着包含该词是否出现在文档中所不能表达的某种信息,这种方法被称为 词袋模型(bag-of-words model)。 ### 支持向量机 #### 概念 支持向量机(Support Vector Machines, SVM)是一种监督学习算法 - 支持向量(Support Vector)指的是离分隔超平面最近的那些点 - 机(Machines)指的是算法,不是机器 #### 使用场景 - 要给左右两边的点分类 - 明显选择D会比B、C的分隔效果好很多 ![AI](https://raw.githubusercontent.com/CJFJack/AILearning/master/classfy/SVM/pic/bayes.png) #### 工作原理 - 如果数据可以用一条直线完全分开,那么这些数据就叫做线性可分(linearly separable)数据,这条直线叫做分隔超平面(separting hyperplane) - 如果线性可分数据有N维,这需要用N-1个对象来分隔,这些对象就是分类决策边界,也就是超平面(hyperplane)