西电数据挖掘实验三 关联规则挖掘 投票记录

2023-11-04 03:20

本文主要是介绍西电数据挖掘实验三 关联规则挖掘 投票记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.实验内容

1、数据来源

http://archive.ics.uci.edu/ml/datasets/Congressional+Voting+Records

2、使用Apriori算法,支持度设为30%,置信度为90%,挖掘高置信度的规则。

2.实验结果

频繁项集输出(条件):支持度计数

规则输出({条件}{结论}置信度)

因gh党支持规则太多这里只截取部分

则可以得到高置信度的规则

比如基于mz党反对态度的高置信度规则有

{4, 6}, {12}, 0.9172932330827067

{12, 6}, {4}, 0.991869918699187

即如果mz党派人士对于4,6议题反对,那么也有极大可能反对12议题

如果mz党派人士对于12,6议题反对,那么也有极大可能反对4议题

3.实验代码

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as npdef readData():data = pd.read_csv('house-votes-84.data', header=None)data = np.array(data)return datadef preProcessing(data, vote_y_n):'''数据预处理以按 y 或 n 寻找关联规则'''data_pre = []for data_line in data:tmp_data = []for i in range(1, len(data_line)):# 从第二列开始,将数据文件中的记录与当前的选择vote_y_n进行比较,若找到了相关记录,把下标存进去if (data_line[i] == vote_y_n):tmp_data.append(i)if (tmp_data == []):continue  # 如果当前这一条记录中没有任何一个项是vote_y_n对应的选项,那么不存储空列表,直接进行下一个记录的查找data_pre.append(tmp_data)return data_predef ppreProcessing(data, vote_y_n, party):'''数据预处理以按 y 或 n 和议员所属党派来寻找关联规则'''data_pre = []for data_line in data:tmp_data = []if data_line[0] == party:for i in range(1, len(data_line)):# 从第二列开始,将数据文件中的记录与当前的选择vote_y_n进行比较,若找到了相关记录,把下标存进去if (data_line[i] == vote_y_n):tmp_data.append(i)if (tmp_data == []):continue  # 如果当前这一条记录中没有任何一个项是vote_y_n或者这条记录不是对应party的议员对应的选项,那么不存储空列表,直接进行下一个记录的查找data_pre.append(tmp_data)return data_predef rule_mining(data, support, confidence):'''挖掘关联规则'''dic_1 = mining_first(data, support, confidence)# print(dic_1)dic_2 = mining_second(data, dic_1, support, confidence)# print(dic_2)dic_before = dic_2dic_r = []dic_r.append(dic_1)# 频繁项集产生的终止条件就是不再有新的频繁项集产生为止while (dic_before != {}):# dict_r里面存储的是频繁2-项集及之后的所有频繁项集dic_r.append(dic_before)dic_3 = mining_third(data, dic_before, support, confidence)dic_before = dic_3return dic_rpassdef mining_first(data, support, confidence):'''进行第一次挖掘挖掘候选1-项集'''dic = {}count = len(data)for data_line in data:# 对于数据集中的每一行投票数据for data_item in data_line:# 对于每一行数据中的下标(对应某个议题)if (data_item in dic):# 以键值对的形式进行存储和计数dic[data_item] += 1else:dic[data_item] = 1assert (support >= 0) and (support <= 1), 'suport must be in 0-1'# 依靠给定的支持度阈值和投票数据的总数的得到满足条件的最小支持度值val_suport = int(count * support)assert (confidence >= 0) and (confidence <= 1), 'coincidence must be in 0-1'# 如果键值对中的值大于或等于当前支持度阈值,则可以将该键值对作为频繁1-项集保留dic_1 = {}for item in dic:  # 如果对每一个议题的所选定的(y|n)进行计数,若计数总值超过了支持度所需要的计数,就把它放到下一个字典中if (dic[item] >= val_suport):dic_1[item] = dic[item]return dic_1def mining_second(data, dic_before, support, confidence):'''进行关联规则的二次挖掘挖掘出候选2-项集注:所有挖掘出来的频繁项集都是以字典的形式存储的,字典的键是频繁项集,1频繁项集用1-16个整数,表示这些议题在原数据集中的下标;多频繁集就是这些下标的一个元组隐藏含义是这些议题共同被投票为vote_y_n,字典的值就是这样的组合出现的次数'''# 每一次扩展频繁项集的时候产生一个临时dict用于保存那些通过频繁项集生成算法可以留下的项集# 但是还要对其中的结果进行支持度判断,才能确定最终留下的算法dic = {}count = len(data)count2 = 0# frq_temp={}for data_line in data:# 获取元素数量count_item = len(data_line)# 每两个组合计数for i in range(0, count_item - 1):# 外层循环,控制频繁2-项集中的第一个元素的取值for j in range(i + 1, count_item):# 内层循环,控制频繁2-项集中的第二个元素的取值if (data_line[i] in dic_before and data_line[j] in dic_before):count2 += 1tmp = (data_line[i], data_line[j])# frq_temp[tmp]=0if (tmp in dic):# 上同,使用键值对集合计数,只不过此时元素是二元的元组dic[tmp] += 1else:dic[tmp] = 1else:continue# 当两个项中有一个不是频繁1-项集,根据剪枝策略,这样组成的项不是频繁2-项集# print(dic)assert (support >= 0) and (support <= 1), 'suport must be in 0-1'assert (confidence >= 0) and (confidence <= 1), 'confidence must be in 0-1'dic_2 = {}# for item in dic:#    for data_line in data:#        tmp=item#        tmp1=data_line#        if(set(tmp).issubset(set(tmp1))):#            frq_temp[item]+=1for item in dic:count_item0 = dic_before[item[0]]count_item1 = dic_before[item[1]]# 判断 支持度 和 置信度# 判断置信度的时候对于一个无序的元组,任何一种方向的规则都有可能,都要进行比较if (dic[item] >= support * count):# and#    (dic[item] >= confidence *frq_temp[item])):dic_2[item] = dic[item]return dic_2def mining_third(data, dic_before, support, confidence):'''进行关联规则的三次挖掘挖掘出候选3-项集或者4-项集乃至n-项集'''# 频繁项集的产生使用Fk-1*Fk-1的策略frq_temp = {}dic_3 = {}for item0 in dic_before:# 外层循环控制频繁k-1项集中的某一项for item1 in dic_before:# 内层循环控制频繁k-1项集中的另一项if (item0 != item1):# print(item0,item1)item_len = len(item0)equal = Truetmp_item3 = []# 判断前n-1项是否一致for i in range(item_len - 1):tmp_item3.append(item0[i])if (item0[i] != item1[i]):equal = Falsebreakif (equal == True):# 如果两个Fk-1项具有k-2个公共前缀,那么就按照顺序,将其组合起来minitem = min(item0[-1], item1[-1])maxitem = max(item0[-1], item1[-1])tmp_item3.append(minitem)tmp_item3.append(maxitem)tmp_item3 = tuple(tmp_item3)frq_temp[tmp_item3] = 0dic_3[tmp_item3] = 0else:continue# print('dic_3:',dic_3)# 暴力统计支持度的方法,对于每一个数据项,看每个新找到的k项集是否包含在数据项中# 比较的方法,是对项的每一位进行判断,看这一位是否在数据项中for data_line in data:for item in dic_3:is_in = Truefor i in range(len(item)):if (item[i] not in data_line):is_in = False# 该候选k项集中的所有项都在数据项中,则可以将该项保留if (is_in == True):dic_3[item] += 1assert (support >= 0) and (support <= 1), 'suport must be in 0-1'assert (confidence >= 0) and (confidence <= 1), 'coincidence must be in 0-1'count = len(data)dic_3n = {}for item in dic_3:# 前一项的支持度计数,就是现在的项除去末尾的数字,通过键值对在原来的字典中查询的值count_item0 = dic_before[item[:-1]]# 判断 支持度 和 置信度if (dic_3[item] >= support * count):# and (dic_3[item] >= confidence * count_item0)):dic_3n[item] = dic_3[item]return dic_3ndef association_rules(freq_sets, min_conf):'''根据产生的频繁项集生成满足置信度要求的规则:param dict: 频繁项集的字典:param dict: 频繁项集字典中的频繁项集列表:param min_conf: 最小置信度:return: 规则列表'''rules = []max_len = len(freq_sets)for k in range(max_len - 1):for freq_set in freq_sets[k]:for i in range(k + 1, max_len):for sub_set in freq_sets[i]:if isinstance(freq_set, int):if freq_set in sub_set:conf = freq_sets[i][sub_set] / freq_sets[k][freq_set]b = list(sub_set)b.remove(freq_set)b = set(b)a = set()a.add(freq_set)rule = (a, b, conf)if conf >= min_conf:rules.append(rule)elif set(freq_set).issubset(set(sub_set)):conf = freq_sets[i][sub_set] / freq_sets[k][freq_set]rule = (set(freq_set), set(sub_set) - set(freq_set), conf)if conf >= min_conf:rules.append(rule)return rulesif (__name__ == '__main__'):data_row = readData()data_y = preProcessing(data_row, 'y')data_n = preProcessing(data_row, 'n')data_y_republican = ppreProcessing(data_row, 'y', 'republican')data_y_democrat = ppreProcessing(data_row, 'y', 'democrat')data_n_republican = ppreProcessing(data_row, 'n', 'republican')data_n_democrat = ppreProcessing(data_row, 'n', 'democrat')# 支持度support = 0.3# 置信度confidence = 0.9# 总的y规则与两个党派的y规则r_y = rule_mining(data_y, support, confidence)print('基于支持态度的全部频繁项集:\n', r_y)rule_y = association_rules(r_y, confidence)print('基于支持态度的规则:\n', rule_y)r_y_republican = rule_mining(data_y_republican, support, confidence)print('基于gh党支持态度的频繁项集:\n', r_y_republican)rule_y_republican = association_rules(r_y_republican, confidence)print('基于gh党支持态度的规则数:\n', len(rule_y_republican))print('基于gh党支持态度的规则:\n', rule_y_republican)r_y_democrat = rule_mining(data_y_democrat, support, confidence)print('基于mz党支持态度的频繁项集:\n', r_y_democrat)rule_y_democrat = association_rules(r_y_democrat, confidence)print('基于mz党支持态度的规则数:\n', len(rule_y_democrat))print('基于mz党支持态度的规则:\n', rule_y_democrat)# 总的n规则与两个党派的n规则r_n = rule_mining(data_n, support, confidence)print('基于反对态度的全部频繁项集:\n', r_n)rule_n = association_rules(r_n, confidence)print('基于反对态度的规则:\n', rule_n)r_n_republican = rule_mining(data_n_republican, support, confidence)print('基于gh党反对态度的频繁项集:\n', r_n_republican)rule_n_republican = association_rules(r_n_republican, confidence)print('基于gh党反对态度的规则数:\n', len(rule_n_republican))print('基于gh党反对态度的规则:\n', rule_n_republican)r_n_democrat = rule_mining(data_n_democrat, support, confidence)print('基于mz党反对态度的频繁项集和规则:\n', r_n_democrat)rule_n_democrat = association_rules(r_n_democrat, confidence)print('基于mz党反对态度的规则数:\n', len(rule_n_democrat))print('基于mz党反对态度的规则:\n', rule_n_democrat)

这篇关于西电数据挖掘实验三 关联规则挖掘 投票记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/342858

相关文章

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads