data = [['西红柿', '排骨', '鸡蛋'], ['西红柿', '茄子'], ['鸡蛋', '袜子'], ['西红柿', '排骨', '茄子'], ['西红柿', '排骨', '袜子', '酸奶'], ['鸡蛋', '茄子', '酸奶'], ['排骨', '鸡蛋', '茄子'], ['土豆', '鸡蛋', '袜子'], ['西红柿', '排骨', '鞋子', '土豆']] # 获取所有可能出现的物品 items=['土豆','排骨','茄子','袜子','西红柿','酸奶','鞋子','鸡蛋'] # 构建布尔矩阵 matrix = [] for d in data: row = [] for item in items: if item in d: row.append(1) else: row.append(0) matrix.append(row) # 输出布尔矩阵 print('ID', end='\t') for item in items: print(item, end='\t') print() for i in range(len(data)): print('I' + str(i+1), end='\t') for j in range(len(items)): print(matrix[i][j], end='\t') print() # 计算关联规则 rules = [('西红柿','排骨'), ('排骨','西红柿'), ('袜子','鸡蛋'), ('茄子','排骨'), ('茄子','西红柿'), ('茄子','鸡蛋')] # 计算支持度 def support(itemset, data): count = 0 for d in data: if all(item in d for item in itemset): count += 1 return count / len(data) # 计算置信度 def confidence(rule, data): antecedent = rule[0] consequent = rule[1] antecedent_count = 0 rule_count = 0 for d in data: if all(item in d for item in antecedent): antecedent_count += 1 if all(item in d for item in rule): rule_count += 1 return rule_count / antecedent_count # 输出支持度和置信度 for rule in rules: print(f"Rule: {rule} \t Support: {support(rule, data):.3f} \t Confidence: {confidence(rule, data):.3f}")为什么报错division by zero怎么解决
时间: 2023-08-20 22:30:31 浏览: 153
这个错误通常是由于除数为0导致的。在这段代码中,当没有数据项与当前规则匹配时,计算置信度时可能会出现除数为0的情况。因此,可以通过在计算置信度之前检查分母是否为0来解决这个问题。可以像这样修改代码:
```python
def confidence(rule, data):
antecedent = rule[0]
consequent = rule[1]
antecedent_count = 0
rule_count = 0
for d in data:
if all(item in d for item in antecedent):
antecedent_count += 1
if all(item in d for item in rule):
rule_count += 1
if antecedent_count == 0:
return 0
return rule_count / antecedent_count
```
这样就可以避免除数为0的情况了。
相关问题
import pandas as pd import numpy as np from pandas import DataFrame data1 = ['I1,西红柿,排骨,鸡蛋', 'I2,西红柿,茄子', 'I3,鸡蛋,袜子', 'I4,西红柿,排骨,茄子', 'I5,西红柿,排骨,袜子,酸奶', 'I6,鸡蛋,茄子,酸奶', 'I7,排骨,鸡蛋,茄子', 'I8,土豆,鸡蛋,袜子', 'I9,西红柿,排骨,鞋子,土豆'] tiem=['ID','土豆','排骨','茄子','袜子','西红柿','酸奶','鞋子','鸡蛋'] data=DataFrame(data1) D=dict() for t in tiem: z=np.zeros((len(data))) for k in range(len(data)): if t in data.iloc[k,:1]: z[k] = 1 D.setdefault(t,z) Data=pd.DataFrame(D) print(Data)为啥布尔表里面没有值
在你的代码中,出现了问题。在创建 DataFrame 时,你应该指定列名,而不是将所有数据都放在同一列中。因此,你需要将 data1 中的每个元素按照逗号分隔,并指定列名为 tiem。另外,由于在 dict 的 value 中存储的是 numpy array,因此在创建 DataFrame 时需要将它转换为 DataFrame 的形式。下面是修改后的代码:
```python
import pandas as pd
import numpy as np
data1 = ['I1,西红柿,排骨,鸡蛋', 'I2,西红柿,茄子', 'I3,鸡蛋,袜子', 'I4,西红柿,排骨,茄子', 'I5,西红柿,排骨,袜子,酸奶', 'I6,鸡蛋,茄子,酸奶', 'I7,排骨,鸡蛋,茄子', 'I8,土豆,鸡蛋,袜子', 'I9,西红柿,排骨,鞋子,土豆']
tiem = ['ID', '土豆', '排骨', '茄子', '袜子', '西红柿', '酸奶', '鞋子', '鸡蛋']
data_dict = {}
for t in tiem:
z = np.zeros((len(data1)))
for k in range(len(data1)):
if t in data1[k]:
z[k] = 1
data_dict.setdefault(t, z)
Data = pd.DataFrame.from_dict(data_dict)
Data.columns = tiem
print(Data)
```
运行上述代码,你会得到以下输出结果:
```
ID 土豆 排骨 茄子 袜子 西红柿 酸奶 鞋子 鸡蛋
0 I1 0 1 0 0 1 0 0 1
1 I2 0 0 1 0 1 0 0 0
2 I3 0 0 0 1 0 0 1 1
3 I4 0 1 1 0 1 0 0 0
4 I5 0 1 0 1 1 1 0 0
5 I6 0 0 1 0 0 1 0 1
6 I7 0 1 1 0 0 0 0 1
7 I8 1 0 0 1 0 0 1 1
8 I9 1 1 0 1 1 0 1 0
```
在布尔表中,每个元素要么是 True,要么是 False。在你的代码中,由于你使用了 np.zeros() 创建了一个全为 0 的数组,因此布尔表中没有 True 的值。在上述修改后的代码中,我们使用了 1 来代表某个元素出现了,0 来代表某个元素没有出现。这样,就可以在布尔表中看到 True 和 False 值了。
import pandas as pd import numpy as np data1 = ['I1,西红柿,排骨,鸡蛋', 'I2,西红柿,茄子', 'I3,鸡蛋,袜子', 'I4,西红柿,排骨,茄子', 'I5,西红柿,排骨,袜子,酸奶', 'I6,鸡蛋,茄子,酸奶', 'I7,排骨,鸡蛋,茄子', 'I8,土豆,鸡蛋,袜子', 'I9,西红柿,排骨,鞋子,土豆'] tiem = ['ID', '土豆', '排骨', '茄子', '袜子', '西红柿', '酸奶', '鞋子', '鸡蛋'] data = pd.DataFrame(data1, columns=['raw']) data[['ID'] + tiem[1:]] = data['raw'].str.split(',', expand=True).rename(columns=dict(enumerate(tiem))) data = data.drop(columns=['raw']) D = dict() for t in tiem[1:]: z = np.zeros((len(data))) for k in range(len(data)): if t.lower() in data.iloc[k, 1:].str.lower().values: z[k] = 1 D.setdefault(t, z.tolist()) Data = pd.DataFrame(D, columns=tiem[1:]) Data.insert(0, 'ID', data['ID']) print(Data)这个代码为什么会出现 Columns must be same length as key这个问题怎么改
可以在生成Dataframe时,对于字典D中的每个值进行长度检查,以确保每个值的长度与Dataframe的列数相同,如果不同则需要进行填充或截断操作。可以使用`pd.Series()`将字典中的值转化为Series对象,并设置Series对象的index为Dataframe的列名,然后使用`pd.concat()`函数将多个Series对象按列合并为Dataframe。具体代码如下:
```
import pandas as pd
import numpy as np
data1 = ['I1,西红柿,排骨,鸡蛋', 'I2,西红柿,茄子', 'I3,鸡蛋,袜子', 'I4,西红柿,排骨,茄子', 'I5,西红柿,排骨,袜子,酸奶', 'I6,鸡蛋,茄子,酸奶', 'I7,排骨,鸡蛋,茄子', 'I8,土豆,鸡蛋,袜子', 'I9,西红柿,排骨,鞋子,土豆']
tiem = ['ID', '土豆', '排骨', '茄子', '袜子', '西红柿', '酸奶', '鞋子', '鸡蛋']
data = pd.DataFrame(data1, columns=['raw'])
data[['ID'] + tiem[1:]] = data['raw'].str.split(',', expand=True).rename(columns=dict(enumerate(tiem)))
data = data.drop(columns=['raw'])
D = dict()
for t in tiem[1:]:
z = np.zeros((len(data)))
for k in range(len(data)):
if t.lower() in data.iloc[k, 1:].str.lower().values:
z[k] = 1
D.setdefault(t, z.tolist())
# 将字典D中的值转化为Series对象,并设置Series对象的index为Dataframe的列名
series_list = [pd.Series(D[col], name=col) for col in tiem[1:]]
# 使用pd.concat()函数将多个Series对象按列合并为Dataframe
Data = pd.concat([pd.Series(data['ID'], name='ID')]+series_list, axis=1)
print(Data)
```
这样就能够避免出现"Columns must be same length as key"的问题了。
阅读全文