[机器学习] 简单的机器学习算法和sklearn实现
机器学习基础算法理解和总结
KNN算法
理解
KNN其实是最好理解的算法之一,其实就是依次和空间中的每个点进行距离比较,取距离最近的N个点,看这N个点的类别,那么要判断的点的类别就是这N个点中类别占比最大的点的类别了(投票表决),这就是暴力的KNN方法。还有一种是通过构造kd树的方式实现。kd树算法并没有从一开始就去计算测试样本和训练样本之间的距离,而是先去训练构造一个kd树,然后用kd树对测试样本进行预测(平衡二叉树)。
实现步骤
对于分类问题,实现步骤为
- 不需要训练,需要提供超参数k
- 取样本空间D中离测试样本最近的k个点
- 投票决定测试样本的类别
对于回归问题,实现步骤为
- 不需要训练,需要提供超参数k
- 取样本空间D中离测试样本最近的k个点
- 取k点的均值为预测值
补充
关于距离:
- 欧式距离
- Mahalanobis距离:给定向量x、y以及矩阵S,其定义为
当S为单位矩阵的时候,其距离描述的就是欧式距离,为了求出矩阵S,引出了距离度量学习。(S也可以由样本的协方差矩阵得到,但准确率可能不一样)。 - Bhatlacharyya距离:
,其中 xi和yi为取某一值的概率。
代码实验
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 7 13:24:30 2018
@author: ar45
"""
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
iris = datasets.load_iris()#加载训练集
X = iris.data#数据集
y = iris.target#结果
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)#测试集和训练集划分
#print(X_train[1:3,:])
knn = KNeighborsClassifier(4,weight="uniform")
#加载分类器,让k=4,分配权重方式为uniform,也就是权重相等,weights = 'distance'表示的是权重与距离成反比
knn.fit(X_train,y_train)# 开始训练
result = knn.predict(X_test)# 在测试集上预测结果
print(np.mean(result==y_test))#对比测试集的结果和预测结果,得到准确率
'''
输出结果
0.9777777777777777
'''
决策树
理解
决策树其实是基于信息论的算法,通过递归实现训练决策的节点。我只学习了ID3、C4.5和CART算法,所以会记录这三种算法,刚学了概率论,对这里的理解更深了。
先验知识
ID3算法
信息熵
就这么一个公式,其中pi代表是结果的概率。
信息增益
定义条件熵为:
那么前者信息熵与条件熵的差值就是信息增益,表征的是信息的该变量。
C4.5算法
信息增益率
用信息增益率来表征信息变化的多少
CART算法
Gini指数
其中pk指的是结果中第k个类别的概率。公式表征的是不纯度大小,越纯Gini指数越小。
这里是针对离散量的也就是分类问题的loss度量公式,如果是回归问题就要用均方误差来衡量了。具体的不讨论。
学习过程
- 先用样本构造根节点,找到用哪个label怎么分,使得信息增益或者不纯度更小(为不纯度的时候,得到分别的不纯度,也就是左右子树不纯度按照样本数量权重求和),并设计阈值,小于阈值并且最小的分裂方式就最为最佳分裂方式,否则就不分裂。
- 将样本集划分为左右子树,分别将左右叶节点设为本节点在训练样本中出现最大的子类。
- 递归进行分裂,直到不纯度都小于阈值停止迭代,训练完成。
剪枝
决策树算法很容易再训练集上过拟合,所以我们采用剪枝的方法来防止其过拟合。
假设我们已经完成了上面的学习过程生成了一颗决策树,下面我们将对其进行剪枝操作:
- 在上面的决策树基础上生成所有可能的剪枝后的决策树(说白了就是一个一个剪掉或者留下这样试),从叶节点开始自下而上进行考察。
- 通过交叉验证的方法在数据集上进行验证,看看剪枝后的该节点处验证准确率是否有提升
- 如果有提升,则保留剪枝后的树;如果有下降,则保留原节点。循环对所有节点进行上面操作。
预测过程
很好理解,就是树状分类器满足一定条件往哪个方向分,相当于if then的结构。
代码实验
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 7 13:24:30 2018
@author: ar45
"""
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import tree
import numpy as np
import graphviz
digits = datasets.load_digits()
X = digits.data
y = digits.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)
cls = tree.DecisionTreeClassifier()
cls.fit(X_train,y_train)
r = cls.predict(X_test)
print(np.mean(r==y_test))
dot_data = tree.export_graphviz(cls,out_file="e:/A.dot")#输出到A.dot
'''
输出结果:
8462962962962963
'''
可视化代码:
dot -Tpdf a.dot -o output.pdf
可视化结果:
朴素贝叶斯
朴素贝叶斯主要是利用贝叶斯公式通过特征进行预测的方法,其假设是各个特征之间是相互独立的。
朴素贝叶斯利用的贝叶斯公式为
,其中条件概率公式为
实现步骤
1. 求先验概率
利用极大似然估计法证明和求解(离散数据利用频数处以总数直接求频率),连续数据一般假设服从正态分布,求出u和σ,并且加入平滑项(拉普拉斯平滑),保证在某些类别在样本中没出现的时候,公式中概率不为0.
2. 朴素贝叶斯推断过程
朴素贝叶斯推断是根据后验概率公式,分别求各类的推断的概率,最后投票选取概率最大的类别进行输出。
3.代码实验
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 7 13:24:30 2018
@author: ar45
"""
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
import numpy as np
wine = datasets.load_wine()
X = wine.data
y = wine.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)
cls = GaussianNB()
cls.fit(X_train,y_train)
r = cls.predict(X_test)
print(np.mean(r==y_test))
'''
这里假设概率服从的是高斯分布。
输出结果:
0.9629629629629629
'''
Logistic回归
理解
logistic 回归,虽然名字里有 “回归” 二字,但实际上是解决分类问题的一类线性模型。
逻辑函数
,可以将结果映射到(0,1)的区间上去,相当于输出了一个概率值(概率映射)。
公式过程理解
- 对n个label下的样本集,用W矩阵表示学习的权重,用wTx矩阵相乘之后可以得到每个样本对应的估计值,将逻辑函数中的x替换成wTx + b,结果就被映射成了概率。
- 由于结果被映射成了一个概率值,我们就可以通过极大似然估计的方法,使得在每个样本集的条件下对应真实输出的概率最大,求得此时的参数估计W。
- 由于我们将h(x)的结果映射成了P(y=1|x)的概率值,y的取值不是0就是1,那就简单了,可以写成这样的形式:
,其表示的是每个样本对应每个类别的概率。 - 由于样本之间相互独立,样本训练集的似然函数为
,求他的对数似然函数的最大值,转化为求其相反数的最小值,就又转化为了一个凸优化问题。 - 对于凸优化问题,我们就可以用传统的梯度下降法来求解这个问题了。
代码实验
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 7 13:24:30 2018
@author: ar45
"""
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.linear_model.logistic import LogisticRegression
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)
cls = LogisticRegression()
cls.fit(X_train,y_train)
print(cls.score(X_test,y_test))
# 代码都是一样的。。。
'''
0.9777777777777777
'''
[机器学习] 简单的机器学习算法和sklearn实现的更多相关文章
- sklearn简单实现机器学习算法记录
sklearn简单实现机器学习算法记录 需要引入最重要的库:Scikit-learn 一.KNN算法 from sklearn import datasets from sklearn.model_s ...
- 机器学习入门 一、理解机器学习+简单感知机(JAVA实现)
首先先来讲讲闲话 如果让你现在去搞机器学习,你会去吗?不会的话是因为你对这方面不感兴趣,还是因为你觉得这东西太难了,自己肯定学不来?如果你觉的太难了,很好,相信看完这篇文章,你就会有胆量踏入机器学习这 ...
- 使用Apriori算法和FP-growth算法进行关联分析
系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...
- web安全之机器学习入门——2.机器学习概述
目录 0 前置知识 什么是机器学习 机器学习的算法 机器学习首先要解决的两个问题 一些基本概念 数据集介绍 1 正文 数据提取 数字型 文本型 数据读取 0 前置知识 什么是机器学习 通过简单示例来理 ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- BM算法和Sunday快速字符串匹配算法
BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J St ...
- 台球游戏的核心算法和AI(2)
前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合htm ...
- mahout中kmeans算法和Canopy算法实现原理
本文讲一下mahout中kmeans算法和Canopy算法实现原理. 一. Kmeans是一个很经典的聚类算法,我想大家都非常熟悉.虽然算法较为简单,在实际应用中却可以有不错的效果:其算法原理也决定了 ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
随机推荐
- VMWare安装Ubuntu 16.04
1.Ubuntu安装文件下载 到Ubuntu官网下载安装包,有Bit Torrent.Network installer多种方式下载. 推荐使用中国地区的镜像下载,我是用华科的校园网下载速度是非常感人 ...
- 【转】mysql数据库的数据类型
一.数值类型 Mysql支持所有标准SQL中的数值类型,其中包括: 严格数据类型(INTEGER,SMALLINT,DECIMAL,NUMBERIC ...
- 从扫码支付想到的超级APP主宰一切,数据!数据!还是数据!
前言 做室内定位的人其实内心都明白:基于指纹方法的移动端定位,无论paper每年出来多少,距离真正的大规模应用的距离还有多么遥远.指纹采集,指纹更新,似乎在生产实践上就是不可能的难题.所有还在基于人工 ...
- JavaScript巩固篇(一)——数据类型与全局变量、局部变量、垃圾回收机制、存储方式、生命周期
知识要点 数据类型 存储方式 全局变量与局部变量 变量的生命周期 垃圾回收机制 知识概览 数据类型 JavaScript的数据类型分为:基本类型.引用类型 本质区别: 基本数据类型的变量实际值存储在栈 ...
- Mac安装python细节
前言 之前在windows平台上安装python直接用Anaconda,优点是所有的科学计算的库都整合进去了,安装方便.在Mac系统下,当然也可以直接安装Anaconda,但是考虑到Mac会自带pyt ...
- linux端口netstat
netstat -aptn命令行,查看所有开启的端口号 netstat -nupl 查看所有udp端口号 netstat -ntpl 查看所有tcp端口号 查看某服务占用的端口情况,比 ...
- JS高级学习历程-14
昨天内容回顾 1. 面向对象的私有成员.静态成员 私有成员:在构造函数里边定义局部变量,就是私有成员. 静态成员:在js里边,函数就是对象,可以通过给函数对象声明成员方式声明静态成员. 2. 原型继承 ...
- 浅谈最近公共祖先(LCA)
LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. (来自百度百科) 一.倍增求LCA 预处理出距点u距离为2^0,2^1,2 ...
- 题解 P1004 方格取数
传送门 动态规划Yes? 设i为路径长度,(为什么i这一维可以省掉见下)f[j][k]表示第一个点到了(j,i-j),第二个点到了(k,j-k) 则 int ji=i-j,ki=i-k; f[j][k ...
- Codeforces Round #563 (Div. 2) A. Ehab Fails to Be Thanos
链接:https://codeforces.com/contest/1174/problem/A 题意: You're given an array aa of length 2n2n. Is it ...