冰山立方体BUC算法是一种计算稀疏立方体的构建算法,在构建数据立方体的过程中,如果构建完整的数据仓库可能会花费大量的计算、存储和时间成本。
不过因为在应用过程中大部分的数据都是稀疏的,我们就可以通过冰山立方体的方式简化数据立方体。具体的效果就是,对于本来2^n种排列组合,通过类似BUC的算法,排除过稀疏的数据之后就只剩下很少的一部分,大大提高了数据立方体的效率。
BUC算法的构建有点类似二叉树的剪枝操作。我找到了一些现成的程序,发现基本上都是在操作一些过于简单的数据(只有不超过十组,两三个维度),这里我重新用递归的方法构建了BUC算法,并且针对了水果分类的数据,规模上要更大一些,希望对想要了解BUC算法的同学有所帮助。

数据集

我们用到的水果数据集由爱丁堡大学教授 Iain Murray 所创。他买了很多种类的橙子、柠檬和苹果,并把它们的相关数据记录在表格中。然后密歇根大学的一些学者将这些水果数据编排了格式,点击这里可以下载这些数据:Machine-Learning-with-Python/fruit_data_with_colors.txt

导入库

import numpy as np
import pandas as pd

这里用到了numpy和pandas,是比较基础的python库,安装也很简单,就不多作介绍了。

读数据

fruit = pd.read_table('fruit.txt')

我把原始数据存在了fruit变量里,因为txt文件放在了同目录,这里就直接读取了。

离散化

#离散化mass    width   height  color_score
fruit['mass_bins'] = pd.cut(fruit['mass'],4,labels=False).astype('str')
fruit['width_bins'] = pd.cut(fruit['width'],4,labels=False).astype('str')
fruit['height_bins'] = pd.cut(fruit['height'],4,labels=False).astype('str')
fruit['color_score_bins'] = pd.cut(fruit['color_score'],4,labels=False).astype('str')

这里因为构建数据立方体的每个节点都是离散的,所以先对数据里面的连续特征做了离散化,python提供了很方便的离散工具,这里面4代表把数据由大到小分成了四个等间距组,结尾的astype是把结果变成字符串类型,这样方面后面和其他特征同时做处理(因为fruit_name,fruit_subtype等特征都是字符串)

把离散后的数组重新保存

#drop连续值的列
fruit_bins = fruit.drop(['fruit_label', 'mass',  'width', 'height', 'color_score'], axis=1)

这里的处理主要是我觉得数据仓库的一个原则是不改变原数据,所以重新创建了变量来进一步的操作,另一个原因也是单独领出来会更加清晰一点,后续的工作更加简单。

初始化参数

#初始化BUC参数
minimum_support = 3
label =[]
unit = []
result = []
result_value =  []
t = []
for i in fruit_bins:label.append(i)

这里面设置了minimum_support最小支持度,比它小的元组都做了剪枝处理。
label用来存放特征的名称
unit是个临时变量满足条件后会把unit的结果压入result结果中,这里面我还遇到了一些小麻烦,感兴趣的朋友可以看我另一篇帖子:python里面用append把一个数组压到另一个数组里面,原来的数组如果再append东西,后来的数组就跟着变化怎么办?
result用来存放元组的结果
result_value用来存放相应元组对应的元组数
t 是个中间变量,那篇帖子里有介绍

递归算法本体

#BUC递归算法
def BUC( partial_data , i):global unitglobal resultglobal t buc_temp = partial_data.groupby(label[i]).size().sort_values(ascending = False)for [j,k] in zip(buc_temp.values,buc_temp.index):if j < minimum_support :t.extend(unit)result.append(t)result_value.append(j)t = []del(unit[-1])returnelse :unit.append(k)buc_temp = partial_data.query(label[i] + ' == ["' + k + '"]')if i >= 5:t.extend(unit)result.append(t)result_value.append(j)t = []del(unit[-1])continueelse:t.extend(unit)result.append(t)result_value.append(j)t = []BUC(buc_temp , i+1)if i >= 1:del(unit[-1])

具体实现的途径其实不复杂,就是要注意判定子程序结束的条件,理清逻辑后代码还是很容易实现的。

主函数

#跑起来吧
result = []
unit = []
BUC(fruit_bins, 0)

主函数就非常简单了

去除重复的元素

#去除重复的元素
results = []
results_value =  []
for i , j in zip(result,range(len(result))):if not i in results:results.append(i)results_value.append(result_value[j])
print(len(results))
print(len(results_value))

在上一步得到的结果里有很多的重复组,这一步把其中重复的部分删去。

结果展示

#结果展示
for a,b in zip(results,results_value):print(str(a) + " : " + str(b))

结果如下(展示前5行):

['apple'] : 19
['apple', 'cripps_pink'] : 6
['apple', 'cripps_pink', '1'] : 5
['apple', 'cripps_pink', '1', '1'] : 5
['apple', 'cripps_pink', '1', '1', '2'] : 3

其实到这一步还没做完,本来应该把已经离散化的几个特征再恢复回去,不能像这里这样,用1、2、3、4来表示,偷个懒吧。

使用python用递归的方法实现冰山立方体BUC算法(以水果分类数据为例)相关推荐

  1. 冰山立方体BUC算法(附测试集和完整代码)

    目录: 算法思路 算法实现 算法运行结果 一.算法思路 设想的算法分为三部分: 1.计算输入数据的维数.每个维的基数.每个维的取值个数以及每个维的取值. 2.设计一个函数,参数为一个列表,计算该列表在 ...

  2. python以递归的方式实现十进制转二进制算法(附完整源码)

    python以递归的方式实现十进制转二进制算法 def binary_recursive(decimal: int) -> str:decimal = int(decimal)if decima ...

  3. 在python中用递归的方法编程_python基础之函数,递归,内置函数

    阅读目录 一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量, ...

  4. python计算图形面积的方法_python计算不规则图形面积算法

    https://www.xin3721.com/eschool/pythonxin3721/ 介绍:大三上做一个医学影像识别的项目,医生在原图上用红笔标记病灶点,通过记录红色的坐标位置可以得到病灶点的 ...

  5. 数据挖掘冰山立方体构建算法:BUC及实现

    1.冰山立方体知识: waiting... 2.代码实现: 实现思路:全程模拟,写的时候理解还不够透彻,第一轮算出频率大于min_sup的集合,然后根据此集合开始不断向下扩展,筛选所有大于min_su ...

  6. 用python求素数的方法,以及一种算法优化

    python求素数 前言 方法一 1.代码 2.输出结果 方法二 1.代码 2.输出结果 前言 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数(该解释来自百度百科). 如果要找1 ...

  7. 【ArcGIS遇上Python】ArcGIS Python按照指定字段批量筛选不同类型的图斑(以土地利用数据为例)

    基于土地利用数据,根据用地类型名称,批量筛选出不同类型的用地,生成不同类型的shp数据,以类型名称命名. 文章目录 1. 土地利用原始数据 2. 根据名称批量筛选结果 3. ArcGIS Python ...

  8. 数据挖掘BUC计算冰山立方体及Python实现

    因课程实验所需,对BUC算法进行了Python实现,过程多有坎坷,在此一记,以助后人. 一.关于BUC及冰山立方体的介绍 可参照如下链接: [数据挖掘概念与技术]学习笔记5-数据立方体技术 - CSD ...

  9. 数据挖掘BUC算法计算冰山立方体的python实现

    冰山立方体计算 在很多情况下,数据立方体的空间大多被低度量值的数据单元所占据,而这些数据单元往往是分析者很少关心的内容.冰山立方体的计算能够减少物化数据单元所占有的存储空间. 常用计算方法: BUC: ...

最新文章

  1. 中国程序员超 5000 万?北上广等一线城市 IT 岗位已开始饱和过剩?
  2. python csv库,Python 中导入csv数据的三种方法
  3. Error LNK2001 无法解析的外部符号 的几种情况及解决办法
  4. npm——安装教程、安装vue脚手架(ASP.NET Core微服务(五)——【vue脚手架解析接口】过度章节)
  5. TP的URL设计和SEO支持
  6. c语言字符指针清零,C语言中字符串的内存地址操作的相关函数简介
  7. python房价预测_Python实战:使用线性回归预测房价
  8. OpenHarmony AI图像识别开发—基于润和Hi3516开发套件
  9. navicat安装+链接mysql 8.x
  10. python爬饿了么数据_爬取饿了么区域商家分布
  11. 华为云免费试用_如何试用华为云服务器
  12. 微信设置文字大小影响网页布局
  13. 物竞天择2 NS2 -MOD制作教程 -制作工具
  14. java简易计算器实验报告_Java 《Java 实现简单计算器》实验报告
  15. python基于训练集预测_Python中训练集/测试集的分割和交叉验证
  16. WIN10,配置adb环境
  17. 推荐人工智能编程的必读书籍
  18. 青云云服务器怎么改系统,青云QingCloud沈鸥:企业应用如何往云端迁移?
  19. Unity实现幸运大转盘
  20. 【Solr】之使用springboot完成对【京东搜索商品】案例的实现

热门文章

  1. 2018.06.16软件更新公告
  2. 引发和使用事件(引用自MSDN)
  3. 怎样将个人简历翻译成英文
  4. 设置silverlight启用剪贴板的功能
  5. 企业级虚拟化实战之KVM——从KVM到云计算OpenStack
  6. 〖干货〗史上最详细快充科普帖!!!
  7. 顶点计划三——Process book
  8. 网络协议——基于JSON的RESTful接口协议
  9. java向上转型_Java向上转型
  10. 魔戒 4维bfs搜索