贝叶斯分类(涉及python3 的string的方法、文件读取操作方法、arff文件格式)

前段时间学习python3的基础知识,现在做一些数据挖掘方面的小练习。

今天要做的事贝叶斯分类器,数据来源为老师的weather.arff, 首先要读取这个文件,要用到string的方法http://write.blog.csdn.net/postlist和文件读取方法http://write.blog.csdn.net/postlist 和arff文件格式http://blog.sina.com.cn/s/blog_9d40b61301012xci.html,程序如下:

# coding =utf-8
import re
import sys

def readArff(fileName):
    arffFile = open(fileName,'r')
    data = []
    for line in arffFile.readlines():
        if not (line.startswith('@')):
            if not (line.startswith('%')):
                if line !='\n':
                    L=line.strip('\n')
                    k=L.split(',')
                    data.append(k)                    
                    print(k)
    print(data)
if __name__ =='__main__':
    fileName=r'C:\Users\Administrator\Desktop\exepirenment\classifill\data\weather.arff'
    readArff(fileName)

输出结果如下:

['sunny', '85', '85', 'FALSE', 'no']
['sunny', '80', '90', 'TRUE', 'no']
['overcast', '83', '86', 'FALSE', 'yes']
['rainy', '70', '96', 'FALSE', 'yes']
['rainy', '68', '80', 'FALSE', 'yes']
['rainy', '65', '70', 'TRUE', 'no']
['overcast', '64', '65', 'TRUE', 'yes']
['sunny', '72', '95', 'FALSE', 'no']
['sunny', '69', '70', 'FALSE', 'yes']
['rainy', '75', '80', 'FALSE', 'yes']
['sunny', '75', '70', 'TRUE', 'yes']
['overcast', '72', '90', 'TRUE', 'yes']
['overcast', '81', '75', 'FALSE', 'yes']
['rainy', '71', '91', 'TRUE', 'no']

读取完数据后,则开始写贝叶斯算法,贝叶斯原理不明白的请看我的新浪博客: http://blog.sina.com.cn/s/blog_bee847a20102v1wz.html。完整程序如下:

# coding =utf-8
import re
import sys
import bisect
data =[]  #全局变量
def readArff(fileName):
    arffFile = open(fileName,'r')
    global data
    for line in arffFile.readlines():
        if not (line.startswith('@')):
            if not (line.startswith('%')):
                if line !='\n':
                    L=line.strip('\n')
                    k=L.split(',')
                    data.append(k)
def bayesion(testData):
    class1=[]
    class2=[]
    global data
    for item in data:
        if item[len(item)-1] == 'yes':
            class1.append(item)
        else:
            class2.append(item)
    class1Probability = len(class1) /len(data)
    class2Probability = len(class2) /len(data)
    for i in range(len(testData)):
        count = 0
        for elem in class1:
            if testData[i]==elem[i]:
                count +=1       #统计个数
        class1Probability *= count/len(class1) #累计乘法 求总概率
        count = 0
        for elem in class2:
            if testData[i]==elem[i]:
                count +=1
        class2Probability *=count/len(class2)
    if class1Probability >class2Probability: #比较,进而分类
        print("The result is : Yes")
    else:
        print("The result if : No")
#数据预处理,将data数据分箱,data数据为 list[list1,list2...]类型
def dataPreprocessing1(data):
    breakpoint1 =[70,80]
    breakpoint2=[80,90]
    newValue1='LMH'
    for item in data:
        i = bisect.bisect(breakpoint1,int(item[1])) #int(),str()等类型需要转换
        item[1]=str(newValue1[i])
        j = bisect.bisect(breakpoint2,int(item[2]))
        item[2]=str(newValue1[j])
#数据预处理,分箱,针对单个list数据,data为list['..','..']类型
def dataPreprocessing2(data):
    breakpoint1 =[70,80]
    breakpoint2=[80,90]
    newValue1='LMH'
    i = bisect.bisect(breakpoint1,int(data[1]))
    data[1]=str(newValue1[i])
    j = bisect.bisect(breakpoint2,int(data[2]))
    data[2]=str(newValue1[j])


if __name__ =='__main__':
    fileName=r'C:\Users\Administrator\Desktop\exepirenment\classifill\data\weather.arff'
    readArff(fileName)
    dataPreprocessing1(data)

    testData =['overcast','72','80','TRUE']
    dataPreprocessing2(testData)

    bayesion(testData)

输出结果:

The result is : Yes




文件说明 下面我们来对这个文件的内容进行说明。 识别ARFF文件的重要依据是分行,因此不能在这种文件里随意的断行。空行(或全是空格的行)将被忽略。 以“%”开始的行是注释,WEKA将忽略这些行。如果你看到的“weather.arff文件多了或少了些“%”开始的行,是没有影响的。 除去注释后,整个ARFF文件可以分为两个部分。第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。第二部分给出了数据信息(Data information),即数据集中给出的数据。从“@data”标记开始,后面的就是数据信息了。 关系声明 关系名称在ARFF文件的第一个有效行来定义,格式为 @relation 是一个字符串。如果这个字符串包含空格,它必须加上引号(指英文标点的单引号或双引号)。 属性声明 属性声明用一列以“@attribute”开头的语句表示。数据集中的每一个属性都有它对应的“@attribute”语句,来定义它的属性名称和数据类型。 这些声明语句的顺序很重要。首先它表明了该项属性在数据部分的位置。例如,“humidity”是第三个被声明的属性,这说明数据部分那些被逗号分开的列中,第三列数据 85 90 86 96 ... 是相应的“humidity”值。其次,最后一个声明的属性被称作class属性,在分类或回归任务中,它是默认的目标变量。 属性声明的格式为 @attribute 其中是必须以字母开头的字符串。和关系名称一样,如果这个字符串包含空格,它必须加上引号。 WEKA支持的有四种,分别是 numeric-------------------------数值型 -----分类(nominal)型 string----------------------------字符串型 date []--------日期和时间型 其中 和 将在下面说明。还可以使用两个类型“integer”和“real”,但是WEKA把它们都当作“numeric”看待。注意“integer”,“real”,“numeric”,“date”,“string”这些关键字是区分大小写的,而“relation”“attribute ”和“date”则不区分。 数值属性 数值型属性可以是整数或者实数,但WEKA把它们都当作实数看待。 分类属性 分类属性由列出一系列可能的类别名称并放在花括号中:{, , , ...} 。数据集中该属性的值只能是其中一种类别。 例如如下的属性声明说明“outlook”属性有三种类别:“sunny”,“ overcast”和“rainy”。而数据集中每个实例对应的“outlook”值必是这三者之一。 @attribute outlook {sunny, overcast, rainy} 如果类别名称带有空格,仍需要将之放入引号中。 字符串属性 字符串属性中可以包含任意的文本。这种类型的属性在文本挖掘中非常有用。 示例: @ATTRIBUTE LCC string 日期和时间属性 日期和时间属性统一用“date”类型表示,它的格式是 @attribute date [] 其中是这个属性的名称,是一个字符串,来规定该怎样解析和显示日期或时间的格式,默认的字符串是ISO-8601所给的日期时间组合格式“yyyy-MM-ddTHH:mm:ss”。 数据信息部分表达日期的字符串必须符合声明中规定的格式要求(下文有例子)。 数据信息 数据信息中“@data”标记独占一行,剩下的是各个实例的数据。 每个实例占一行。实例的各属性值用逗号“,”隔开。如果某个属性的值是缺失值(missing value),用问号“?”表示,且这个问号不能省略。例如: @data sunny,85,85,FALSE,no ?,78,90,?,yes 字符串属性和分类属性的值是区分大小写的。若值中含有空格,必须被引号括起来。例如: @relation LCCvsLCSH @attribute LCC string @att
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值