Apriori算法挖掘相关关系

怎么使用Apriori算法挖掘网址间的相关关系,
需求:某网站村里大量的用户访问记录,采用关联规则算法-Apriori算法
挖掘网址间的相关关系
步骤:(1)对用户IP进行去重
(2)根据去重后的用户IP找出对应的浏览网址。
(3)采用Apiori算法挖掘各网址间的相关关系。
(4)分析结果
求一下代码。
数据在这里:https://download.csdn.net/download/juziqing990/87809201

# 导入所需的库
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

from collections import defaultdict
from mlxtend.preprocessing import TransactionEncoder

# 读取数据文件,并进行数据预处理
data = pd.read_csv('acc_records.csv',encoding='gbk')
df =  pd.DataFrame(data)

# 以用户IP分组 组成URL项集
data = data.groupby('用户IP')['URL'].apply(list).reset_index()
# 将url项集放入列表中
k = 0
url_lst = []
for ip in ips:
    url_lst.append(ip_urls[ip])

print(url_lst)

# 转换为模型可接受数据
TE = TransactionEncoder()
one_hot_records = TE.fit(url_lst).transform(url_lst)
one_hot_records
# 输出频繁项集
TE.columns_
df = pd.DataFrame(one_hot_records, columns=TE.columns_)
frequent_itemsets = apriori(df,min_support=0.05,use_colnames=True)
frequent_itemsets.sort_values(by='support',ascending=False,inplace=True)
frequent_itemsets
# 强关联规则
association_rule = association_rules(frequent_itemsets,metric='confidence',min_threshold=0.9)
association_rule.sort_values(by='leverage',ascending=False,inplace=True)
print(association_rule)

img

img

答案由GPT-4Plus大模型(语音)与博主@晓码自在合作编写:

这里是使用Apriori算法挖掘网址相关关系的Python代码实现:

python
import json
from collections import defaultdict

# 读取用户访问记录,去重
with open('user_log.json') as f:
    user_log = json.load(f)
user_set = set()
for log in user_log:
    user_set.add(log['user_id'])
user_list = list(user_set)

# 构建用户-网址矩阵
user_web_mat = defaultdict(set)
for log in user_log:
    if log['user_id'] in user_list:
        user_web_mat[log['user_id']].add(log['web_id'])

# 计算各个网址的支持度        
web_sup_count = defaultdict(int)
for web_set in user_web_mat.values():
    for web in web_set:
        web_sup_count[web] += 1

# 设置最小支持度为5       
min_sup = 5  

# 初始化频繁项集列表 
freq_item_list = []

# 循环生成频繁项集
for k in range(2, len(user_list)): 
    cand_item_set = set()
    
    for i in range(len(freq_item_list[-1])):
        for j in range(i+1, len(freq_item_list[-1])):
            l1 = list(freq_item_list[-1][i])         
            l2 = list(freq_item_list[-1][j])
            l1.sort(); l2.sort()
            if l1[0:k-2] == l2[0:k-2]:  
                cand_item_set.add(tuple(l1+l2))
    
    # 过滤非频繁项集
    freq_item_list.append([])
    for item in cand_item_set:
        count = 0
        for user in user_list:
            if set(item).issubset(user_web_mat[user]):  
                count += 1 
        if count >= min_sup:
            freq_item_list[-1].append(item)
            
# 结果分析与输出  
for item_set in freq_item_list:
    for item in item_set:
        print('项集:%s,支持度:%d' % (str(item), web_sup_count[item[0]]))  

代码解释:

  1. 读取用户访问日志,进行去重得到独立用户列表user_list
  2. 构建用户-网址矩阵user_web_mat,表示每个用户访问的网址集合
  3. 统计各个网址的支持度web_sup_count,即被多少用户访问
  4. 设置最小支持度min_sup,默认为5
  5. 循环生成频繁项集:

(1)生成候选项集cand_item_set
(2)过滤非频繁项集,得到当前循环的频繁项集freq_item_list

  1. 输出结果,显示每个频繁项集及其支持度

  2. 分析结果,可以看出哪些网址之间存在较强的相关关联规则。

这个代码实现了使用Apriori算法对用户访问日志进行关联分析的完整过程。通过设置不同的最小支持度,可以发现不同强度的规则。

还有一点就是你的数据连接进不去.

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
使用Apriori算法挖掘网址间的相关关系,可以按照以下步骤:

  1. 对用户IP进行去重,得到不重复的用户IP列表。可以使用Python的set()函数进行去重操作,代码如下:
with open('data.txt', 'r') as f:
    lines = f.readlines()

ips = set()
for line in lines:
    ip, url = line.strip().split(',')
    ips.add(ip)

print("去重后的用户IP数:", len(ips))
  1. 根据去重后的用户IP,找出对应的浏览网址。可以使用字典来记录用户IP和其浏览的网址列表,代码如下:
ip_urls = {}
for ip in ips:
    urls = []
    for line in lines:
        curr_ip, url = line.strip().split(',')
        if curr_ip == ip:
            urls.append(url)
    ip_urls[ip] = urls

print("IP和对应的网址列表:", ip_urls)
  1. 采用Apriori算法挖掘各网址间的相关关系。可以使用Python的mlxtend库中的Apriori算法实现,安装命令为:pip install mlxtend。代码如下:
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori

te = TransactionEncoder()
te_ary = te.fit([ip_urls[ip] for ip in ips]).transform([ip_urls[ip] for ip in ips])
df = pd.DataFrame(te_ary, columns=te.columns_)

frequent_itemsets = apriori(df, min_support=0.1, use_colnames=True)
print("频繁项集:", frequent_itemsets)

其中,min_support参数表示最小支持度,即项集在所有数据中出现的概率不能小于该值。use_colnames=True表示使用列表名字而不是True/False作为列名。

  1. 分析结果。最终得到频繁项集,可以进一步分析其中的强关联规则,例如可以使用lift、confidence等指标评价规则的好坏。代码如下:
from mlxtend.frequent_patterns import association_rules

rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
print("强关联规则:", rules)

其中,metric参数表示评价规则的指标,常见的还有confidence、support等。min_threshold参数表示指标的最小阈值,需要根据实际情况进行设置。

完整代码如下:

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules

with open('data.txt', 'r') as f:
    lines = f.readlines()

# 对用户IP去重
ips = set()
for line in lines:
    ip, url = line.strip().split(',')
    ips.add(ip)

print("去重后的用户IP数:", len(ips))

# 根据用户IP找出对应的网址
ip_urls = {}
for ip in ips:
    urls = []
    for line in lines:
        curr_ip, url = line.strip().split(',')
        if curr_ip == ip:
            urls.append(url)
    ip_urls[ip] = urls

print("IP和对应的网址列表:", ip_urls)

# 挖掘关联规则
te = TransactionEncoder()
te_ary = te.fit([ip_urls[ip] for ip in ips]).transform([ip_urls[ip] for ip in ips])
df = pd.DataFrame(te_ary, columns=te.columns_)

frequent_itemsets = apriori(df, min_support=0.1, use_colnames=True)
print("频繁项集:", frequent_itemsets)

rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
print("强关联规则:", rules)

如果我的回答解决了您的问题,请采纳!

可以借鉴下

from apyori import apriori
# 提取'文章类别'列数据,调用 apriori() 函数,设置最小支持度为 0.1 ,使用默认最小置信度
results = apriori(adjusted_data['文章类别'], min_support = 0.1)
# 遍历结果数据
for result in results:
    # 获取支持度,并保留 3 位小数
    support = round(result.support, 3)

    # 遍历ordered_statistics对象
    for rule in result.ordered_statistics:
        # 获取前件和后件并转成列表
        head_set = list(rule.items_base)
        tail_set = list(rule.items_add)

        # 跳过前件为空的数据
        if head_set == []:
                continue
        # 将前件、后件拼接成关联规则的形式
        related_catogory = str(head_set) + '→' + str(tail_set)

        # 提取置信度,并保留 3 位小数
        confidence = round(rule.confidence, 3)
        # 提取提升度,并保留 3 位小数
        lift = round(rule.lift, 3)

        # 查看强关联规则,支持度,置信度,提升度
        print(related_catogory, support, confidence, lift)
# 设置空的置信度列表
confidences_list = []

# 调用 apriori() 函数,生成关联规则
results = apriori(adjusted_data['文章类别'], min_support=0.1)
# 遍历统计列表中的关联规则,提取置信度
for result in results:
    for rule in result.ordered_statistics:
        # 获取前件并转成列表
        head_set = list(rule.items_base)
        # 跳过前件为空的数据
        if head_set == []:
                continue
        # 提取置信度,并保留 3 位小数
        confidence = round(rule.confidence, 3)
        # 将置信度写入置信度列表
        confidences_list.append(confidence)
# 查看置信度列表
confidences_list


以下是一个使用Python的Apriori算法实现网址间关联关系挖掘的示例代码:

# 导入所需的库
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

# 读取数据文件,并进行数据预处理
data = pd.read_csv('user_data.csv')
data.drop_duplicates(subset=['user_ip', 'url'], inplace=True)
data = data.groupby('user_ip')['url'].apply(list).reset_index()

# 特征提取
def get_top_n_urls(urls, n):
    url_count = {}
    for url_list in urls:
        for url in url_list:
            if url not in url_count:
                url_count[url] = 1
            else:
                url_count[url] += 1
    url_count_sorted = sorted(url_count.items(), key=lambda x: x[1], reverse=True)
    top_n_urls = [x[0] for x in url_count_sorted[:n]]
    return top_n_urls

data['url'] = data['url'].apply(lambda x: get_top_n_urls(x, 10))

# 构建关联规则
def encode_urls(urls, top_n_urls):
    url_encoding = []
    for url in top_n_urls:
        if url in urls:
            url_encoding.append(1)
        else:
            url_encoding.append(0)
    return url_encoding

data['url_encoding'] = data['url'].apply(lambda x: encode_urls(x, top_n_urls))
top_n_urls = get_top_n_urls(data['url'], 10)
data_encoded = pd.DataFrame(data['url_encoding'].values.tolist(), columns=top_n_urls)

frequent_itemsets = apriori(data_encoded, min_support=0.05, use_colnames=True)
rules = association_rules(frequent_itemsets, metric='lift', min_threshold=1)

# 输出关联规则
print(rules)

jiyugpt
要使用Apriori算法挖掘网址间的相关关系,你可以按照以下步骤进行操作:

导入所需的库:


import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

加载数据:

data = pd.read_csv('data.csv')

对用户IP进行去重:

unique_ips = data['IP'].unique()

根据去重后的用户IP找出对应的浏览网址:

transactions = []
for ip in unique_ips:
    websites = data[data['IP'] == ip]['Website'].tolist()
    transactions.append(websites)

将数据进行编码:


def encode_items(transaction_list):
    encoded_list = []
    for transaction in transaction_list:
        encoded_transaction = []
        for website in transaction:
            encoded_transaction.append(str(website))
        encoded_list.append(encoded_transaction)
    return encoded_list
encoded_transactions = encode_items(transactions)

使用Apriori算法挖掘关联规则:

df = pd.DataFrame(encoded_transactions)
frequent_itemsets = apriori(df, min_support=0.1, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)

分析结果:
你可以根据关联规则的支持度、置信度和提升度等指标来分析结果,并根据具体需求进行进一步的解释和应用。
请注意,上述代码示例中使用了mlxtend库中的apriori和association_rules函数来实现Apriori算法。你可以通过使用pip命令安装该库:

pip install mlxtend。

此外,你需要将数据文件data.csv放置在代码运行的当前工作目录下,或根据你的实际情况修改数据文件的路径。