python有监督神经网络程序实例_学习编程|监督学习是什么?怎么用?Python机器学习基础笔记二...

一、机器学习基础概念

1.机器学习分类

机器学习分为:监督学习、无监督学习、半监督学习等几类。

(1)监督学习:从给定的训练数据集中学习出一个函数,当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求是包括输入和输出,也可以说是特征和目标。训练集中的目标是由人标注的。常见的监督学习算法包括回归分析和统计分类。

(2)无监督学习:与监督学习相比,训练集没有人为标注的结果。常见的无监督学习算法有聚类。

(3)半监督学习:是监督学习和无监督学习相结合的一种学习方法。它主要考虑如何利用少量的样本标注和大量的未标注样本进行训练和分类的问题。半监督学习对于减少标注代价,提高学习机器性能具有非常大的实际意义。

2.监督学习的研究内容

监督学习主要研究的两块内容是分类和回归,即分类和回归归属于监督学习的范畴:

(1) 分类:在监督学习中,如果预测的变量是离散的(例如 -1,+1 这种)我们就称为分类。常见的分类算法有:决策树,K近邻算法(KNN),朴素贝叶斯,支持向量机(SVM),神经网络,Logistic回归等。

(2) 回归:在监督学习中,如果预测的变量是连续的,就称其为回归。在回归分析中如果只包含一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归称为一元线性回归。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归。回归和分类的主要区别是预测的值域不一样,分类常用算法大多也适用于回归。

3.开发机器学习应用程序的步骤:

(1) 收集数据。

(2) 准备输入数据:不同的算法对数据的格式要求可能不同,所以有时需要对收集的数据进行格式转换。

(3) 分析输入数据:这一步只要通过观察来确保数据集中没有垃圾数据。

(4) 训练算法:机器学习算法从这一步才真正的开始学习,主要的通过特定的训练集输入到分类算法,确定算法模型的过程。

(5) 测试算法:用于检测训练算法阶段训练出来的模型是否靠谱,通常使用已知目标值的样本作为输入,观察其准确率。

(6) 使用算法:将机器学习算法转换为应用程序,执行实际任务。

二、监督学习常用算法

K-近邻算法(KNN):

简述:简单的说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。工作原理是:存在一个训练样本集,且样本集中的每个数据都存在类别标签。将待预测类别的一条数据输入,计算这条数据与训练样本集中数据的距离(距离的计算方式一般是将数据特征值数值化,用概率统计等数学工具计算),然后选取训练样本集中与待测数据距离最近的K条数据(通常K是小于20的整数)。这K条训练样本中类别出现最频繁的类别标签即作为带预测数据的类别标签。

一个python版本的KNN算法实现:

#!/usr/bin/evn python

import numpy as np

import operator

def classify0(intX,dataSet,labels,k):

'''获取行数,第二个为列数 shape返回tuple'''

dataSetSize = dataSet.shape[0]

'''生成dateSetSize行,1列的矩阵,值都是intX,并且求出每一项与dataSet差'''

diffMat = np.tile(intX,(dataSetSize,1)) - dataSet

'''针对每项差值取平方'''

sqDiffMat = diffMat ** 2

'''将每一行向量相加'''

sqDistances = sqDiffMat.sum(axis=1)

'''对结果开根号'''

distances = sqDistances ** 0.5

'''排序 选取距离最小的K个点'''

sortedDistIndicies = distances.argsort()

classCount = {}

for i in range(k):

voteLabel = labels[sortedDistIndicies[i]]

classCount[voteLabel] = classCount.get(voteLabel,0) + 1

sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse=True)

return sortedClassCount[0][0]

1.1 归一化数值:

简述:在进行K邻近算法计算时,需要计算待分类数据的每个特征值和训练样本每个特征值的距离,但是每个特征值的量级或单位可能是不同的(例如特征向量[0.1,12000,1.1,500]),所以需要将各个维度的特征值进行归一化(说白了就是统一单位和量级,在同一把标尺下衡量各个特征的距离)。

常用来归一化数值的公式为:newValue = (oldValue-min)/(max-min)

1.2 总结:

k-近邻算法(KNN)是分类数据最简单最有效的算法。k-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数据。k-近邻算法必须保存全部的数据集,如果训练数据集很大,必须使用大量的存储空间。同时可能非常耗时。k-近邻算法的另一个缺陷是无法给出任何数据的基础结构信息,因此我们无法知晓平均样本和典型事例样本的具体特征。但是概率测量的分类方法则可以解决这个问题。

2.决策树:

简述:决策树是由一个决策图和可能的结果组成,用来创建到达目标的规划。决策树建立并用来辅助决策,是一种特殊的树结构。决策树是一个预测模型,他代表的对象属性和对象值之间的一种映射关系。树中每个结点表示某个对象,而每个分叉路径则代表某个可能的属性值。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,也可以用来预测。

2.1决策树的构建:

在构造决策树时,需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类时起决定性作用。为了找到决定性的特征,划分出最好的结果,必须评估每个特征。完成测试评估之后,原始数据被划分为几个数据子集。这些数据子集会分布在第一个决策点的所有分支上。如果某个分支下的数据属于同一类型,则无需进一步对数据集进行分割。如果数据子集内的数据不属于同一类型,则需要重复划分数据子集的过程。如何划分数据子集的算法和划分原始数据集的方法相同,直到所有具有相同类型的数据都在一个数据子集。

2.2 香农熵:

熵定义为信息的期望值,是集合信息的一种度量方式。熵这个名字来源于信息论之父 克劳德.香农。

计算香农熵的公式: H = -F(i=1,n)P(Xi)logxP(Xi), -F(i=i,n)代表求和函数。

ps:另一个度量集合无序程度的方法是基尼不纯度(Gini impurity),简单的说就是从一个数据集中随机选取子项,度量其被错误的划分到其他组里的概率。

2.3 构建树的python代码:

def createTree(dataSet,labels):

classList = [example[-1] for example in dataSet]

'''类别完全相同则停止划分'''

if classList.count(classList[0] == len(classList):

return classList[0]

'''遍历所有特征时返回出现次数最多的

if len(dataSet[0]) == 1:

return majorityCnt(classList)

bestFeat = chooseBestFeatureToSplit(dataSet)

bestFeatLabel = labels[bestFeat]

myTree = {bestFeatLabel:{}]

del(labels[bestFeat])

'''得到列表包含所有属性值'''

featValues = [example[beatFeat] for example in dataSet]

uniqueVals = set(featValues)

for value in uniqueVals:

subLabels = label[:]

myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)

return myTree

3.朴素贝叶斯(基于概率论的分类方法):

朴素贝叶斯是贝叶斯决策理论的一部分,贝叶斯理论的核心思想是为数据选择高概率的类别。(而朴素贝叶斯之所以"朴素",是因为这个形式化过程只做最原始,最简单的假设)

3.1 贝叶斯公式:

p(c|x) = p(x|c)p(c)/p(x)

简述:当x发生时c发生的概率等于当c发生时x的概率乘以c发生的概率除以x发生的概率。(以条件概率为基础推导所得)

3.2 朴素贝叶斯的条件假设(就说说究竟朴素在哪):

由统计学得知,如果每个特征需要N个样本,那么对于10个特征将需要N的10次方个样本,样本数是随着特征数成指数增长的。但是如果特征之间相互独立,则样本数就可以从N的10次方,减少为 N*10个。所以朴素贝叶斯基于贝叶斯理论做出的两个假设是:

(1) 数据的特征之间相互独立,即特征A发生与否不会影响特征B的发生的概率。

(2) 各个特征之间同等重要(决策树的理论则是一定要找出一个关键特征)。

3.3 先验概率和后验概率:

(1) 先验概率:是通过现有掌握的部分资料计算出来的概率,通常由经验丰富的专家纯主观的估计所得。(贝叶斯公式中的 p(x|c)即为先验概率,通过训练样本计算所得) (2) 后验概率:可以通过Bayes定理,用先验概率和似然函数计算出来。(贝叶斯公式中的 p(c|x)即为后延概率,也是我们需要计算的概率)。

ps:贝叶斯公式计算的过程即为,通过训练样本数据计算 先验概率 P(x|c)和P(c),然后计算测试样本的特征概率 p(x),由此可以推导出测试样本的后验概率 p(c|x).其实说白了朴素贝叶斯就是根据已知样本的概率去推断总体的概率,整个模型的准确性的关键就是样本先验概率的计算的准确性。

3.3 实现贝叶斯计算的DEMO:

'''计算类别的在总体数据中的概率 即 P(c)

def P(data,cls_val,cls_name="class"):

cnt = 0.0

for e in data:

if e[cls_name] == cls_val:

cnt += 1

return cnt/len(data)

'''计算某个类别下某个属性的概率 即先验概率 P(x|c)

def PT(data,cls_val,attr_name,attr_val,cls_name="class"):

cnt1 = 0.0

cnt2 = 0.0

for e in data:

if e[cls_name] == cls_val:

cnt1 += 1

if e[attr_name] == attr_val:

cnt2 += 1

return cnt2/cnt1

'''根据测试数据统计特征概率P(x),并计算后验概率 p(c|x)

def NB(data,test,cls_y,cls_n):

PY = P(data,cls_y)

PN = P(data,cls_n)

for key,val in test.items():

print (key,val)

PY *= PT(data,cls_y,key,val)

PN *= PT(data,cls_n,key,val)

return {cls_y:PY,cls_n:PN}

4.支持向量机(SVM):

简述:支持向量机(SVM)是一种监督学习的方法,通俗来讲它是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即学习支持向量机的策略便是间隔最大话,最终可转化为一个凸二次规划问题的求解。

4.1基础概念:

(1)分隔超平面:分隔超平面即为分类的决策边界,分布在超平面一侧的数据都属于某个类别,而分布在另一侧的数据则属于另外一个类别。

(2)支持向量(support vector):就是离分隔超平面最近的那些点。

(3)SVM有很多实现,其中最流行的一种实现是SMO(最小优化算法)。

(4)核方法或者说核技巧会将数据(有时是非线性数据)从一个低维的空间映射到一个高维的空间,可以将一个在低维空间中的非线性问题转换成高维的线性问题来求解。

4.2 SVM通俗解释:

SVM对数据进行分类的时候就是寻找一个最优化超平面的过程。这个最优化超平面使得离它比较近的点能有更大的间隔。也就是不考虑所有点都必须远离超平面,而是只关心求得超平面能够让所有点中离它最近的点(支持向量)有更大间距。形象的说,如果要在纸上寻找一条折线,按照某条折线折叠后,里折线最近的点的间距比其它折线都要大。

4.3 SVM的推到实现还是很复杂的,可以参考一篇blog

5.人工神经网络(ANN):

简述:简称神经网络(NN),是一种模仿生物神经网络的结构和功能的数学模型。现代神经网络是一种非线性统计数据建模工具,常用来对输入和输出间的关系进行建模,或用来探索数据的模式。其一个比较贴切的定义是:人工神经网络是由人工建立的以有向图为拓扑结构的动态系统,它通过对连续或断续的输入作状态响应而进行信息处理。

5.1 人工神经网络的特点:

(1) 可以充分逼近任意复杂的非线性关系。

(2) 所有定量或定性的信息都等势分布储存于网络内各神经元,故有很强的鲁棒性和容错性。

(3) 采用并行分布处理方法,使得快速进行大量运算称为可能。

(4) 可学习和自适应不知道或不确定的系统。

(5) 能够同时处理定量、定性标识。

5.2 有监督的神经网络模型训练:

将一组训练集输入人工神经网络,根据网络的实际输出和期望输出间的差别来调整链接权。监督学习算法的主要步骤包括:

(1) 从样本结合中取一个样本(Ai,Bi) ps:Ai为输入,Bi为期望输出。

(2) 计算人工神经网络的实际输出O。

(3) 求D = Bi-O。

(4) 根据D调整矩阵W。

(5) 对每个样本重复上述过程,直到整个样本集来说,误差不超过规定范围

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net开发微信公众平台

一、说明:公众平台信息接口为开发者提供了一种新的消息处理方式,只有申请成为开发者后,你才能使用公众平台的开发功能,在这里你需要填写一个URL和一个Token,这两项信息也需要你拥有自己的服务器(外网服务器…

python有趣函数_python中有趣的函数

filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回:>>> def f(x): return x % 2 ! 0 and x % 3 ! 0>>> filter(f, range…

使用客户端对象模型读取SharePoint列表数据

使用客户端对象模型读取SharePoint列表数据 客户端对象模型提供了强有力的方式,从远程客户端应用程序管理列表。1. 管理员身份打开VS,新建项目Windows窗体应用程序,命名ReadSPListData,确保选择.NET Framework 3.5。2. 添加控件。…

UE4 获得player id

获得Player ID 获得Player 位置 获得所有PlayerId

python学习---语法

python script常见格式: import sys #导入sys模块 from util import * #从util模块导入全部需要的变量,函数等 module[webview,content_shell,chrome] #列表数据结构 number(1,2,5,6,9) #元祖数据结构,不可改变 转载于:https://www.cnblogs.com/hanying/p/3792601.html

WebForm

封装太强 不容易进行单元测试 入门容易,使用难 转载于:https://www.cnblogs.com/xiaocandou/p/3793694.html

installshield 指定多个自定义路径和文件

1. 在Project Assistant的Application Files标签里面 在Script-defined Folders下面分别创建两个变量AAAA,BBBB。 分别在两个变量下面创建文件夹,A1,B1。 把需要安装在这两个文件夹下的文件分别添加进去。 2. 在Installation Designer标签下&…

java中domain什么意思_java解析URL中domain、端口和协议的两种方法

java解析URL中domain、端口和协议的两种方法Java代码 收藏代码Testpublic void parseDomain() throws IOException {for (int i 0; i < 10000000; i) {String urlAddress “http://www.roseindia.net/jsf/JSFLoginApplication.shtml”;URL url new URL(urlAddress);asser…

用鼠标选择模型表面两点并连线

1.两次鼠标点击分别用两个小球标识点击的位置 2. 鼠标右键实现两个位置之间的连线&#xff0c;并在线的中心位置设置textrender来显示线的长度 3. 设置textrender的朝向始终面向摄像机&#xff0c;并作插值平滑过度 4. 设置鼠标光标可显示&#xff0c;并且关卡可以响应鼠标事件…

java ranger rest_使用REST

使用Spring MVC开发Web应用程序的主要工作就是编写Controller逻辑。在Web应用中&#xff0c;除了需要使用MVC给用户显示页面外&#xff0c;还有一类API接口&#xff0c;我们称之为REST&#xff0c;通常输入输出都是JSON&#xff0c;便于第三方调用或者使用页面JavaScript与之交…

JDK安装与环境变量配置

本文介绍JDK的安装与环境变量配置。 工具/原料 JDK1.7.0 WIN7 方法/步骤 安装JDK 选择安装目录 安装过程中会出现两次 安装提示 。第一次是安装 jdk &#xff0c;第二次是安装 jre 。建议两个都安装在同一个java文件夹中的不同文件夹中。&#xff08;不能都安装在java文件夹的…

第一人称视角获得运动方向和视角的夹角

1. GetVelocity获得速度的vector 2. 使用RotationFromXVector和速度的vector得到世界坐标系里速度向量和世界坐标系X轴的夹角 虽然&#xff0c;RotationFromXVector返回的是一个rotation&#xff0c;但实际上只有Yaw值有效&#xff0c;因为Yaw(围绕Z轴的偏转角) 即为速度vecto…

用java程序for循环打印菱形_编写Java程序,应用for循环打印菱形、三角形

//输出三角形//右上for(int m 1; m < 10; m){for (int n 1; n < m; n){System.out.print("*");}System.out.println();}//右下(1)for(int m 1; m < 10; m){for (int n 10; n > m; n--){System.out.print("*");}System.out.println();}//右…

java中CardLayout的使用方法

import javax.swing.*;import java.awt.*; import java.awt.event.*;public class Card extends JFrame{/** JFrame的布局管理器是BorderLayout*/JPanel p;//位于中心区域的面板JButton b1,b2,b3,b4;//位于南部区域的四个按钮JLabel l1,l2,l3,l4;CardLayout c;//设置面板p的布局…

深入浅出UE4网络

UE4中的官方文档结构比较混乱&#xff0c;且有部分错误&#xff0c;不方便学习。笔者试图通过本文&#xff0c;整理出一篇关于UE4网络的文章&#xff0c;方便朋友们对UE4中的网络同步部分的认识&#xff0c;并有进一步理解。如有讲得不清楚明白的地方&#xff0c;还望批评指正。…

java载屁股针_以前常打的“屁股针”,为何现在很少见了?医生告诉你真实原因...

打屁股针应该是每个人的童年噩梦&#xff0c;还记得小时候到医院打针&#xff0c;医生的手还没碰到裤子&#xff0c;就感觉屁股发麻&#xff0c;忍不住拔腿就跑&#xff0c;最终还是被家长逮住&#xff0c;夹在大腿间固定住&#xff0c;防止逃跑&#xff0c;于是在哭喊声中迎来…

Windows中查找文件被何进程使用

这篇文章记录在对文件/文件夹删除、更改&#xff0c;移动时&#xff0c;Windows弹窗提示正在被某程序使用&#xff0c;但又不给出进程名的问题。 方法一、 在任务管理器中&#xff0c;切换到性能项&#xff0c;有一个资源管理器&#xff0c;如下&#xff1a; 进入资源管理器&am…

UE4 多人联机显示每个人的playid

目的&#xff1a;在多人联机模式下&#xff0c;在每个pawn的上方显示textrender&#xff0c;并且在textrender里显示每个pawn的playerid 下面以一个listen server和两个client的方式测试。 1. 创建一个带有textrender的actor&#xff0c;并且勾选其replicated开关 2. 在Chara…

java编写代码时易出错_写Java程序最容易犯的错误有哪些呢?

1。Duplicated Code代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copy-and-paste的编程风格。与他相对应OAOO是一个好系统的重要标志。2。Long method它是传统结构化的“遗毒”。一个方法应当具有自我独立的意图&#xff0c;不要把几个意…