基于ThinkPHP 5~8兼容的推荐算法类实现,
在现代推荐系统中,随着用户量和物品量的增长,传统的推荐算法可能会面临性能瓶颈。本文将介绍如何基于 ThinkPHP 实现一个高性能的推荐系统,结合显性反馈(如兴趣选择)、隐性反馈(如观看时长、评论、点赞、搜索等)、行为序列分析和关键词拆分(支持中文)等功能,并通过优化方案支持大规模用户场景。
目录
推荐系统简介
数据库设计
推荐算法类的实现
优化方案
总结与扩展
推荐系统简介
推荐系统的目标是根据用户的历史行为,预测用户可能感兴趣的物品。常见的推荐算法包括:
基于内容的推荐:根据物品的属性推荐相似物品。
协同过滤:根据用户的行为推荐相似用户喜欢的物品。
混合推荐:结合多种推荐算法,提升推荐效果。
本文将重点介绍基于协同过滤的推荐算法,并结合显性反馈和隐性反馈数据。
数据库设计
1. 用户表 (users
)
存储用户的基本信息。
CREATE TABLE users (user_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID,主键,自增',username VARCHAR(50) NOT NULL COMMENT '用户名,唯一标识用户'
) COMMENT='用户表,存储用户的基本信息';
2. 物品表 (items
)
存储物品的基本信息。
CREATE TABLE items (item_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '物品ID,主键,自增',item_name VARCHAR(100) NOT NULL COMMENT '物品名称,唯一标识物品',description TEXT COMMENT '物品描述,用于关键词拆分',tags TEXT COMMENT '物品标签,用于关键词拆分'
) COMMENT='物品表,存储物品的基本信息';
3. 显性反馈表 (explicit_feedback
)
存储用户对物品的显性反馈,如兴趣选择、评分等。
CREATE TABLE explicit_feedback (feedback_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '反馈ID,主键,自增',user_id INT COMMENT '用户ID,外键,关联用户表',item_id INT COMMENT '物品ID,外键,关联物品表',rating INT COMMENT '用户对物品的评分(1-5)',interest_level ENUM('low', 'medium', 'high') COMMENT '用户兴趣选择(低、中、高)',FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE, -- 用户删除时,关联的反馈也删除FOREIGN KEY (item_id) REFERENCES items(item_id) ON DELETE CASCADE -- 物品删除时,关联的反馈也删除
) COMMENT='显性反馈表,存储用户对物品的显性反馈';
4. 隐性反馈表 (implicit_feedback
)
存储用户的隐性行为,如观看时长、评论、点赞、搜索等。
CREATE TABLE implicit_feedback (feedback_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '反馈ID,主键,自增',user_id INT COMMENT '用户ID,外键,关联用户表',item_id INT COMMENT '物品ID,外键,关联物品表',action_type ENUM('view', 'comment', 'like', 'search') COMMENT '行为类型(观看、评论、点赞、搜索)',action_value FLOAT COMMENT '行为值(如观看时长、点赞次数等)',FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE, -- 用户删除时,关联的反馈也删除FOREIGN KEY (item_id) REFERENCES items(item_id) ON DELETE CASCADE -- 物品删除时,关联的反馈也删除
) COMMENT='隐性反馈表,存储用户的隐性行为';
5. 行为序列表 (behavior_sequence
)
存储用户的行为序列,按时间排序。
CREATE TABLE behavior_sequence (sequence_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '序列ID,主键,自增',user_id INT COMMENT '用户ID,外键,关联用户表',item_id INT COMMENT '物品ID,外键,关联物品表',action_type ENUM('view', 'comment', 'like', 'search') COMMENT '行为类型(观看、评论、点赞、搜索)',action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '行为发生时间,默认为当前时间',FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE, -- 用户删除时,关联的行为也删除FOREIGN KEY (item_id) REFERENCES items(item_id) ON DELETE CASCADE -- 物品删除时,关联的行为也删除
) COMMENT='行为序列表,存储用户的行为序列';
6. 关键词表 (keywords
)
存储从物品描述和标签中提取的关键词。
CREATE TABLE keywords (keyword_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '关键词ID,主键,自增',keyword VARCHAR(50) NOT NULL COMMENT '关键词,用于推荐算法',item_id INT COMMENT '物品ID,外键,关联物品表',FOREIGN KEY (item_id) REFERENCES items(item_id) ON DELETE CASCADE -- 物品删除时,关联的关键词也删除
) COMMENT='关键词表,存储从物品描述和标签中提取的关键词';
ThinkPHP 推荐算法类
以下是基于 ThinkPHP 的推荐算法类实现,每行代码都有详细注释。
<?phpnamespace app\common\service;use think\Db;
use think\facade\Cache;class Recommender
{// 获取用户的显性反馈(兴趣选择和评分)private function getExplicitFeedback(int $userId): array{// 查询用户的显性反馈数据return Db::name('explicit_feedback')->where('user_id', $userId) // 过滤指定用户->field('item_id, rating, interest_level') // 选择需要的字段->select(); // 返回查询结果}// 获取用户的隐性反馈(观看时长、评论、点赞、搜索等)private function getImplicitFeedback(int $userId): array{// 查询用户的隐性反馈数据,按物品和行为类型分组return Db::name('implicit_feedback')->where('user_id', $userId) // 过滤指定用户->field('item_id, action_type, SUM(action_value) as total_value') // 选择需要的字段,并计算行为值的总和->group('item_id, action_type') // 按物品和行为类型分组->select(); // 返回查询结果}// 获取用户的行为序列private function getBehaviorSequence(int $userId): array{// 查询用户的行为序列,按时间排序return Db::name('behavior_sequence')->where('user_id', $userId) // 过滤指定用户->order('action_time ASC') // 按行为时间升序排序->field('item_id, action_type, action_time') // 选择需要的字段->select(); // 返回查询结果}// 从物品描述和标签中提取关键词(支持中文)private function extractKeywords(string $text): array{// 使用 jieba-php 分词库进行中文分词$words = \Fukuball\Jieba\Jieba::cut($text); // 将文本拆分为单词$stopWords = ['的', '了', '在', '是', '我']; // 中文停用词列表return array_diff($words, $stopWords); // 去除停用词,返回关键词数组}// 获取物品的关键词private function getItemKeywords(int $itemId): array{// 查询物品的描述和标签$item = Db::name('items')->where('item_id', $itemId) // 过滤指定物品->field('description, tags') // 选择需要的字段->find(); // 返回单行数据$keywords = [];if ($item) {// 从描述和标签中提取关键词$keywords = array_merge($this->extractKeywords($item['description']), // 提取描述中的关键词$this->extractKeywords($item['tags']) // 提取标签中的关键词);}return array_unique($keywords); // 去重后返回关键词数组}// 计算用户相似度(基于显性和隐性反馈)private function calculateUserSimilarity(int $user1, int $user2): float{// 获取用户1的显性反馈$feedback1 = $this->getExplicitFeedback($user1);// 获取用户2的显性反馈$feedback2 = $this->getExplicitFeedback($user2);$dotProduct = 0; // 点积$magnitude1 = 0; // 用户1的模长$magnitude2 = 0; // 用户2的模长// 遍历用户1的反馈数据foreach ($feedback1 as $item) {$itemId = $item['item_id']; // 物品ID$rating1 = $item['rating']; // 用户1的评分$interestLevel1 = $item['interest_level'] === 'high' ? 1 : 0; // 用户1的兴趣选择(高为1,否则为0)// 遍历用户2的反馈数据foreach ($feedback2 as $item2) {if ($item2['item_id'] === $itemId) { // 如果两个用户对同一物品有反馈$rating2 = $item2['rating']; // 用户2的评分$interestLevel2 = $item2['interest_level'] === 'high' ? 1 : 0; // 用户2的兴趣选择(高为1,否则为0)// 计算点积和模长$dotProduct += ($rating1 * $rating2) + ($interestLevel1 * $interestLevel2);$magnitude1 += ($rating1 * $rating1) + ($interestLevel1 * $interestLevel1);$magnitude2 += ($rating2 * $rating2) + ($interestLevel2 * $interestLevel2);}}}$magnitude1 = sqrt($magnitude1); // 用户1的模长$magnitude2 = sqrt($magnitude2); // 用户2的模长if ($magnitude1 == 0 || $magnitude2 == 0) {return 0; // 避免除零错误}return $dotProduct / ($magnitude1 * $magnitude2); // 返回余弦相似度}// 获取与目标用户最相似的用户private function getSimilarUsers(int $targetUserId): array{// 查询所有其他用户$users = Db::name('users')->where('user_id', '<>', $targetUserId) // 过滤掉目标用户->column('user_id'); // 返回用户ID列表$similarities = [];// 遍历所有用户,计算与目标用户的相似度foreach ($users as $userId) {$similarity = $this->calculateUserSimilarity($targetUserId, $userId); // 计算相似度$similarities[$userId] = $similarity; // 存储相似度}arsort($similarities); // 按相似度降序排序return $similarities; // 返回相似用户列表}// 为目标用户推荐物品(基于缓存)public function recommendItems(int $targetUserId, int $numRecommendations = 5): array{$cacheKey = "recommendations_{$targetUserId}"; // 缓存键$recommendations = Cache::get($cacheKey); // 从缓存中获取推荐结果if (!$recommendations) { // 如果缓存中没有推荐结果$similarUsers = $this->getSimilarUsers($targetUserId); // 获取相似用户$recommendations = [];// 遍历相似用户foreach ($similarUsers as $userId => $similarity) {$feedback = $this->getExplicitFeedback($userId); // 获取相似用户的显性反馈// 遍历相似用户的反馈数据foreach ($feedback as $item) {$itemId = $item['item_id']; // 物品ID$rating = $item['rating']; // 评分$interestLevel = $item['interest_level'] === 'high' ? 1 : 0; // 兴趣选择(高为1,否则为0)// 如果目标用户未评价过该物品,且评分或兴趣选择较高if (!isset($this->getExplicitFeedback($targetUserId)[$itemId]) && ($rating >= 4 || $interestLevel)) {if (!isset($recommendations[$itemId])) {$recommendations[$itemId] = 0; // 初始化推荐分数}// 计算推荐分数$recommendations[$itemId] += ($rating * $similarity) + ($interestLevel * $similarity);}}}arsort($recommendations); // 按推荐分数降序排序$recommendations = array_slice($recommendations, 0, $numRecommendations, true); // 返回前N个推荐物品// 缓存推荐结果,有效期1小时Cache::set($cacheKey, $recommendations, 3600);}return $recommendations; // 返回推荐结果}
}
优化方案
1.用户相似度计算的优化
- 离线计算:将用户相似度计算任务放到离线任务中,定期更新相似度矩阵。
- 分块计算:将用户分成多个块,分别计算块内用户的相似度,减少计算量。
- 近似算法:使用局部敏感哈希(LSH)或随机投影等近似算法,快速找到相似用户。
2、推荐物品的优化
- 基于物品的协同过滤:计算物品之间的相似度,推荐与用户历史行为相似的物品。
- 矩阵分解:使用矩阵分解(如SVD)将用户-物品评分矩阵分解为低维矩阵,减少计算量。
- 缓存推荐结果:将推荐结果缓存到Redis等内存数据库中,减少实时计算的压力。
3、数据库查询的优化
- 索引优化:为常用查询字段(如user_id、item_id)添加索引。
- 分库分表:将用户和物品数据分散到多个数据库或表中,减少单表数据量。
- 批量查询:减少数据库查询次数,尽量使用批量查询。
4、引入分布式计算
- 使用分布式计算框架(如Hadoop、Spark)处理大规模数据。
- 将用户相似度计算和推荐任务分布到多个节点上执行。
总结与扩展
通过上述代码和优化方案,可以实现一个高性能的推荐系统,支持大规模用户场景。以下是扩展方向:
- 引入机器学习模型:如矩阵分解(SVD)或深度学习模型,提升推荐效果。
- 实时推荐:根据用户的最新行为动态调整推荐结果。
- 多维度权重:为不同类型的隐性反馈(如观看时长、点赞)设置不同的权重。
希望本文对你理解和实现推荐系统有所帮助!如果有其他问题,欢迎留言讨论。
相关文章:
基于ThinkPHP 5~8兼容的推荐算法类实现,
在现代推荐系统中,随着用户量和物品量的增长,传统的推荐算法可能会面临性能瓶颈。本文将介绍如何基于 ThinkPHP 实现一个高性能的推荐系统,结合显性反馈(如兴趣选择)、隐性反馈(如观看时长、评论、点赞、搜…...
使用Python爬虫实时监控行业新闻案例
目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代,新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…...
kong身份认证插件详解之Basic Auth插件
1.3、Basic Authentication 支持基于用户名和密码的基本认证,通常用于简单的身份验证场景。 1.3.1、环境准备 1.3.1.1、创建一个服务,basic-auth-service curl -i -s -X POST http://localhost:8001/services \--data namebasic-auth-service \--dat…...
Copilot基于企业PPT模板生成演示文稿
关于copilot创建PPT,咱们写过较多文章了: Copilot for PowerPoint通过文件创建PPT Copilot如何将word文稿一键转为PPT Copilot一键将PDF转为PPT,治好了我的精神内耗 测评Copilot和ChatGPT-4o从PDF创建PPT功能 Copilot for PPT全新功能&a…...
用React实现一个登录界面
使用React来创建一个简单的登录表单。以下是一个基本的React登录界面示例: 1. 设置React项目 如果你还没有一个React项目,你可以使用Create React App来创建一个。按照之前的步骤安装Create React App,然后创建一个新项目。 2. 创建登录组…...
前端布局的方式有哪些
前端布局的方式有哪些 在前端开发里,布局就像是装修房子,把不同的东西合理地摆放在合适的位置,让整个空间既美观又实用。下面给你介绍几种常见的前端布局方式: 1. 普通流布局(标准文档流布局) 这就像是按…...
seata集成nacos
#nacos集成nacos并配置mysql数据源 1. 所需依赖 <!--seata 分布式事务--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency> 2. 打开seata目录ÿ…...
第29篇 基于ARM A9处理器用C语言实现中断<五>
Q:怎样设计基于ARM A9处理器的C语言程序使用定时器中断实现实时时钟? A:在上一期的程序中添加A9 Private Timer作为第三个中断源,配置该定时器使其每隔0.01秒产生一次中断。使用该定时器使全局变量time的值递增,并将…...
deepseek多列数据对比,联想到excel的高级筛选功能
目录 1 业务背景 2 deepseek提示词输入 3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题,系统导入的数据和线下的EXCEL数据是否一致,如果不一致,如何快速找到差异值,原来脑海第一反应就是使用公…...
C 程序多线程拆分文件
C 程序多线程拆分文件 在C语言中,实现多线程来拆分文件通常需要借助多线程库,比如 POSIX 线程库(pthread)或者 Windows 的线程库(CreateThread 或类似的函数)。下面我将分别展示在 Linux 和 Windows 环境下…...
mysql 使用 CONCAT、GROUP_CONCAT 嵌套查询出 json 格式数据
tb_factory表由 factory_code 和 factory_name 字段,查询出如下所示效果: {"factory_0001": "工厂1","factory_0002": "工厂2",... } select sql: SELECT CONCAT( "{",GROUP_CONCAT( C…...
Leetcode 2466. Count Ways To Build Good Strings
Problem Given the integers zero, one, low, and high, we can construct a string by starting with an empty string, and then at each step perform either of the following: Append the character ‘0’ zero times.Append the character ‘1’ one times. This can …...
分布式 IO 模块:食品罐装产线自动化与高效运行的推手
在当今竞争激烈的罐装视频生产行业,如何实现产线的自动化与连续性高效运行,成为了众多企业追求的核心目标。明达技术推出的MR30分布式 IO 模块作为一种先进的工业控制技术,正逐渐崭露头角,为食品罐装产线带来了前所未有的变革。 痛…...
rustdesk编译修改名字
最近,我用Rust重写了一个2W行C代码的linux内核模块。在此记录一点经验。我此前没写过内核模块,认识比较疏浅,有错误欢迎指正。 为什么要重写? 这个模块2W行代码量看起来不多,却在线上时常故障,永远改不完。…...
MySQL 窗口函数:功能、使用场景与性能优化
MySQL 8.0 引入了一个强大的新特性——**窗口函数(Window Functions)**。它为数据分析和复杂查询提供了极大的便利,但同时也可能带来性能问题。本文将带你快速了解窗口函数的功能、使用场景以及如何优化性能。 --- ## **什么是窗口函数&#…...
数据权限校验实践
数据权限控制实践 最近在实习中为公司项目完成一个文件数据权限校验代码的转换重构,写这篇博客来记录前后两种权限校验的实现方案与相关概念 原实现方案:RBAC-基于角色的访问控制 RBAC(Role-Based Access Control) RBAC 是一种常…...
spring boot对接clerk 实现用户信息获取
在现代Web应用中,用户身份验证和管理是一个关键的功能。Clerk是一个提供身份验证和用户管理的服务,可以帮助开发者快速集成这些功能。在本文中,我们将介绍如何使用Spring Boot对接Clerk,以实现用户信息的获取。 1.介绍 Clerk提供…...
公网远程家里局域网电脑过程详细记录,包含设置路由器。
由于从校内迁居小区,校内需要远程控制访问小区内个人电脑,于是早些时间刚好自己是电信宽带,可以申请公网ipv4不需要花钱,所以就打电话直接申请即可,申请成功后访问光猫设备管理界面192.168.1.1,输入用户名密码登录超管(密码是网上查下就有了)设置了光猫为桥接模式,然后…...
自制简单的图片查看器()
图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…...
25/2/17 <嵌入式笔记> 桌宠代码解析
这个寒假跟着做了一个开源的桌宠,我们来解析下代码,加深理解。 代码中有开源作者的名字。可以去B站搜着跟着做。 首先看下main代码 #include "stm32f10x.h" // Device header #include "Delay.h" #include &quo…...
Kafka偏移量管理全攻略:从基础概念到高级操作实战
#作者:猎人 文章目录 前言:概念剖析kafka的两种位移消费位移消息的位移位移的提交自动提交手动提交 1、使用--to-earliest重置消费组消费指定topic进度2、使用--to-offset重置消费offset3、使用--to-datetime策略指定时间重置offset4、使用--to-current…...
python中使用日期和时间差:datetime模块
datetime模块的表示时间的有 datetime.datetime #时间包含年月日时分秒毫秒 datetime.date #时间只包含年月日 datetime.time #只包含时分秒 获取当前时间 import datetime now datetime.datetime.now() print(now)得到 atetime中的年月日时分秒可以分别取出来 import da…...
申论对策建议类【2022江苏B卷第一题“如何开展网络直播”】
材料: 近年来,公安交管部门通过网络直播,将执法过程和执法细节以视频形式呈现在公众面前,吸引“围观”、组织点评,让执法过程变成一堂生动的法治公开课。 “各位网友,大家好!这里是‘全国交通…...
Blazor-父子组件传递任意参数
在我们从父组件传参数给子组件时,可以通过子组件定义的[Parameter]特性的公开属性进行传值,但是当我们需要传递多个值的时候,就需要通过[Parameter]特性定义多个属性,有没有更简便的方式? 我们可以使用定义 IDictionar…...
Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅
摘要 在当今的编程世界里,Node.js 和 Python 像是两个性格迥异的超级英雄,一个以速度和灵活性著称,另一个则以强大和优雅闻名。本文将探讨如何通过 Express 框架将 Node.js 和 Python 结合起来,打造出一个高效、有趣的 Web 应用。我们将通过一系列幽默风趣的实例和表格,展…...
win11安装wsl报错:无法解析服务器的名称或地址(启用wsl2)
1. 启用wsl报错如下 # 查看可安装的 wsl --install wsl --list --online此原因是因为没有开启DNS的原因,所以需要我们手动开启DNS。 2. 按照如下配置即可 Google的DNS(8.8.8.8和8.8.4.4) 全国通用DNS地址 (114.114.114.114) 3. 运行以下命令来重启 WSL…...
【设计模式】【结构型模式】桥接模式(Bridge)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
1997-2019年各省进出口总额数据
1997-2019年各省进出口总额数据 1、时间:1997-2020年 2、来源:国家统计局、各省年鉴 3、指标:进出口总额 4、范围:31省 5、指标解释:进出口总额是指以货币表示的一定时期内一国实际进出口商品的总金额ÿ…...
AI前端开发效率革命:拥抱AI,开启前端开发新纪元
前端开发行业竞争日益激烈,项目交付周期不断缩短,对开发效率的要求也越来越高。在这种高压环境下,开发者们常常面临着巨大的压力。而近年来,人工智能技术的飞速发展,特别是AI写代码工具的出现,为前端开发带…...
Rust编程语言入门教程(一)安装Rust
目录 引言一、为什么要用 Rust?二、与其他语言比较三、Rust 特别擅长的领域四、Rust 与 Firefox五、Rust 的用户和案例六、Rust 的优缺点七、安装 Rust1、访问官网下载 Rust2、下载完成,执行exe文件 八、Rust 安装验证九、开发工具结束语 引言 在当今快…...
Kubernetes控制平面组件:Kubernetes如何使用etcd
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
2025年-G4-Lc78--121. 买卖股票的最佳时机--(java版)
1.题目描述 2.思路 思路1: 做两轮排序,第一轮排序找到最小的那个数,然后再判断最小的那个数之后还有其他数吗,如果有在进行排序,选出最大的那个数,然后值相减。 问题要点: (1)你需要…...
LabVIEW 中的 3dgraph.llb 库
3dgraph.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下,是 LabVIEW 系统中用于 3D 图形相关操作的重要库。它为 LabVIEW 用户提供了丰富的功能,能在应用程序中创建、显示和交互各种 3D 图形,…...
通过VSCode直接连接使用 GPT的编程助手
GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条,超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下: 安装VSCODE 直接,官网下载就行 https://code.vis…...
[LeetCode力扣hot100]-C++常用数据结构
0.Vector 1.Set-常用滑动窗口 set<char> ans;//根据类型定义,像vector ans.count()//检查某个元素是否在set里,1在0不在 ans.insert();//插入元素 ans.erase()//删除某个指定元素 2.栈 3.树 树是一种特殊的数据结构,力扣二叉树相…...
2-安装YIUI
YIUI框架:GitHub - LiShengYang-yiyi/YIUI: Unity3D UGUI Framework, 基于UI数据事件绑定为核心 数据驱动的UGUI框架, ETUI框架, ET框架官方推荐UI框架 ET框架:egametang/ET: Unity3D Client And C# Server Framework (github.com) 1 - 安装YIUI框架&a…...
16-使用QtChart创建动态图表:入门指南
QtChart是Qt框架中的一个强大模块,用于创建各种类型的图表,如折线图、柱状图、饼图等。它提供了丰富的API和灵活的配置选项,使得开发者能够轻松地将数据可视化集成到应用程序中。本文将介绍如何使用QtChart创建一个简单的动态折线图ÿ…...
蓝耘智算携手DeepSeek,共创AI未来
🌟 各位看官号,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习如何通过蓝耘智算使用DeepSeek R1模型 👍 如果觉得这篇文章有帮助,欢迎您一键三连&a…...
具身智能在智能巡检机器人中的应用——以开关柜带电操作机器人为例
随着机器人技术和人工智能的迅速发展,具身智能在各行业的应用日益广泛,尤其是在电力行业中的智能巡检领域。传统的电力巡检和维护工作通常需要人工操作,存在着高温、高压、强电磁场等危险环境,且效率较低。开关柜带电操作机器人作…...
【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】
引言:时间序列的魔法钥匙 在时间的长河中,信息如同涓涓细流,绵延不绝。而如何在这无尽的数据流中捕捉、理解和预测,正是循环神经网络(RNN)及其变体长短时记忆网络(LSTM)所擅长的。今天,我们就来一场深度探索,揭开RNN与LSTM的神秘面纱,看看它们如何在时间序列的海洋…...
【R语言】回归分析与判别分析
一、线性回归分析 1、lm()函数 lm()函数是用于拟合线性模型(Linear Models)的主要函数。线性模型是一种统计方法,用于描述一个或多个自变量(预测变量、解释变量)与因变量(响应变量)之间的关系…...
git开发流程以及github社区企业版
常规开发流程 1、将仓库 clone 到本地,已经 clone 的要 fetch & pull,保证本地 master 分支已经更新到最新状态 2、在 master 最新分支的基础上 checkout 一个开发分支,分支命名要求规范,如带用户名、日期、bug id 等关键信…...
DeepSeek + Vue实战开发
利用DeepSeek V3模型、siliconflow大模型一站式云服务平台以及vue3.0实现一个在线人工智能客服对话系统。 因为deepseek官网的api密钥使用起来比较缓慢,所以可以使用第三方的,具体操作请自行查阅资料。 siliconflow官网 SiliconFlow, Accelerate AGI …...
从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会
附录:所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…...
Python编程中,async/await/asyncio分别是干啥的?
在Python异步编程中,async、await和asyncio是三个核心概念。它们共同构成了Python处理高并发I/O密集型任务的解决方案。本文将通过代码实例解析它们的作用和用法。 一、异步编程基础 1.1 同步 vs 异步 同步编程:代码按顺序执行,遇到I/O操作(如网络请求、文件读写)时会阻塞…...
vue非组件的初学笔记
1.创建Vue实例,初始化渲染的核心 准备容器引包创建Vue实例new Vue() el用来指定控制的盒子data提供数据 2.插值表达式 作用利用表达式插值,将数据渲染到页面中 格式{{表达式}} 注意点 表达式的数据要在data中存在表达式是可计算结果的语句插值表达式…...
4.3 学习UVM中的“run_phase“,将其应用到具体案例分为几步?
文章目录 前言1. run_phase 的作用与执行特点2. 关键组件的 run_phase 实现2.1 Driver 的 run_phase:驱动事务2.2 Monitor 的 run_phase:捕获事务2.3 Scoreboard 的 run_phase:数据比对 3. 同步与 Objection 管理3.1 控制仿真结束3.2 多组件协…...
[Python人工智能] 五十.PyTorch入门 (5)快速搭建神经网络及模型保存
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建分类神经网络。这篇文章将介绍如何利用PyTorch快速构建神经网络,之前的代码比较复杂,通过自定义Net类实现,本文通过Torch函数定义神经网络。前面我们的Python人工智能主要以Tens…...
【C语言】有序数组的平方
文章目录 给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 #include<stdio.h>/*** brief 计算一个整数数组的平方,并按非递减顺序存放结果* * 该函数接受一个整数数组arr和其长度le…...
osgearth视点坐标及鼠标交点坐标的信息显示(七)
核心函数如下: void COSGObject::addViewPointLabel() {//mRoot->addChild(osgEarth::Util::Controls::ControlCanvas::get(mViewer));//放开这句,球就卡住了。 为什么,shitosgEarth::Util::Controls::ControlCanvas* canvas = osgEarth::Util::Controls::ControlCanvas…...