python算法编码问题咨询

以下是apriori关联算法的实例代码实现,是用python实现的,IDE是myeclipse,没有报错:
#coding:utf-8
samples = [
["I1","I2","I5"],
["I2","I4"],
["I2","I3"],
["I1","I2","I4"],
["I1","I3"],
["I2","I3"],
["I1","I3"],
["I1","I2","I3","I5"],
["I1","I2","I3"]
]
min_support = 2
min_confidence = 0.6
fre_list = list()
def get_c1():
global record_list
global record_dict
new_dict = dict()
for row in samples:
for item in row:
if item not in fre_list:
fre_list.append(item)
new_dict[item] = 1
else:
new_dict[item] = new_dict[item] + 1
fre_list.sort()
print ("candidate set:")
print_dict(new_dict)
for key in fre_list:
if new_dict[key] < min_support:
del new_dict[key]
print ("after pruning:")
print_dict(new_dict)
record_list = fre_list
record_dict = record_dict
def get_candidateset():
new_list = list()
#自连接
for i in range(0,len(fre_list)):
for j in range(0,len(fre_list)):
if i == j:
continue
#如果两个k项集可以自连接,必须保证它们有k-1项是相同的
if has_samesubitem(fre_list[i],fre_list[j]):
curitem = fre_list[i] + ',' + fre_list[j]
curitem = curitem.split(",")
curitem = list(set(curitem))
curitem.sort()
curitem = ','.join(curitem)
#如果一个k项集要成为候选集,必须保证它的所有子集都是频繁的
if has_infresubset(curitem) == False and already_constains(curitem,new_list) == False:
new_list.append(curitem)
new_list.sort()
return new_list
def has_samesubitem(str1,str2):
str1s = str1.split(",")
str2s = str2.split(",")
if len(str1s) != len(str2s):
return False
nums = 0
for items in str1s:
if items in str2s:
nums += 1
str2s.remove(items)
if nums == len(str1s) - 1:
return True
else:
return False
def judge(candidatelist):
# 计算候选集的支持度
new_dict = dict()
for item in candidatelist:
new_dict[item] = get_support(item)
print ("candidate set:")
print_dict(new_dict)
#剪枝
#频繁集的支持度要大于最小支持度
new_list = list()
for item in candidatelist:
if new_dict[item] < min_support:
del new_dict[item]
continue
else:
new_list.append(item)
global fre_list
fre_list = new_list
print ("after pruning:")
print_dict(new_dict)
return new_dict
def has_infresubset(item):
# 由于是逐层搜索的,所以对于Ck候选集只需要判断它的k-1子集是否包含非频繁集即可
subset_list = get_subset(item.split(","))
for item_list in subset_list:
if already_constains(item_list,fre_list) == False:
return True
return False
def get_support(item,splitetag=True):
if splitetag:
items = item.split(",")
else:
items = item.split("^")
support = 0
for row in samples:
tag = True
for curitem in items:
if curitem not in row:
tag = False
continue
if tag:
support += 1
return support
def get_fullpermutation(arr):
if len(arr) == 1:
return [arr]
else:
newlist = list()
for i in range(0,len(arr)):
sublist = get_fullpermutation(arr[0:i]+arr[i+1:len(arr)])
for item in sublist:
curlist = list()
curlist.append(arr[i])
curlist.extend(item)
newlist.append(curlist)
return newlist
def get_subset(arr):
newlist = list()
for i in range(0,len(arr)):
arr1 = arr[0:i]+arr[i+1:len(arr)]
newlist1 = get_fullpermutation(arr1)
for newlist_item in newlist1:
newlist.append(newlist_item)
newlist.sort()
newlist = remove_dumplicate(newlist)
return newlist
def remove_dumplicate(arr):
newlist = list()
for i in range(0,len(arr)):
if already_constains(arr[i],newlist) == False:
newlist.append(arr[i])
return newlist
def already_constains(item,curlist):
import types
items = list()
if type(item) is types.StringType:
items = item.split(",")
else:
items = item
for i in range(0,len(curlist)):
curitems = list()
if type(curlist[i]) is types.StringType:
curitems = curlist[i].split(",")
else:
curitems = curlist[i]
if len(set(items)) == len(curitems) and len(list(set(items).difference(set(curitems)))) == 0:
return True
return False
def print_dict(curdict):
keys = curdict.keys()
keys.sort()
for curkey in keys:
print ("%s:%s"%curkey,curdict[curkey])

计算关联规则的方法

def get_all_subset(arr):
rtn = list()
while True:
subset_list = get_subset(arr)
stop = False
for subset_item_list in subset_list:
if len(subset_item_list) == 1:
stop = True
rtn.append(subset_item_list)
if stop:
break
return rtn
def get_all_subses(s):
from itertools import combinations
return sum(map(lambda r: list(combinations(s, r)), range(1, len(s)+1)), [])
def cal_associative_rule(frelist):
rule_list = list()
rule_dict = dict()
for fre_item in frelist:
fre_items = fre_item.split(",")
subitem_list = get_all_subset(fre_items)
for subitem in subitem_list:
# 忽略为为自身的子集
if len(subitem) == len(fre_items):
continue
else:
difference = set(fre_items).difference(subitem)
rule_list.append("^".join(subitem)+"->"+"^".join(difference))
print ("The rule is:")
for rule in rule_list:
conf = cal_rule_confidency(rule)
print (rule,conf)
if conf >= min_confidence:
rule_dict[rule] = conf
print ("The associative rule is:")
for key in rule_list:
if key in rule_dict.keys():
print (key,":",rule_dict[key])
def cal_rule_confidency(rule):
rules = rule.split("->")
support1 = get_support("^".join(rules),False)
support2 = get_support(rules[0],False)
if support2 == 0:
return 0
rule_confidency = float(support1)/float(support2)
return rule_confidency
if name == '__main__':
record_list = list()
record_dict = dict()
get_c1()
# 不断进行自连接和剪枝,直到得到最终的频繁集为止;终止条件是,如果自连接得到的已经不再是频繁集
# 那么取最后一次得到的频繁集作为结果
while True:
record_list = fre_list
new_list = get_candidateset()
judge_dict = judge(new_list)
if len(judge_dict) == 0:
break
else:
record_dict = judge_dict
print ("The final frequency set is:")
print (record_list)

# 根据频繁集计算关联规则
cal_associative_rule(record_list)

    运行后,出错,结果输出如下:
    Traceback (most recent call last):

File "D:\Workspaces\MyEclipse 2017 CI\pythontest\src\pythontest.py", line 213, in
candidate set:
get_c1()
File "D:\Workspaces\MyEclipse 2017 CI\pythontest\src\pythontest.py", line 29, in get_c1
print_dict(new_dict)
File "D:\Workspaces\MyEclipse 2017 CI\pythontest\src\pythontest.py", line 160, in print_dict
keys.sort()
AttributeError: 'dict_keys' object has no attribute 'sort'
找了很久,不知道出错点在哪,求指教。

2个回答

你检查一下你的代码吧,人家提示的是160行keys.sort()这个调用,没有sort这个属性。意思就是你的keys对象根本就没有sort这个方法

这段代码时用python2写的吧,你用的是python3?看错误像是用python3运行了,可以看看python2和3的语法区别

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
python编码问题
今天遇到一个很奇葩的编码问题。 我用urllib2获取网页内容document,然后 content_ecd = chardet.detect(document)['encoding'] 后面利用得到的编码解码该网页内容: e.decode(content_ecd).encode('utf-8') 大部分的内容都是对的,只有一个字符无法解码。这段字符在下来字符串中 '申万菱
Python编码问题
Python程序开头写#coding=utf-8的作用   Python文件编译最终还是要转换成字节码,Python程序开头写#coding=utf-8的作用其实就是把这个Python程序文件按照utf-8编码的方式映射到字节码,如果不加这个开头,程序里面的中文会按照Python默认的ascii码方式encode,这个肯定是要报错的,大家都知道,如果程序里写了中文但是没有加这个开头,那么pycha...
Python 编码问题
1. “UnicodeDecodeError: ‘gbk’ codec can’t decode with open(filename, 'r') as f: data = f.read() 将其改写为: with open(filename, 'rb') as f: data = f.read() 但这样读取到的文件内容,不可直接读取。为了阅读的方便,可进一步为其指定
python——编码问题
ASCII ascii编码是一个字节,没有中文 一个字节:(2^8)-1=255(还有个0),常用的是前127个(7位),首位通常为0,有时有特殊用途,127之后的为扩展字符,不同的国家对应不同字符,所以一般不输出 Unicode Unicode编码(万国码)通常是两个字节代表一个字符,2**16-1=65535,可代表6万多个字符,因而兼容万国语言 UTF-8 英文只需要一个字节就能表示,占用...
python的编码问题
初学者对编码问题一定非常头痛,我开始时也是这样,所以下、记录一下到目前我对python编码问题的理解。 首先,python的默认编码是“ascii” 这是表示英文和数字的常用规范编码。也就是说这个编码方式下只能表示英文,也就是说一旦出现中文,就会出错,无法识别。    先说一下python的文件编码大致处理流程,写完代码后,系统会按默认的编码(即ASCII)将你的代码进行编译,编译成计算机能看
Python的编码问题
Python的编码问题一般在有中文的情况下会出现。这里的Python文件在Windows环境下运行的。当Python文件不含中文时,无论.py文件是ANIC/ASCII格式还是utf-8格式,在cmd中运行时都能得到正常的结果,但是.py文件里含中文时,直接编译就会出现问题了。这里主要有两种情况:        1. .py文件是ANIC/ASCII格式,在cmd里运行时会报以下错误:    
python 编码问题
1.python编码   python2 默认编码为 ASCII    python3 默认编码为 UTF-8    查看python默认编码 2. ASCII    ASCII(American Standard Information for Information Interchange)是单字节码,可以表示256种不同的字符,英文是没有问题的,但是中文就不够用了。 3.UTF-8...
浅析Python编码问题
首先这些问题只有在python2.X版本出现,因为3.X版本中python环境就只有unicode类型的字符串了,即所有程序中处理的都会自动转换 成unicode字符串。那么2.X的python程序开发中如何避免和理清编码问题呢?首先要保持一个良好的统一规则,不然一切都是白扯了,统一都用 utf-8是最好的。 1.处理非ASCII编码 Python的默认编码是ascii编码,当py
[Python] 编码问题
文章目录编码问题Python编程 编码问题 【背景】 计算机只能处理数字,文字转换为数字才能处理 计算机中8bit作为一个字节,所以一个字节能表示最大的数字就是255 常用编码 说明 问题及其他 ASCII 一个字节可以表示完26个字母-&amp;gt;ASCII(一个字节)编码就成为美国人的标准编码 ASCII用于中文明显不够,中文不止255个汉字 GB2312 用两个字节表示一...
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法