R语言与数据分析之三:分类算法1

分类算法与我们的生活息息相关,也是目前数据挖掘中应用最为广泛的算法,如:已知系列的温度、湿度的序列和历史的是否下雨的统计,我们需要利用历史的数据作为学习集来判断明天是否下雨;又如银行信用卡诈骗判别。

分类问题都有一个学习集,根据学习集构造判别函数,最后根据判别函数计算我们所需要判别的个体属于哪一类的。

常见的分类模型与算法

传统方法

1、线性判别法;2、距离判别法;3、贝叶斯分类器;

现代方法:

1、决策树;2、支持向量机;3、神经网络;

线性判别法:

天气预报数据(x1,x2分别为温度和湿度,G为是否下雨)

G=c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2)
x1=c(-1.9,-6.9,5.2,5.0,7.3,6.8,0.9,-12.5,1.5,3.8,0.2,-0.1,0.4,2.7,2.1,-4.6,-1.7,-2.6,2.6,-2.8)
x2=c(3.2,0.4,2.0,2.5,0.0,12.7,-5.4,-2.5,1.3,6.8,6.2,7.5,14.6,8.3,0.8,4.3,10.9,13.1,12.8,10.0)
a=data.frame(G,x1,x2)
plot(x1,x2)
text(x1,x2,G,adj=-0.5)


观察上图可以1点分布在右下方区域,2点主要分布在上方区域,肉眼可见这两个集合分离的比较明显,线性判别法的原理就是在平面中找出一条直线,使得属于学习集1号的分布在直线一侧,属于学习集2号的分布在直线另一侧。

判别式是允许有出差的,只要在一定的范围内即可。

R语言的表达如下:

library(MASS)
ld=lda(G~x1+x2)
z=predict(ld)
newG=z$class
y=cbind(G,z$x,newG)


由上左图可以看出,首先计算先验概率,数据中12各占50%,然后计算x1x2的平均值,最后给出了判别函数的代数表达:


观察上右图可见,newG为预测的判别,可见两类分别只有一个判错,同时可以见判别函数的值为正值时判为第2类,判别函数值为负值时判为第1类。

距离判别法

计算待测点和各类的距离,选择最近的分类进行归类。其中距离的计算非常关键,常见的距离为马氏距离:


 R语言没有自动距离判别法的函数,我们需要自己手动写:

myDiscriminiant<- function(TrnX1,TrnX2,TstX =NULL,var.equal=FALSE)
{
	if(is.null(TstX)==TRUE) TstX <- rbind(TrnX1,TrnX2)
	if(is.vector(TstX)==TRUE) TstX<- t(as.matrix(TstX))
	else if(is.matrix(TstX) !=TRUE)
		TstX <- as.matrix(TstX)
	if(is.matrix(TrnX1)!=TRUE) TrnX1 <- as.matrix(TrnX1)
	if(is.matrix(TrnX2)!=TRUE) TrnX2 <- as.matrix(TrnX2)
	nx <- nrow(TstX)
	blong <- matrix(rep(0,nx),nrow=1,byrow=TRUE,dimnames=list("blong",1:nx))
	mu1 <-colMeans(TrnX1);mu2 <- colMeans(TrnX2)
	if(var.equal==TRUE || var.equal==T){
		S<- var(rbind(TrnX1,TrnX2))
		w<- mahalanobis(TstX,mu2,S)-mahalanobis(TstX,mu1,S)
	}
	else{
		S1<-var(TrnX1);S2<-var(TrnX2)
		w<-mahalanobis(TstX,mu2,S2)-mahalanobis(TstX,mu1,S1)
	}
	for(i in 1:nx){
		if(w[i]>0) 
			blong[i] <- 1
		else
			blong[i] <- 2	
	}
	blong
}

保存到当前空间后,在控制台调用它:

classX1 <- data.frame(
			x1=c(6.6,6.6,6.1,6.1,8.4,7.2,8.4,7.5,7.5,8.3,7.8,7.8),
			x2=c(39,39,47,47,32,6,113,52,52,113,172,172),
			x3=c(1,1,1,1,2,1,3.5,1,3.5,0,1,1.5)
 )
 classX2 <- data.frame(
			x1=c(8.4,8.4,8.4,6.3,7,7,7,8.3,8.3,7.2,7.2,7.2,5.5,8.4,8.4,7.5,7.5,8.3,8.3,8.3,8.3,7.8,7.8),
			x2=c(32,32,32,11,8,8,8,161,161,6,6,6,6,113,113,52,52,97,97,89,56,172,283),
			x3=c(1,2,2.5,4.5,4.5,6,1.5,1.5,0.5,3.5,1.0,1.0,2.5,3.5,3.5,1,1,0,2.5,0,1.5,1,1)	
)
source("myDiscriminiant.R")
myDiscriminiant(classX1,classX2,var.equal=TRUE)

观看blong就可以看出个体属于哪一分类


贝叶斯分类器:

计算个体属于所有分类的概率,根据概率大小选择所属分类,已两个总体总体的判别情况来看,X1X2分别具有概率密度函数f1(x)f2(x),则样本实际来自X1却误判为X2的概率为:


同样来自X2却误判为X1的概率简单转换下即可;

来自X1也被判为X1的概率为:



来自X2也被判为X2的也类似

p1,p2分别表示X1X2的先验概率,则


L(1|2)表示X2被误判为X1的损失,其他类似,为了是分类越准确,则需降低平均误判损失(expected cost of misclassification:ECM)越小越好:


上式便为Bayes版别式。

按照上述数学推导,我们构建自己的两个总体的Bayes判别程序:

myBayes <- function(TrnX1,TrnX2,rate=1,TstX=NULL,var.equal=FALSE){
	if(is.null(TstX)==TRUE) TstX<-rbind(TrnX1,TrnX2)
	if(is.vector(TstX)==TRUE) TstX<-t(as.matrix(TstX))
	else if(is.matrix(TstX)!=TRUE)
		TstX <- as.matrix(TstX)
	if(is.matrix(TrnX1)!=TRUE) TrnX1 <- as.matrix(TrnX1)
	if(is.matrix(TrnX2)!=TRUE) TrnX2 <- as.matrix(TrnX2)
	nx <- nrow(TstX)
	blong <- matrix(rep(0,nx),nrow=1,byrow=TRUE,dimnames=list("blong",1:nx))
	mu1 <-colMeans(TrnX1);mu2 <- colMeans(TrnX2)
	if(var.equal==TRUE || var.equal==T){
		S<- var(rbind(TrnX1,TrnX2))
		w<- mahalanobis(TstX,mu2,S)-mahalanobis(TstX,mu1,S)
	}
	else{
	S1<-var(TrnX1);S2<-var(TrnX2)
	beta <-2*log(rate)+log(det(S1)/det(S2))
	w<-mahalanobis(TstX,mu2,S2)-mahalanobis(TstX,mu1,S1)
	}
	for(i in 1:nx){
		if(w[i]>beta) 
			blong[i] <- 1
		else
			blong[i] <- 2
	}
	blong
}

以天气预报为案例,我们看看如何使用Bayse分类器:


我们在控制台录入数据:

TrnX1<- matrix(
	c(24.8,24.1,26.6,23.5,25.5,27.4,
		-2,-2.4,-3,-1.9,-2.1,-3.1),
	ncol=2)
TrnX2<-matrix(
	c(22.1,21.6,22,22.8,22.7,21.5,22.1,21.4,
		-0.7,-1.4,-0.8,-1.6,-1.5,-1,-1.2,-1.3),
	ncol=2)
source("myBayes.R")
myBayes(TrnX1,TrnX2,rate=8/6)

下图可见所有的样本全部判别正确:




  • 0
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#Something about the data mining 数据挖掘(Data mining):是数据库知识发现(英语:Knowledge-Discovery in Databases,简称:KDD)中的一个步骤。数据挖掘一般是指从大量的数据中通过算法搜索隐藏于其中信息的过程。数据挖掘通常与计算机科学有关,并通过统计、在线分析处理、情报检索、机器 学习、专家系统(依靠过去的经验法则)和模式识别等诸多方法来实现上述目标。 数据分析十大经典算法: 1.Apriori :是一种最有影响的挖掘布尔关联规则频繁项集的算法。 2.C4.5:是机器学习算法中的一种分类决策树算法,其核心算法是 ID3 算法。 3. Naive Bayes:在众多分类方法中,应用最广泛的有决策树模型和朴素贝叶斯(Naive Bayes) 4. K-means 算法:是一种聚类算法 5. SVM:一种监督式学习方法,广泛应用于统计分类以及回归分析中 6.CART:分类与回归树,下面有两个关键的思想,第一个是关于递归地划分自变量空间的想法,第二个是用验证数据进行减枝 7. KNN:是一个理论上比较成熟的的方法,也是最简单的机器学习方法之一。 8. Pagerank:是 google 算法的重要内容。 9. adaboost:是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器然后把弱分类器集合起来,构成一个更强的最终分类器。 10. EM:最大期望值法。 注意:十大算法大概分类: KNN,决策树(以 C4.5)为例,SVM,AdaBoost,CART,Naive Bayes 都是分类作为目的的算法 而 K-means 是最常见的聚类算法;Apiori 是关联规则挖掘算法;EM 是一种概率模型参数的算 法;PageRank 是一种链接分析的算法,主要用于图数据里,对结点重要性进行排名.
分类与预测 餐饮企业经常会碰到这样的问题: 如何基于菜品历史销售情况,以及节假日、气候和竞争对手等 影响因素,对菜品销量进行趋势预测? 如何预测在未来一段时间哪些顾客会流失,哪些顾客最有可能 会成为VIP客户? 如何预测一种新产品的销售量,以及在哪种类型的客户中会较 受欢迎? 餐厅经理需要通过数据分析来帮助他了解具有某些特征的顾客的 消费习惯;餐饮企业老板希望知道下个月的销售收入,原材料采 购需要投入多少,这些都是分类与预测的例子。 分类和预测是预测问题的两种主要类型。 分类主要是预测分类标号(离散、无序的) 预测主要是建立连续值函数模型,预测给定自变量的条件下因 变量的值 分类和预测是预测问题的两种主要类型。 分类主要是预测分类标号(离散、无序的) 预测主要是建立连续值函数模型,预测给定自变量的条件下因 变量的值 有监督学习/有指导学习/有教师学习 因为在分析测试数据之前,类别(目标列取值)就已经确定了 可以根据实际的类标号(目标列取值)和模型的输出来检验样 本是否处理正确 所以分类(预测)通常被称为有监督的学习 分类包括考察一类新出现的对象的特征,并归类到一定义类中 首先要有一个清晰定义的类,还要有一系列已分类实例 分类过程实际上是先在历史数据上建立某种模型,再将其用于 未分类数据进行分类 分类算法的目的是找出从属性到类标号的映射关系 表示形式:决策树,分类规则,神经网络,SVM,最近邻 分类问题举例 将信用卡申请者分为低、中、高风险 发现欺骗性理赔申请 将网上的每一篇文章按关键词分在不同组

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值