数据挖掘(七)

数据挖掘(七)

文章目录

    • 数据挖掘(七)
      • 加载数据集
        • 用现有模型进行分类
        • 构建网络
      • 寻找子图
        • 连通分支

社交网络具有很高的商业价值,比如QQ、微信等拥有大量活跃用户的应用,通过投放广告可以获得不菲的收入。对于网站来说,如果想要提高用户留存率,我们要有用户感兴趣的人或内容。很多事物都可以用图来表示,我们可以使用连通分支把大图分为有意义的小图。根据相似度,把大数据集分为几个子集。

加载数据集

本文根据社交网络用户的好友信息,向他们推荐好友。如果两个用户有共同的好友,那么这两个人相似度很高,值得向彼此推荐。我们可以通过微博等开发者平台获取社交网络数据,寻找喜欢同一个话题的用户,从中选一部分,再获取这些人的好友列表。有了这些数据后,就能根据两个用户共同拥有的好友数量,计算他们的相似度。

用现有模型进行分类
  1. 首先需要保存朴素贝叶斯分类模型,我们可以使用joblib库保存模型,将模型输出到指定目录。
import os 
import json
import joblib
import numpy as np
from sklearn.base import TransformerMixin
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction import DictVectorizer
from sklearn.naive_bayes import BernoulliNB
from nltk import word_tokenizeclass NLTKBOW(TransformerMixin):def fit(self, X, y=None):return selfdef transform(self, X):return [{word:True for word in word_tokenize(document)} for document in X]data_folder = os.path.join(os.getcwd(), 'data_mining', 'twitter')
input_filename = os.path.join(data_folder, 'python_tweets.json')
class_filename = os.path.join(data_folder, 'python_classes.json')
output_filename = os.path.join(data_folder, 'python_context.pkl')
tweets = []
classes = []
with open(input_filename) as inf:for line in inf:if len(line.strip()) == 0:continuetweets.append(json.loads(line)['text'])
with open(class_filename) as inf:classes = json.load(inf) 
tweet_list = np.array(tweets)
class_list = np.array(classes)
pipeline = Pipeline([('词袋模型转换', NLTKBOW()), ('字典列表转矩阵', DictVectorizer()), ('朴素贝叶斯分类器', BernoulliNB())])
model = pipeline.fit(tweet_list, class_list)
joblib.dump(model, output_filename)
  1. 加载模型,然后重建NLTKBOW类,因为这是个定制的类,无法直接用joblib加载。我们使用joblib的load方法加载模型,然后调用模型的predict函数预测消息是否与编程语言相关。
import os 
import json
import joblib
import numpy as np
from sklearn.base import TransformerMixin
from nltk import word_tokenizeclass NLTKBOW(TransformerMixin):def fit(self, X, y=None):return selfdef transform(self, X):return [{word:True for word in word_tokenize(document)} for document in X]tweets = []
data_folder = os.path.join(os.getcwd(), 'data_mining', 'twitter')
input_filename = os.path.join(data_folder, 'python_tweets.json')
with open(input_filename) as inf:for line in inf:if len(line.strip()) == 0:continuetweets.append(json.loads(line)['text'])
tweet_list = np.array(tweets)
model_filename = os.path.join(data_folder, 'python_context.pkl')
# 加载模型
context_classifier = joblib.load(model_filename)
# 如果第i条消息与编程语言相关,那么y_pred中的第i项为1,否则为0
y_pred = context_classifier.predict(tweet_list)
print(y_pred)
构建网络
  1. 获取每个用户的好友,好友的定义可以是用户正在关注的人。从初始用户出发,找到每个人的好友保存起来,删除没有好友的孤家寡人。对于这些人,无法按照既定逻辑向他们推荐好友,也许可以从他们发表的消息以及关注他们的人那里发现有用的线索。考虑到要根据共同的好友向用户推荐他们可能感兴趣的人,因此就查找有共同好友的人,找到现有用户的好友,从他们中间找出在现有用户中间有更多好友的人。我们需要统计这些用户的好友数量,遍历所有用户的好友列表,统计每个好友的出现次数。计算完成后,根据好友数量的字典进行排序,找到在当前用户中,关系网最大、最密集的人。
  2. 我们通过获取用户列表和他们的好友列表,使用这些存在的好友关系的数据就可以构建一张图。图是由一组顶点和边组成。顶点通常表示对象比如用户,边表示用户A是用户B的好友。由于顶点的顺序是有特殊含义,该图称为有向图,因为用户A是用户B的好友并不代表用户B是用户A的好友。我们可以使用NetworkX库实现图关系的可视化,draw函数可以为创建好的图绘制图像。
# 使用NetworkX创建有向图
import networkx as nx
G = nx.DiGraph()
# nodes_for_adding是可迭代的集合,把核心用户作为顶点添加到图中
G.add_nodes_from(nodes_for_adding)
  1. 计算两个列表之间的相似度有多种方法。比如两个用户来说,可以统计他们好友列表中共同好友数量。然而好友更多的用户,共同好友数量通常也更多。于是可以再除以他们拥有的不同好友的数量实现数据的规范化,得到的正是杰卡德相似系数。该系数总是在0到1之间,代表两者重合的比例。计算杰卡德相似系数时,需要用两个集合交集的元素数量除以两个集合并集的元素数量。
def compute_similarity(friends1, friends2):return len(friends1 & friends2)/len(friends1 | friends2)

寻找子图

利用相似度函数求出每个用户与其他用户之间的相似度,根据相似度进行排序,找出与当前用户最相似的,把他推荐给当前用户。我们也可以找出批量相似度很大的用户,可以把这些用户组成一个群,向他们定向投放广告。找出这些相似用户群的任务叫做聚类分析。聚类分析缺乏一个事实标准,评价结果时,只好根据经验来看分簇结果是否合乎情理。聚类分析另一个复杂之处在于不能用实现标注好的数据进行训练,只好在使用聚类数学模型的基础上求得近似的分组结果,而不是按照用户所希望的那样将数据分成明确的类别。

连通分支
  1. 一种最简单的聚类方法就是找到图中的连通分支。一个连通分支是图中由边连接在一起的一组顶点,不要求顶点之间必须两两连接,但是连通分支的任意两个顶点之间至少存在一条路径。连通分支计算时不考虑边的权重,只检查边是否存在。因为不论权重高低,只要有边连接的顶点就会被算到连通分支里,而一个连通分支被看作是一簇具有相似特点的用户,为了保证簇内用户具有较高的相似度,需要事先把权重低的边过滤掉。
# 使用NetworkX提供的函数寻找图中的连通分支,sub_graphs是生成器
sub_graphs = nx.connected_component_subgraphs(G)
# 找出连通分支的总数
n_subgraphs = nx.number_connected_components(G)
  1. 连通分支查找算法依赖于阈值参数,阈值控制着找到的连通分支数量和大小。我们可以事先确定什么样的结果才是令人满意的,再根据理想中的结果来寻找选取参数的准则。作为一般性规则,它应该能够使得同一连通分支内的个体尽可能相似,不同簇内的个体尽可能不相似。轮廓系数是对这两点的量化方法,计算公式如下,a是簇内距离,表示与簇内其他个体之间的平均距离。b为簇间距离,也就是与最近簇内各个个体之间的平均距离。总轮廓系数为每个个体轮廓系数的均值。总轮廓系数接近最大值1时,表示每个簇内的个体相似度很高,不同簇之间距离较远。

s = b − a m a x ( a , b ) s = \frac{b - a}{max(a, b)} s=max(a,b)ba

  1. scikit-learn库提供了计算轮廓系数的函数,函数接收的是距离矩阵,轮廓系数的定义要求至少由两个顶点才能计算距离。
from sklearn.metrics import silhouette_score

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习-迁移学习

深度学习中的迁移学习是通过在大规模数据上训练的模型,将其知识迁移到数据相对较少的相关任务中,能显著提升目标任务的模型性能。 一、迁移学习的核心概念 源任务(Source Task)与目标任务(Target Task)&…

H7-TOOL自制Flash读写保护算法系列,为兆易创新GD32E23X制作使能和解除算法,支持在线烧录和脱机烧录使用(2024-10-29)

说明: 很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。 实际上当前已经发布的TOOL版本,已经自制很多了。但是依然有些厂家还没自制,所以陆续开始…

flutter 写个简单的界面

起因, 目的: 来源: 客户需求。 着急要,我随便写的,应付一下。 过程: 略,直接看代码,看注释。 代码 1 xxx import package:flutter/material.dart;void main() {runApp(const MyApp()); }// # class MyApp extends…

.NET 8 中 Entity Framework Core 的使用

本文代码:https://download.csdn.net/download/hefeng_aspnet/89935738 概述 Entity Framework Core (EF Core) 已成为 .NET 开发中数据访问的基石工具,为开发人员提供了强大而多功能的解决方案。随着 .NET 8 和 C# 10 中引入的改进,开发人…

推荐一款可视化和检查原始数据的工具:RawDigger

RawDigger是一款强大的工具,旨在可视化和检查相机记录的原始数据。它被称为一种“显微镜”,使用户能够深入分析原始图像数据,而不对其进行任何更改。RawDigger并不是一个原始转换器,而是一个帮助用户查看将由转换器使用的数据的工…

第三十三章 Vue路由进阶路由模块封装

目录 一、引言 二、完整代码 main.js index.js App.vue Find.vue My.vue 一、引言 在上一个章节中,我们将所有的路由配置都堆在main.js中来实现路径组件的路由,这样做的话非常不利于我们后期对项目的维护。因此正确的做法是将路由模块抽离出来&a…

基于java+SpringBoot+Vue的新闻推荐系统设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

指派问题的求解

实验类型:◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的:学会使用Matlab求解指派问题。 实验内容:利用Matlab编程实现枚举法求解指派问题。 实验例题:有5人分别对应完成5项工作,其各自的耗费如下表所示&#…

商品满减、限时活动、折扣活动的计算最划算 golang

可以对商品的不同活动(如满减、限时价和折扣)进行分组,并在购物车中显示各个活动标签下的最优价格组合。以下代码将商品按活动类别进行分组计算,并输出在购物车中的显示信息。 package mainimport ("fmt""math&qu…

AWS RDS Oracle hit ORA-39405

报错信息: ORA-39405: Oracle Data Pump does not support importing from a source database with TSTZ version 42 into a target database with TSTZ version 35. 分析过程: 这个报错是由于timezone_file的版本,源端比目标端高&#xf…

显卡服务器和普通服务器之间的区别有哪些?

显卡服务器也被称之为GPU服务器,显卡服务器与普通的服务器之间有着很明显的区别,下面就让我们共同来了解一下吧! 普通服务器的主要处理器通常都是配备的中央处理器,可以用于执行大部分通用计算任务和操作系统的管理;而…

下载安装COPT+如何在jupyter中使用(安装心得,windows,最新7.2版本)

目录 1.到杉树科技官网申请下载COPT 2.安装COPT&配置许可文件 3.在jupyter中使用COPT的python接口 最近看到一本和数学建模有关的新书:《数学建模与数学规划:方法、案例及编程实战》,作为数学建模老手,肯定要学习一下&…

Python自动化运维:技能掌握与快速入门指南

#编程小白如何成为大神?大学生的最佳入门攻略# 在当今快速发展的IT行业中,Python自动化运维已经成为了一个不可或缺的技能。本文将为您详细介绍Python自动化运维所需的技能,并提供快速入门的资源,帮助您迅速掌握这一领域。 必备…

深入理解跨域资源共享(CORS)安全问题原理及解决思路

目录 引言 CORS 基础 CORS 安全问题原理 解决思路 结论 引言 跨域资源共享(CORS, Cross-Origin Resource Sharing)是现代Web应用中不可或缺的一部分,特别是在前后端分离的架构中。CORS允许一个域上的Web应用请求另一个域上的资源&#…

基于“互联网+”医养结合的智慧养老实训室建设方案

一、建设背景 根据国家统计局的数据,截至2023年末,我国60岁及以上的老年人口已达到29,697万人,占总人口的21.1%;其中,65岁及以上的人口为21,676万人,占总人口的15.4%。这一数据表明,我国正面临…

为什么需要MQ消息系统,mysql 不能满足需求吗?

大家好,我是锋哥。今天分享关于【为什么需要MQ消息系统,mysql 不能满足需求吗?】面试题?希望对大家有帮助; 为什么需要MQ消息系统,mysql 不能满足需求吗? 1000道 互联网大厂Java工程师 精选面试…

C++编程法则365天一天一条(303)异步编程之std::promise和std::future

文章目录 主要特点基本用法示例代码使用场景注意事项std::promise 是 C++11 引入的一个模板类,位于 <future> 头文件,用于实现异步操作中的值传递和异常传递。它与 std::future 一起使用,提供了一种机制,使得一个线程可以将结果或异常传递给另一个线程。 主要特点 异…

计算机网络-以太网小结

前导码与帧开始分界符有什么区别? 前导码--解决帧同步/时钟同步问题 帧开始分界符-解决帧对界问题 集线器 集线器通过双绞线连接终端, 学校机房的里面就有集线器 这种方式仍然属于共享式以太网, 传播方式依然是广播 网桥: 工作特点: 1.如果转发表中存在数据接收方的端口信息…

C/C++常用编译工具链:GCC,Clang

目录 GNU Compiler Collection GCC的优势 编译产生的中间文件 Clang Clang的特点 什么是LLVM&#xff1f; Clang编译过程中产生的中间表示文件 关于Clang的调试 C 编译工具链中有几个主要的编译工具&#xff0c;包括&#xff1a; GNU Compiler Collection (GCC…

NNLM——预测下一个单词

一、原理篇 NNLM&#xff08;Neural Network Language Model&#xff0c;神经网络语言模型&#xff09;是一种通过神经网络进行语言建模的技术&#xff0c;通常用于预测序列中的下一个词。 NNLM的核心思想是使用词嵌入&#xff08;word embedding&#xff09;将词转换为低维向…