协同过滤算法

news2024/11/16 21:59:14

文章目录

  • 0 前言
  • 1. 概念
    • 1.2 分类
  • 2 基于用户的协同过滤
    • 2.1 相似性计算
      • 2.1.1 欧氏距离
      • 2.1.2 余弦相似度
      • 2.1.3 皮尔逊相关系数Pearson
      • 2.1.4 杰卡德相似度 Jaccard
      • 小结:
    • 2.2 结果分数
    • 2.3 优缺点分析
  • 3 基于物品的协同过滤
    • 3.1 结果分数
    • 3.2 优缺点分析
  • 4 总结
    • 4.1 应用场景
    • 4.2 问题分析
  • 补充:推荐算法评价指标
  • 参考

0 前言

最近学习推荐系统算法 ,准备把自己的学习过程记录一下吧,尽量不说废话。因为之前有机器学习和深度学习(CV)领域基础,在算法上面可能会快一些。有时间就会在这边不定期整理出来。

包括大数据和推荐算法。算法方面先从最传统推荐模型开始学习,然后深度学习(NLP 图神经网络领域是我的薄弱环节)。下面是《深度学习推荐系统》中的配图,让我们对传统推荐模型有个整体发展脉络(悄咪咪:我买书了…)

在这里插入图片描述

开篇自然从最经典的 协同过滤算法 开始!

本文大量参考博客 主要因为写的通俗易懂,包括案例 就让我懒得再敲CF代码了

1. 概念

协同过滤算法 (Collaborative Filtering Recommendation)

  • 协同,就是利用群体的行为来做决策(推荐)
  • 过滤,就是从可行的决策(推荐)方案(标的物)中将用户喜欢的方案(标的物)找(过滤)出来

一般是仅仅基于用户的行为数据(评价、购买、下载等), 而不依赖于项的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄, 性别等)。具体而言就是根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐)。

1.2 分类

  • 基于邻域的方法(neighborhood-based)
  • 隐语义模型 (latent factor model)
  • 基于图的随机游走算法(random walk on graph)等

最广泛运用的算法仍然是是**基于领域的方法:**基于用户的协同过滤算法;基于物品的协同过滤算法

  • 基于用户的协同过滤算法(UserCF): 给用户推荐和他兴趣相似的其他用户喜欢的产品
  • 基于物品的协同过滤算法(ItemCF): 给用户推荐和他之前喜欢的物品相似的物品

我们主要介绍这两种协同过滤算法

2 基于用户的协同过滤

基于用户的协同过滤算法(UserCF):当一个用户A需要个性化推荐的时候, 我们可以先找到和他有相似兴趣的其他用户, 然后把那些用户喜欢的, 而用户A不知道的物品推荐给A。以用户是否购买为例(这个比较好理解)

  1. 给用户 A找到最相似的N个用户

  2. N个用户消费过用品中评分较高的

  3. N个用户消费过的产品中- A用户消费过的就是推荐结果

借用一个具体的评分案例(评分案例更有普适性)来做算法具体实现。这边的案例 我们使用大佬博客中。以后的案例借用我也会说出处的:

在这里插入图片描述

给用户推荐物品的过程可以形象化为一个猜测用户对商品进行打分的任务。

上面表格里面是5个用户对于5件物品的一个打分情况,就可以理解为用户对物品的喜欢程度(比如用户购买, 那直接量化为5分; 收藏:4分;看某个物品很久:3分等)

通过这样的量化就相当于把每个用户对物品的行为刻画成了向量的形式, 我们就可以计算相似程度了

任务是判断到底该不该把物品5推荐给用户Alice。

针对于评分案例的处理:

  1. 根据已有的用户打分情况计算Alice和其他用户的相似性,找出最相似的N个用户

  2. 根据相似最高的N个用户相似性及对物品5的评分情况,估计Alice对物品5的评分,以此决定是否推荐

显然 首先要找到相似用户(计算用户间的相似性

2.1 相似性计算

相似度有不同类型的计算方式,下面我介绍几种常用的,详情参考

2.1.1 欧氏距离

是一个欧式空间下度量距离的方法. 两个物体, 都在同一个空间下表示为两个点, 假如叫做p,q, 分别都是n个坐标, 那么欧式距离就是衡量这两个点之间的距离. 欧氏距离不适用于布尔向量之间
E ( p , q ) = ∑ i = 1 n ( p i − q i ) 2 E(p,q) = \sqrt{\sum_{i=1}^n (p_i - q_i)^2} E(p,q)=i=1n(piqi)2
欧氏距离的值是一个非负数, 最大值正无穷, 通常计算相似度的结果希望是[-1,1]或[0,1]之间,一般可以使用转换公式
1 1 + E ( p , q ) \frac{1}{1+E(p,q)} 1+E(p,q)1

2.1.2 余弦相似度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkFWmfth-1669213716676)(pics/image-20221123215155285.png)]

  • 度量的是两个向量之间的夹角, 用夹角的余弦值来度量相似的情况

  • 两个向量的夹角为0是,余弦值为1, 当夹角为90度是余弦值为0,为180度是余弦值为-1

  • 余弦相似度在度量文本相似度, 用户相似度 物品相似度的时候较为常用

  • 余弦相似度的特点, 与向量长度无关,余弦相似度计算要对向量长度归一化, 两个向量只要方向一致,无论程度强弱, 都可以视为’相似’

实现,这里就直接使用 sklearn了

sklearn.metrics.pairwise 包

官方文档

  • cosine_similarity()
    传入一个变量a时,返回数组的第i行第j列表示a[i]与a[j]的余弦相似度。

  • pairwise_distances(metric)
    该方法返回的是距离,默认欧式距离。返回值 i行 j列 表示 a[i] 与 a[j]的相似距离。

    metric:更多见 官方文档

    ’cosine‘ :余弦距离

    ‘manhattan’:曼哈顿距离

    ‘jaccard’ :杰卡德

    相似度= 1 - 距离

a = [[1, 3, 2], [2, 2, 1]]
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.metrics.pairwise import pairwise_distances
print('sim2:', cosine_similarity(a))
print('sim3:', pairwise_distances(a,metric="cosine"))

#output
sim1: 0.8908708063747479
sim2: [[1.         0.89087081]
 [0.89087081 1.        ]]
sim3: [[0.         0.10912919]
 [0.10912919 0.        ]]

2.1.3 皮尔逊相关系数Pearson

在这里插入图片描述

在这里插入图片描述

  • 实际上也是一种余弦相似度, 不过先对向量做了中心化, 向量a b 各自减去向量的均值后, 再计算余弦相似度

  • 皮尔逊相似度计算结果在-1,1之间 -1表示负相关, 1表示正相关

  • 度量两个变量是不是同增同减

  • 皮尔逊相关系数度量的是两个变量的变化趋势是否一致, 不适合计算布尔值向量之间的相关度

##1
df.corr()

##2
from scipy.stats import pearsonr
i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
pearsonr(i, j)

2.1.4 杰卡德相似度 Jaccard

  • 两个集合的交集元素个数在并集中所占的比例, 非常适用于布尔向量表示

  • 分子是两个布尔向量做点积计算, 得到的就是交集元素的个数

  • 分母是两个布尔向量做或运算, 再求元素和

  • 余弦相似度适合用户评分数据(实数值), 杰卡德相似度适用于隐式反馈数据(0,1布尔值)(是否收藏,是否点击,是否加购物车)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pjg8M4Ev-1669213716677)(pics/similarity_calc2-166729115870910.png)]

实现

#构建数据集
users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# 用户购买记录数据集
datasets = [
    [1,0,1,1,0],
    [1,0,0,1,1],
    [1,0,1,0,0],
    [0,1,0,1,1],
    [1,1,1,0,1],
]
import pandas as pd

df = pd.DataFrame(datasets,
                  columns=items,
                  index=users)
print(df)
       Item A  Item B  Item C  Item D  Item E
User1       1       0       1       1       0
User2       1       0       0       1       1
User3       1       0       1       0       0
User4       0       1       0       1       1
User5       1       1       1       0       1

# 相似度计算 这里显然是布尔型值 选择用杰卡德计算
from sklearn.metrics import jaccard_score

# 计算User1 User2的相似度
jaccard_score(df.loc["User1"],df.loc["User2"])#0.5
# 计算Item A 和Item B的相似度就使用列数据

# 计算所有的数据两两的杰卡德相似系数
from sklearn.metrics.pairwise import pairwise_distances
## 计算用户间相似度
## 返回的是距离  返回值 i行 j列 表示 a[i] 与 a[j]的相似距离
## 相似度 = 1- 距离  
pairwise_distances(df.values,metric='jaccard')

output:
array([[0.        , 0.5       , 0.33333333, 0.8       , 0.6       ],
       [0.5       , 0.        , 0.75      , 0.5       , 0.6       ],
       [0.33333333, 0.75      , 0.        , 1.        , 0.5       ],
       [0.8       , 0.5       , 1.        , 0.        , 0.6       ],
       [0.6       , 0.6       , 0.5       , 0.6       , 0.        ]])


小结:

欧式距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异

余弦相似度、皮尔逊相关系数: 适用于评分数据是连续的

杰卡德相似度:适用于评分是0 1 的布尔值

具体看实际需求决定,例子

如果要统计两部剧的用户观看行为,用户A的观看向量(0,1), 用户B为(1,0), 此时二者的余弦距离很大,而欧式距离很小。我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当用余弦距离。
而当我们分析用户活跃度,以登录次数和平均观看时长作为特征时, 余弦距离会认为(1,10)和(10,100)两个用户距离很近,但显然这两个用户活跃度是有着极大差异的。此时我们关注的是数值绝对差异,应当使用欧式距离。

2.2 结果分数

计算出Alice和其他用户的相近程度, 这时候我们就可以选出与Alice最相近的前n个用户, 基于他们对物品5的评价猜测出Alice的打分值。其中计算分数的方式:

  1. 用户相似度和相似用户的评价加权平均获得用户的评价预测
    R u , p = ∑ s ∈ S ( w u , s ) ⋅ R s , p ∑ s ∈ S w u , s R_{u,p} = \frac{\sum_{s \in S}(w_{u,s})\cdot R_{s,p}}{\sum_{s\in S}w_{u,s}} Ru,p=sSwu,ssS(wu,s)Rs,p

​ 权重 w u , s w_{u,s} wu,s 是用户u和用s 的相似度, R s , p R_{s,p} Rs,p是用户s对物品p的评分

  1. 该物品的评分与此用户的所有评分的差值进行加权平均

    这种方式考虑到用户评分标准不一的情况(有人就是喜欢打低分,有人就是喜欢打高分)

在这里插入图片描述

S j , k S_{j,k} Sj,k 表示用户j,k的相似度 同 w u , s w_{u,s} wu,s

实现,看这个例子 直接copy 大佬的代码了 主要不想写数据

(img-AyuxnTau-1669213716678)(pics/20200820100833678.png)]

在这里插入图片描述

# 0 定义数据集, 也就是那个表格, 注意这里我们采用字典存放数据, 因为实际情况中数据是非常稀疏的, 很少有情况是现在这样
def loadData():
    items={'A': {1: 5, 2: 3, 3: 4, 4: 3, 5: 1},
           'B': {1: 3, 2: 1, 3: 3, 4: 3, 5: 5},
           'C': {1: 4, 2: 2, 3: 4, 4: 1, 5: 5},
           'D': {1: 4, 2: 3, 3: 3, 4: 5, 5: 2},
           'E': {2: 3, 3: 5, 4: 4, 5: 1}
          }
    users={1: {'A': 5, 'B': 3, 'C': 4, 'D': 4},
           2: {'A': 3, 'B': 1, 'C': 2, 'D': 3, 'E': 3},
           3: {'A': 4, 'B': 3, 'C': 4, 'D': 3, 'E': 5},
           4: {'A': 3, 'B': 3, 'C': 1, 'D': 5, 'E': 4},
           5: {'A': 1, 'B': 5, 'C': 5, 'D': 2, 'E': 1}
          }
    return items,users

items, users = loadData()
item_df = pd.DataFrame(items).T
user_df = pd.DataFrame(users).T

"""1.计算用户相似性矩阵"""
similarity_matrix = pd.DataFrame(np.zeros((len(users), len(users))), index=[1, 2, 3, 4, 5], columns=[1, 2, 3, 4, 5])

# 遍历每条用户-物品评分数据
for userID in users:
    for otheruserId in users:
        vec_user = []
        vec_otheruser = []
        if userID != otheruserId:
            for itemId in items:   # 遍历物品-用户评分数据
                itemRatings = items[itemId]        # 这也是个字典  每条数据为所有用户对当前物品的评分
                if userID in itemRatings and otheruserId in itemRatings:  # 说明两个用户都对该物品评过分
                    vec_user.append(itemRatings[userID])
                    vec_otheruser.append(itemRatings[otheruserId])
            # 这里可以获得相似性矩阵(共现矩阵)
            similarity_matrix[userID][otheruserId] = np.corrcoef(np.array(vec_user), np.array(vec_otheruser))[0][1]
            #similarity_matrix[userID][otheruserId] = cosine_similarity(np.array(vec_user), np.array(vec_otheruser))[0][1]


            
"""2 计算前n个相似的用户"""
n = 2
similarity_users = similarity_matrix[1].sort_values(ascending=False)[:n].index.tolist()    # [2, 3]   也就是用户1和用户2


"""3 计算最终得分"""
base_score = np.mean(np.array([value for value in users[1].values()]))
weighted_scores = 0.
corr_values_sum = 0.
for user in similarity_users:  # [2, 3]
    corr_value = similarity_matrix[1][user]            # 两个用户之间的相似性
    mean_user_score = np.mean(np.array([value for value in users[user].values()]))    # 每个用户的打分平均值
    weighted_scores += corr_value * (users[user]['E']-mean_user_score)      # 加权分数
    corr_values_sum += corr_value
final_scores = base_score + weighted_scores / corr_values_sum
print('用户Alice对物品5的打分: ', final_scores)
user_df.loc[1]['E'] = final_scores
user_df

2.3 优缺点分析

  1. 数据稀疏性。比如淘宝中商品太多,但是用户只会购买其中的很小一部分。相似用户寻找困难
  2. 不适用大用户数据量。用户量大,维护用户相似矩阵开销较大

3 基于物品的协同过滤

基于物品的协同过滤(ItemCF):根据所有用户的历史偏好数据计算物品之间的相似性,然后把与用户喜欢的物品类似的物品推荐给用户。比如物品a和c非常相似,因为喜欢a的用户同时也喜欢c,而用户A喜欢a,所以把c推荐给用户A

注意:

这里的物品相似性并不根据物品本身属性(类型,价格等)决定 而是因为有很多人喜欢A的同时喜欢C,这仍然是基于用户行为的

3.1 结果分数

在这里插入图片描述
在这里插入图片描述

"""1.得到与物品5相似的前n个物品"""
n = 2
similarity_items = similarity_matrix['E'].sort_values(ascending=False)[:n].index.tolist()       # ['A', 'D']

"""计算最终得分"""
base_score = np.mean(np.array([value for value in items['E'].values()]))
weighted_scores = 0.
corr_values_sum = 0.
for item in similarity_items:  # ['A', 'D']
    corr_value = similarity_matrix['E'][item]            # 两个物品之间的相似性
    mean_item_score = np.mean(np.array([value for value in items[item].values()]))    # 每个物品的打分平均值
    weighted_scores += corr_value * (users[1][item]-mean_item_score)      # 加权分数
    corr_values_sum += corr_value

final_scores = base_score + weighted_scores / corr_values_sum
print('用户Alice对物品5的打分: ', final_scores)
user_df.loc[1]['E'] = final_scores
user_df

3.2 优缺点分析

ItemCF算法可以预先在线下计算好不同物品之间的相似度,把结果存在表中,当推荐时进行查表,计算用户可能的打分值,可以同时解决上面两个问题。

其余的优势感觉在大数据的当下也不明显

更多见第四节

4 总结

在这里插入图片描述

4.1 应用场景

  • UserCF

    由于是基于用户相似度进行推荐, 所以具备更强的社交特性, 这样的特点非常适于用户少, 物品多, 时效性较强的场合, 比如新闻推荐场景

  • ItemCF

    适用于兴趣变化较为稳定的应用, 更接近于个性化的推荐, 适合物品少,用户多,用户兴趣固定持久, 物品更新速度不是太快的场合, 比如推荐艺术品, 音乐, 电影

在这里插入图片描述

4.2 问题分析

  1. UserCF;ItemCF 都没有考虑物品本身的属性(最大的问题)
  2. 稀疏数据的处理能力弱,泛化性差:热门物品具有很强的头部效应, 容易跟大量物品产生相似, 而尾部物品由于特征向量稀疏, 导致很少被推荐

在这里插入图片描述

A, B, C, D是物品, 看右边的物品共现矩阵, 可以发现物品D与A、B、C的相似度比较大, 所以很有可能将D推荐给用过A、B、C的用户。 但是物品D与其他物品相似的原因是因为D是一件热门商品, 系统无法找出A、B、C之间相似性的原因是其特征太稀疏, 缺乏相似性计算的直接数据。 所以这就是协同过滤的天然缺陷:推荐系统头部效应明显, 处理稀疏向量的能力弱。

解决办法:(下一章的矩阵分解)

补充:推荐算法评价指标

在这里插入图片描述

参考

王喆老师:《深度学习推荐系统》

AI上推荐 之 协同过滤_翻滚的小@强

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

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

相关文章

list的介绍及使用(14)

目录 1、list的介绍 2、list的使用 1、list的构造 2、迭代器 3、list modifiers 4、list element access 5、list capacity 1、list的介绍 1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2、list的底层是双…

u盘提示格式化怎么修复?80%的人都在这么做!

u盘是我们平时经常使用的一个存储设备,使用时间久了容易出现格式化的情况,而这种情况一般都会出现在 U盘上。如果出现格式化的提示,u盘提示格式化怎么修复?很多小伙伴们可能都不知道恢复的方法,今天我们就一起来看看&a…

可观测性不止于监控,让运维不开盲盒!

近年来,可观测性热度节节攀升,企业在可观测性实践过程中常常也伴随着一系列棘手的问题: 监控与可观测区别是什么?可观测发展史是怎样的?如何规划可观测的体系化建设之路?如何让可观测平台与工具顺利落地&a…

雷达探测项目仿真代码(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

用DIV+CSS技术设计的明星个人网站制作(基于HTML+CSS+JavaScript制作明星彭于晏网页)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

8年研发工程师心路历程(道与术皆得)

序言 首先本人只是一个资质平平对技术不算热衷但终归是它给我赏了一口饭吃心存感激的普通程序员,暂且不要拿作者和专攻技术的高端玩家做对比,因此我介绍的方法也是相对比较温和,保证理论上来说不会占用额外过多的空闲时间去学习。 作为一个程…

给所有的async函数添加try/catch

async 如果不加 try/catch 会发生什么呢?下面让我们看个例子 async function fn() {let value await new Promise((resolve, reject) > reject(报错))console.log(do something...) } fn() 导致浏览器报错:一个未捕获的错误,并且下面的…

Spring定时器会初始化两次终于找到原因了!!!

使用idea编译器中的Tomcat时写在逻辑业务层的定时器会执行两次,最开始我认为是Tomcat的问题,后面做了个测试在出现该现象的业务层类中定义了一个测试定时器方法: Scheduled(cron "0/5 * * * * ?") //每隔5秒执行一次这个方法pub…

华为再次入选2022年Gartner® SIEM魔力象限

近日,全球IT研究与顾问咨询机构Gartner正式发布《Magic Quadrant™ for Security Information and Event Management》报告,全球共有16家厂商入选了Gartner SIEM魔力象限,华为凭借HiSec Insight和华为云安全云脑技术能力进入了Gartner SIEM魔…

javascript中this的指向问题

this的五种绑定问题 1,默认绑定 默认绑定通常是指函数独立调用,不涉及其他绑定规则。 非严格模式下,this指向window严格模式,下,this指向undefined. 在普通函数内部的thislet/const定义的变量存在暂时性死区,而目不…

elk实践

1、背景 鉴于现在项目中的日志比较乱,所以建议使用现在较为流行的elk收集日志并展示; 2、下载、配置与启动 在下载 Elastic 产品 | Elastic 官网下载filebeat、logstash、elasticSearch、kibana 版本要一致 本人测试用的7.14 mac版本 实际生产使用7.14…

甘特图来搞定跨部门协作难的问题!项目经理必备

在很多大的工程项目、IT项目、市场项目中,都会涉及诸多对人员、时间、质量等的控制,这往往需要跨部门协作。但目前大多数企业跨部门协作还是通过微信、口口相传的方式进行,也导致了以下这些问题的频现: 辗转多个群聊提取有用的信息…

笔试强训(三十九)

目录一、选择题二、编程题2.1 字符串计数2.1.1 题目2.1.2 题解一、选择题 (1)/etc/resolv.conf的用途是(C) A.邮件服务的配置文件 B.DHCP的设置文件 C.DNS解析的设置文件 D.网络路由的设置文件 (2)能够pin…

Redis 通用指令

文章目录一、key通用指令1-1 基本操作1-2 时效性控制1-3 查询操作1-4 扩展操作二、数据库通用指令提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、key通用指令 ● 特征:key是一个字符串,通过key获取redis中保存的数…

警惕 “格机软件” 格式化手机全字库..不要轻易给不明觉厉的软件给root权限

以前的玩机界中有【锁机】软件。就是你安装一个软件后他会锁住屏幕。导致你无法操作手机。屏幕出现QQ联系方式等 勒索钱财。目前刷机界中的【格机】更胜一筹,直接格式化你手机全部分区没商量............ 警惕:不要给不明觉厉的软件 模块 刷机包等等给r…

Flink的状态持久化和状态后端

状态持久化 检查点的保存离不开 JobManager 和 TaskManager,以及外部存储系统的协调。在应用进行检查点保存时,首先会由 JobManager 向所有 TaskManager 发出触发检查点的命令;TaskManger 收到之后,将当前任务的所有状态进行快照保…

搭建自己Kindle电子书图书馆,并可远程访问

在电子书风靡的时期,大部分人都购买了一本电子书,虽然这本电子书更多的时候是被搁置在储物架上吃灰,或者成为盖泡面的神器,但当亚马逊发布消息将放弃电子书在中国的服务时,还是有些令人惋惜,毕竟谁也不想大…

【虾神白话空间统计】笔记:置信度、零假设、PZ值、随机分布

以下内容摘录节选学习自虾神专栏 很重要的一个概念:在空间统计中,随机和均匀经常是一个意思 一个随机抽样的例子 新版白话空间统计(9):置信度的初探 这里面讲经研究,有72%的男生喜欢打篮球,…

【Vue】基础语法(创建项目|数据绑定|事件绑定|声明方法|插值表达式|属性值绑定|循环数组|v-if控制||计算属性|监听器|过滤器)

文章目录1. Vue 思想:2. VUE 的基本使用2.1 创建项目并进行基础测试2.2 数据绑定2.3 事件绑定2.4 声明方法2.5 插值表达式2.6 给任意属性绑定值2.7 v-for 循环数组或对象的使用2.8 v-if 和 v-show 控制是否显示2.9 计算属性和监听器属性2.10 过滤器属性3. 总结 Vue …

智慧工程安监物联网+云平台解决方案-最新全套文件

智慧工程安监物联网云平台解决方案-最新全套文件一、建设背景监管部门所处困境建筑施工业存在难点工程现场安全现象二、建设思路实现目标三、建设方案四、获取 - 物联网全套最新解决方案合集一、建设背景 智慧工地 是指运用 信息化 手段,通过 三维 设计平台对 工程…