【基于协同过滤算法的电影推荐】

2023-10-31

目录

 

1 协同过滤算法

1.1 CF与 User/Item 推荐算法区别

1.2 UserCF

1.3 ItemCF

2 评价指标

3 基于userCF与itemCF电影推荐

3.1 MovieLens数据集

3.2 userCF代码实现

3.3 K值影响实验(userCF)

3.4 itemCF代码实现

3.5 K值影响实验(itemCF)

4 userCF与itemCF比较

4.1 区别

4.2 适用场景

4.3 模型融合 


1 协同过滤算法

1.1 CF与 User/Item 推荐算法区别

基于用户内容的推荐:利用用户人口统计学特征(age/gender/..)计算相似度

基于物品内容的推荐:利用物品的本身属性内容计算相似度

CF:通过分析用户的行为数据,根据用户对物品的偏好发现用户和物品的相关性,基于这种关联推荐(userCF/item/CF)

1.2 UserCF

a 找到与目标用户兴趣相似的用户集合

相似度计算 (Jaccard公式、余弦相似度)

 Jccard: w_{u v}=\frac{|N(u) \cap N(v)|}{|N(u) \cup N(v)|}

cosin: w_{\mathrm{tw}}=\frac{|N(u) \cap N(v)|}{\sqrt{|N(u)||N(v)|}}

相似度改进,惩罚热门物品(对冷门物品的相同喜爱,更能表明两个人相似)

w_{u v}=\frac{\sum_{i \in N(u) \cap N(v)} \frac{1}{\log 1+|N(i)|}}{\sqrt{|N(u)||N(v)|}}

但是,如果计算目标用户与所有用户的相似度,复杂度太高O(u*u),实际上很多用户并没有与其有相同的感兴趣物品。

建立物品-用户倒排表(统计每一件物品对应的用户集合),遍历找到N(u)&N(v)不为零的,两两用户的相似度值C[u][v]+1,再除以分母。C[u][v]=N,表示用户u与v共有的爱好物品数量为N个。

 

b 找到该集合中所有用户喜欢的物品,然后排除目标用户已经看过的物品,推荐排在前n的物品

计算感兴趣度:p(u, i)=\sum_{v \in S(u, K) \cap N(i)} w_{u v} r_{v i}  ,其中wuv表示用户u和v的相似度,rvi表示用户v对物品i的兴趣度

1.3 ItemCF

原理同userCF,先计算物品的相似度(被喜欢的人越多越相似),然后生成推荐列表

相似度计算:

w_{i j}=\frac{|N(i) \cap N(j)|}{|N(i)|},N(i)表示喜欢i物品的用户数量

改进:惩罚热门物品,利于挖掘长尾物品

w_{i j}=\frac{|N(i) \cap N(j)|}{\sqrt{|N(i)||N(j)|}} 

建立用户--物品倒排表(统计每一个用户对应的物品列表)

兴趣度:

p_{u j}=\sum_{k=N(u) \cap S(j, K)} w_{j i} r_{u i},S(j,K)是和物品j最相似的K个物品集合,wji是物品j和i的相似度,rui是用户u对i的兴趣度

2 评价指标

\text { Recall }=\frac{\sum_{u}|R(u) \cap T(u)|}{\sum_{u}|T(u)|}\text { Precision }=\frac{\sum_{u}|R(u) \cap T(u)|}{\sum_{u}|R(u)|}\text { Coverage }=\frac{ \|_{u \in U} R(u) |}{|I|}

recall: 预测准确的占真实列表的比例

precision:预测正确的占预测集合的比例

coverage:预测的物品类别占总类别的比例

还有一些其他的评价指标:

用户满意度(无法离线测量:在线或用户调查)、多样性、新颖性、精细度、信任度、实时性、健壮性...

3 基于userCF与itemCF电影推荐

3.1 MovieLens数据集

MovieLens数据集(Small: 100,000 ratings and 3,600 tag applications applied to 9,000 movies by 600 users. )

userid/ movieid/ ratings/ timestrap,这里忽略时间戳,只利用前三个特征构造用户行为矩阵。

这里只预测目标用户的可能会进行评分的电影,不涉及评分高低,所以感兴趣度计算公式rank[movie] += wuv*rvi,rvi置为1,忽略评分高低的影响。

3.2 userCF代码实现

# coding = utf-8
# userCF推荐算法实现
import random

import math
from operator import itemgetter


class UserBasedCF():
    # 初始化相关参数
    def __init__(self,K,N):
        # 找到与目标用户兴趣相似的K个用户,为其推荐10部电影
        self.n_sim_user = K
        self.n_rec_movie =N

        # 将数据集划分为训练集和测试集
        self.trainSet = {}  #格式{user1:{movie1:ratings},{user2...},....}
        self.testSet = {}

        # 用户相似度矩阵
        self.user_sim_matrix = {}
        self.movie_count = 0

        #print('Similar user number = %d' % self.n_sim_user)
        #print('Recommneded movie number = %d' % self.n_rec_movie)


    # 读文件得到“用户-电影”数据
    def get_dataset(self, filename, pivot=0.75):
        trainSet_len = 0
        testSet_len = 0
        for line in self.load_file(filename):
            user, movie, rating, timestamp = line.split(',')
            if random.random() < pivot:      #按照3:1划分训练集和测试集
                self.trainSet.setdefault(user, {}) #setdefault,自动创建key,若已存在,则不改变原value
                self.trainSet[user][movie] = float(rating) 
                trainSet_len += 1
            else:
                self.testSet.setdefault(user, {})
                self.testSet[user][movie] = float(rating)
                testSet_len += 1
        #print('Split trainingSet and testSet success!')
        #print('TrainSet = %s' % trainSet_len)
        #print('TestSet = %s' % testSet_len)
        #return self.trainSet ,self.testSet
    

    # 读文件,返回文件的每一行
    def load_file(self, filename):
        with open(filename, 'r') as f:
            for i, line in enumerate(f):
                if i == 0:  # 去掉文件第一行的title
                    continue
                yield line.strip('\r\n')
        #print('Load %s success!' % filename)


    # 计算用户之间的相似度
    def calc_user_sim(self):
        # 构建“电影-用户”倒排表
        # key = movieID, value = list of userIDs who have seen this movie
        #print('Building movie-user table ...')
        movie_user = {}
        for user, movies in self.trainSet.items():
            for movie in movies:
                if movie not in movie_user:
                    movie_user[movie] = set()
                movie_user[movie].add(user)
        #print('Build movie-user table success!')

        self.movie_count = len(movie_user)
        #print('Total movie number = %d' % self.movie_count)

        #print('Build user co-rated movies matrix ...')
        for movie, users in movie_user.items():
            for u in users:
                for v in users:
                    if u == v:
                        continue
                    self.user_sim_matrix.setdefault(u, {})
                    self.user_sim_matrix[u].setdefault(v, 0)
                    self.user_sim_matrix[u][v] += 1
        #print('Build user co-rated movies matrix success!')

        # 计算相似性
        #print('Calculating user similarity matrix ...')
        for u, related_users in self.user_sim_matrix.items():
            for v, count in related_users.items():
                self.user_sim_matrix[u][v] = count / math.sqrt(len(self.trainSet[u]) * len(self.trainSet[v]))
        #print('Calculate user similarity matrix success!')


    # 针对目标用户U,找到其最相似的K个用户,产生N个推荐
    def recommend(self, user):
        K = self.n_sim_user
        N = self.n_rec_movie
        rank = {}
        watched_movies = self.trainSet[user]

        # v=similar user, wuv=similar factor
        for v, wuv in sorted(self.user_sim_matrix[user].items(), key=itemgetter(1), reverse=True)[0:K]:
            #用user中的第2个item即相似度值,作为key进行排序
            #for movie,rvi in self.trainSet[v].items(): #查看相似用户v的所有感兴趣电影,若目标用户已经看过,则跳过
            for movie in self.trainSet[v]:
                if movie in watched_movies:
                    continue
                rank.setdefault(movie, 0)#若没看过,将该电影添加到推荐电影列表,
                #rank[movie] += wuv*rvi   #目标用户对该电影的感兴趣值=相似度*感兴趣度,遍历所有相似用户求和
                rank[movie] += wuv   #这里只是预测用户是否会对电影打分,与分数高低无关,所以rvi设为1,只用相似度wuv计算
        return sorted(rank.items(), key=itemgetter(1), reverse=True)[0:N]  #返回感兴趣值的topN


    # 产生推荐并通过准确率、召回率和覆盖率进行评估
    def evaluate(self):
        print("Evaluation start ...")
        N = self.n_rec_movie
        # 准确率和召回率
        hit = 0
        rec_count = 0
        test_count = 0
        # 覆盖率
        all_rec_movies = set()

        for i, user, in enumerate(self.trainSet):
            test_movies = self.testSet.get(user, {})
            rec_movies = self.recommend(user)
            for movie, w in rec_movies:
                if movie in test_movies:
                    hit += 1
                all_rec_movies.add(movie)
            rec_count += N
            test_count += len(test_movies)

        precision = hit / (1.0 * rec_count)
        recall = hit / (1.0 * test_count)
        coverage = len(all_rec_movies) / (1.0 * self.movie_count)
        #print('precisioin=%.4f\trecall=%.4f\tcoverage=%.4f' % (precision, recall, coverage))
        return [precision, recall, coverage]

tips:

3.3 K值影响实验(userCF)

评价指标:

以 precision、recall、coverage作为评价指标,查看K值对算法性能的影响

实验设计:

K的取值范围[5,10,20,40,80,160,320],每个K值下,进行五次数据划分并评估,最终取五次的平均值作为结果返回

%%time
#探索数值K的影响(推荐电影数量固定 10)
#评价指标:precision/recall/coverage的变化
#实验设计:每个K进行5次数据集的划分并试验,最后取平均值作为最终结果
rating_file = 'G:\\DATAMINING\\cv-spyder\\recsys\\ml-latest-small\\ratings.csv'
Mat=[]
K_range=[5,10,20,40,80,160,320]
for K in K_range:
    M=[]
    for i in range(5):
        userCF = UserBasedCF(K)
        userCF.get_dataset(rating_file) #获取并划分数据集
        userCF.calc_user_sim() #计算用户相似度矩阵
        m=userCF.evaluate() #评估
        M.append(m) #记录每个数据集上的指标向量
    Mat.append([sum([h[2] for h in M])/5,sum([h[1] for h in M])/5,sum([h[0] for h in M])/5])#求均值

#性能曲线
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from IPython.display import display

p=pd.DataFrame(Mat,columns=lab)
display(p) 
num = np.array(Mat)
num=num.T
#plt.rcParams['font.sans-serif'] = ['SimHei']#可以plt绘图过程中中文无法显示的问题
plt.figure(figsize=(10, 5), dpi=80)
lab=["precision","recall","coverage"]
x_label=K_range
for row in range(len(num)):
    markes = ['-o', '-s', '-^']
    plt.plot(x_label,num[row],markes[row],label =lab[row])
plt.legend()#显示图例,如果注释,即使设置了图例仍然不显示
#plt.show()#显示图片,如果注释,即使设置了图片仍然不显示

 试验结果:

K precision recall coverage
1 0.137767 0.028525 0.118131
3 0.119704 0.050324 0.208131
5 0.096540 0.059061 0.243311
10 0.063466 0.067299 0.278230
20 0.042393 0.072281 0.299016
40 0.027079 0.074613 0.308852
80 0.018715 0.073908 0.306000
160 0.013107 0.071625 0.295180
320 0.010070 0.067540 0.278459

 总结:

1 覆盖率:随着K值增大,考虑的相似用户越多,涉及到的物品种类增大覆盖率就越大,但是之后覆盖率会减小,因为K值超过一定大小,考虑的用户足够多,预测的物品就越来越接近主流大众的喜爱,偏向于热门物品,所以覆盖率会减小。

2 召回率:随着K值增大,其考虑的相似用户的数量增大,就越来越能挖掘出用户的喜好,召回率先上升,后趋于平稳保持不变。recall对K值的变化不是非常敏感。只要K值达到某阈值后影响不大

3 准确率:K值为5时准确度达到最大,随着K值增大,准确率逐渐下降。因为K值越大,预测的物品就偏向于热门物品,个性化推荐就越弱,最终准确率趋于平稳。

4改进:可以增加数据量;可以探究推荐的电影数量对算法的影响。

3.4 itemCF代码实现

# 基于项目的协同过滤推荐算法实现
import random

import math
from operator import itemgetter


class ItemBasedCF():
    # 初始化参数
    def __init__(self,K,N):
        # 找到相似的20部电影,为目标用户推荐10部电影
        self.n_sim_movie = K
        self.n_rec_movie = N

        # 将数据集划分为训练集和测试集
        self.trainSet = {}
        self.testSet = {}

        # 用户相似度矩阵
        self.movie_sim_matrix = {}
        self.movie_popular = {}
        self.movie_count = 0

        #print('Similar movie number = %d' % self.n_sim_movie)
        #print('Recommneded movie number = %d' % self.n_rec_movie)


    # 读文件得到“用户-电影”数据
    def get_dataset(self, filename, pivot=0.75):
        trainSet_len = 0
        testSet_len = 0
        for line in self.load_file(filename):
            user, movie, rating, timestamp = line.split(',')
            if(random.random() < pivot):
                self.trainSet.setdefault(user, {})
                self.trainSet[user][movie] = rating
                trainSet_len += 1
            else:
                self.testSet.setdefault(user, {})
                self.testSet[user][movie] = rating
                testSet_len += 1
        #print('Split trainingSet and testSet success!')
        #print('TrainSet = %s' % trainSet_len)
        #print('TestSet = %s' % testSet_len)


    # 读文件,返回文件的每一行
    def load_file(self, filename):
        with open(filename, 'r') as f:
            for i, line in enumerate(f):
                if i == 0:  # 去掉文件第一行的title
                    continue
                yield line.strip('\r\n')
        #print('Load %s success!' % filename)


    # 计算电影之间的相似度
    def calc_movie_sim(self):
        for user, movies in self.trainSet.items():
            for movie in movies:
                if movie not in self.movie_popular:
                    self.movie_popular[movie] = 0
                self.movie_popular[movie] += 1  #计算电影的流行度(被评分的次数越多,越流行)

        self.movie_count = len(self.movie_popular)
        #print("Total movie number = %d" % self.movie_count)
        
        #统计电影相似矩阵
        #这里的用户-电影倒排表,就是trainset数据
        for user, movies in self.trainSet.items(): 
            for m1 in movies:
                for m2 in movies:
                    if m1 == m2:
                        continue
                    self.movie_sim_matrix.setdefault(m1, {})
                    self.movie_sim_matrix[m1].setdefault(m2, 0)
                    self.movie_sim_matrix[m1][m2] += 1
        #print("Build co-rated users matrix success!")

        # 计算电影之间的相似性
        #print("Calculating movie similarity matrix ...")
        for m1, related_movies in self.movie_sim_matrix.items():
            for m2, count in related_movies.items():
                # 注意0向量的处理,即某电影的用户数为0
                if self.movie_popular[m1] == 0 or self.movie_popular[m2] == 0:
                    self.movie_sim_matrix[m1][m2] = 0
                else:
                    self.movie_sim_matrix[m1][m2] = count / math.sqrt(self.movie_popular[m1] * self.movie_popular[m2])
        #print('Calculate movie similarity matrix success!')


    # 针对目标用户U,找到K部相似的电影,并推荐其N部电影
    def recommend(self, user):
        K = self.n_sim_movie
        N = self.n_rec_movie
        rank = {}
        watched_movies = self.trainSet[user]

        for movie, rating in watched_movies.items():
            for related_movie, w in sorted(self.movie_sim_matrix[movie].items(), key=itemgetter(1), reverse=True)[:K]:
                if related_movie in watched_movies:
                    continue
                rank.setdefault(related_movie, 0)
                rank[related_movie] += w * float(rating)  #感兴趣度=电影相似度*评分
        return sorted(rank.items(), key=itemgetter(1), reverse=True)[:N]


    # 产生推荐并通过准确率、召回率和覆盖率进行评估
    def evaluate(self):
        #print('Evaluating start ...')
        N = self.n_rec_movie
        # 准确率和召回率
        hit = 0
        rec_count = 0
        test_count = 0
        # 覆盖率
        all_rec_movies = set()

        for i, user in enumerate(self.trainSet):
            test_moives = self.testSet.get(user, {})
            rec_movies = self.recommend(user)
            for movie, w in rec_movies:
                if movie in test_moives:
                    hit += 1
                all_rec_movies.add(movie)
            rec_count += N
            test_count += len(test_moives)

        precision = hit / (1.0 * rec_count)
        recall = hit / (1.0 * test_count)
        coverage = len(all_rec_movies) / (1.0 * self.movie_count)
        return [precision, recall, coverage]
        #print('precisioin=%.4f\trecall=%.4f\tcoverage=%.4f' % (precision, recall, coverage))

3.5 K值影响实验(itemCF)

同样做5次交叉实验,取平均值作为评价指标.

K precision recall coverage
1 0.161944 0.041188 0.170656
3 0.131698 0.057918 0.239410
5 0.105631 0.061193 0.252295
10 0.082598 0.065140 0.269639
20 0.067028 0.065909 0.273213
40 0.057787 0.064942 0.268164
80 0.051798 0.063022 0.261148
160 0.050158 0.060166 0.249574
320 0.048807 0.057707 0.238525

总结:

1 K值对itemCF三个指标的影响,同userCF的影响规律一致。

2 在本数据集中,itemCF相比于userCF,precision有一定的提升,但是recall以及coverage的最大值均不及userCF。但这并不是普适规律,不同的推荐任务和数据集,模型的表现也会有变化。

4 userCF与itemCF比较

4.1 区别

userCF:更着重于反映和用户兴趣相似的小群体的关注热点(社会化),存在用户冷启动问题

itemCF: 更着重于维护用户的历史兴趣(个性化),存在物品冷启动问题

4.2 适用场景

物品更新快,个性化需求不强烈(userCF适用):如新闻资讯,维护item相关性表需要快速更新,很难在技术上实现

长尾物品丰富,个性化需求强烈(itemCF适用):如电商/图书/电影,不需要流行度帮助用户判断,利用个人领域知识推荐效果更好

存储代价方面:用户较多适用itemCF,物品较多适用userCF

产品需求:需要提供推荐解释itemCF更适用

4.3 模型融合 

在现实推荐系统中,为了缓解在线推荐系统的压力、增加计算速度,每个推荐系统都是由多个推荐引擎组成,每个推荐引擎使用一种推荐模型或完成一种推荐任务。最终的推荐结果可以根据场合使用其中一种推荐模型的结果,也可以线性加权对所有推荐模型进行融合,也可以分区对不同的人群使用不同的推荐策略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【基于协同过滤算法的电影推荐】 的相关文章

  • 机器学习 之 python实现 多元线性回归 梯度下降 普适算法与矩阵算法

    介于网上的多元线性回归梯度下降算法多为固定数量的因变量 如三元一次函数 y 1 x 1
  • 主成分分析(Principal Component Analysis,PCA)详解

    PCA是非常重要的统计方法 其实际应用非常广泛 但是很多讲解太过于公式化 很难让初学者消化 本文将从一个实际例子出发 并对数学公式原理及推导过程作出详细解释 即使你的数学基础比较差 在看完这篇博客之后 相信你会对PCA会有一个透彻的认知 P
  • Kaggle竞赛题目之——Digit Recognizer

    Classify handwritten digits using the famous MNIST data This competition is the first in a series of tutorial competitio
  • 正则化(Regularization)

    过拟合问题 Overfitting 当我们对一个问题建立线性回归模型或逻辑回归模型时 不恰当的选择特征会导致过拟合问题 过拟合问题是指当我们选择了很多的特征值时 模型对数据集的每一个example都符合的很好 但是对新的example却预测
  • 【Machine Learning】5.特征工程和多项式回归

    特征工程和多项式回归 1 导入 2 多项式特征 3 特征选择 4 多项式特征与线性特征的关联 5 特征缩放 Scaling features 6 复杂函数的拟合 7 课后题 特征工程 使用线性回归机制来拟合非常复杂甚至非线性 存在 x n
  • 深度学习系列之ANN

    到此 ANN网络从最基础的单层感知器 到为深度网络作模板延伸的BP网络 将模型结构 参数训练 算法都举例讲解的很透彻 为下面的CNN网络的学习打下坚实的基础 这个在线编辑器 体验太差了 好好写一篇长文章 想知道博客上与大家交流 转换过程太麻
  • 训练模型的3种方法

    公众号后台回复关键字 Pytorch 获取项目github地址 Pytorch没有官方的高阶API 一般通过nn Module来构建模型并编写自定义训练循环 为了更加方便地训练模型 作者编写了仿keras的Pytorch模型接口 torch
  • 基于Levenberg-Marquardt训练算法的BP网络Python实现

    基于Levenberg Marquardt训练算法的BP网络Python实现 分类 统计机器学习算法理论 2013 07 15 23 40 430人阅读 评论 0 收藏 举报 经过一个多月的努力 终于完成了BP网络 参考的资料为 1 Tra
  • 论文阅读笔记4——MOTR: End-to-End Multiple-Object Tracking with TRansformer(利用Transformer进行多目标跟踪)

    首个完全基于端到端 Transformer 的多目标追踪模型 21年5月上传到arxiv上 论文 论文 代码 代码 space 1 Abstract 摘要大概由两部分组成 一是过去启发式算法的缺陷 二是MOTR的基本思路 他说MOT问题的关
  • 朴素贝叶斯分类器(Naive Bayes Classifiers)

    原文地址 Naive Bayes Classifiers 本文讨论的是朴素贝叶斯分类器 Naive Bayes classifiers 背后的理论以及其的实现 朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法 它不是单一存在的 而是
  • kaldi中SHELL调用C++程序过程源码分析

    引入 kaldi真正的核心源码 都是C 写成的 这个结论可以从如下两点得以确认 1 在kaldi的源码kaldi src目录下 能看到很多扩展名为 cc的源程序 这是linux下C 源码 2 在源码中 比如kaldi src featbin
  • R-squared 和 Adjusted R-squared联系与区别

    原文见 https discuss analyticsvidhya com t difference between r square and adjusted r square 264 8 下面是自己理解的总结 大概意思就是说 R squ
  • 【机器学习详解】SVM解二分类,多分类,及后验概率输出

    转载请注明出处 http blog csdn net luoshixian099 article details 51073885 CSDN 勿在浮沙筑高台 color Blue CSDN 21247 22312 28014 27801 3
  • confidence weighted learning

    这个算法原作者意思是在NLP中面对高维向量和数据稀疏时效果会不错 算法保持了当前预测向量w的均值和方差 并做优化 代码实现如下 cw learning algorithm def get phi confidence parameter p
  • 深度学习知识体系学习大全 牛!!

    搬来了大牛的博客 点击直接前往 https www yuque com angsweet machine learning jian jie 配一张大牛的思维导图 具体内容点进去都能看到 数学 机器学习 语言 算法 深度学习 书籍推荐 东西
  • MLOps极致细节:4. MLFlow Projects 案例介绍(Gitee代码链接)

    MLOps极致细节 4 MLFlow Projects 案例介绍 Gitee代码链接 MLFlow Projects允许我们将代码及其依赖项打包为一个可以在其他平台上以可复制 reproducible 和可重用 reusable 的方式运行
  • 监督学习,无监督学习,半监督学习,主动学习的概念

    1 监督学习 supervised learning 训练数据既有特征 feature 又有标签 label 通过训练 让机器可以自己找到特征和标签之间的联系 在面对只有特征没有标签的数据时 可以判断出标签 即生成合适的函数将输入映射到输出
  • 【特征工程】特征选择与特征学习

    特征选择与特征学习 在机器学习的具体实践任务中 选择一组具有代表性的特征用于构建模型是非常重要的问题 特征选择通常选择与类别相关性强 且特征彼此间相关性弱的特征子集 具体特征选择算法通过定义合适的子集评价函数来体现 在现实世界中 数据通常是
  • 如何使用 Whisper 和 Spleeter AI 工具制作卡拉 OK 视频

    介绍 人工智能工具可用于处理图像 音频或视频以产生新颖的结果 直到最近 在不使用大量时间和计算能力的情况下 自动编辑图像或音频仍然具有挑战性 即使如此 通常也只能运行交钥匙滤波器来删除声音中的某些频率或更改图像的调色板 较新的方法使用人工智
  • 【下降算法】最速下降法、Newton法、共轭梯度法

    文章目录 1 一维搜索 2 最速下降法 最速下降法特征 最速下降法的优缺点 3 Newton法 算法基本思想 牛顿法和梯度下降法的效率对比 4 共轭梯度法 1 一维搜索 最优化问题一般选择某一组变量 然后在满足一定的限制条件下 求出使目标值

随机推荐

  • 数据仓库灵魂30问之数据仓库、数据中台、数据湖有什么区别

    先说结论 数据仓库实行分而治之 面向BI 商业智能 数据中台实行一统天下 面向DateAPI 数据服务API 数据湖实行无为而治 面向AI 人工智能 他们三个实行的策略不同 用途不同 但是数据中台可以包容数据仓库与数据湖 数据湖与数据仓库是
  • 2023电子信息工程毕业设计题目选题推荐

    文章目录 1前言 2 如何选题 2 1 嵌入式开发方向 2 2 物联网方向 2 3 移动通信方向 2 4 人工智能方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 2 8 学长作品展示 4 最后 1前言 近期不少学
  • sql截去最后一位_SQL截取最后一个由字符分隔的字符串

    SQL如果一个字符串由某个字符分隔 例如 火锅 gt 中餐 gt 极品美食 10 20 300 怎么得到字符最后一个字符串 极品美食 300 使用reverse配合charindex来实现 reverse是把字符串倒置 然后通过charin
  • 终于知道程序员为什么总是带个耳机了!

    能别带耳机吗 你能别来打扰我工作吗 不能 前阵子有篇热文 当一个程序员一天被打扰 10 次 后果很惊人 看后网友都表示深有同感 来看看这些网友都是怎么讲的 热心市民 开发小哥哥旁边放着一个计数器 我好奇的问他这个是记录每天的bug数吗 他说
  • 一分钟带你解决“command not found“报错

    长话短说 command not found 找不到命令 这类错误出现的原因有很多 根据具体情况分析 常见的有以下3种 1 不是可执行命令 也就是你输入的代码不合法 没有被定义 root localhost test jsjsjjdjd b
  • Python读写Excel文件第三方库汇总,你想要的都在这儿!

    恢复内容开始 常见库简介 xlrd xlrd是一个从Excel文件读取数据和格式化信息的库 支持 xls以及 xlsx文件 http xlrd readthedocs io en latest 1 xlrd支持 xls xlsx文件的读2
  • 安全帽识别 安全帽佩戴效果 安全帽检测 yolov4安全帽识别 yolov3

    施工场景下的行为识别领域 该应用领域在技术上可拆分为两部分 视频跟踪和行为识别 这一周密集调研了文献 发现着实是一个大坑 其中的视频跟踪最近的各頂会论文出现最多的是单目标跟踪 而我们要解决的确是多目标跟踪 最近出的较好的能实用性的是deep
  • react+umi+antdesign+typescript从零构建后台系统

    确保电脑有node 查看方式 node v 2 确保电脑有umi 查看方式 umi v 没有umi的安装方式 npm install g umi 3 执行以下代码 npm create umi 文件名 或者 yarn create umi
  • 不要在问了!工作六年总结的Java面试题与经验

    前言 最近看到很多小伙伴都在因为面试烦恼 所以小编总结了一些面试经验 希望能帮助到大家 一 面试到底在问些什么东西 首先你要知道 面试官的提问和你简历上写的内容是紧密联系的 所以你简历上写的技能一定要会 一般面试包括下面几方面知识类型 Ja
  • 解决[Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘validate‘ of undefined“

    在做前后端登录时出现下列错误 解决如下 this refs loginForm validate 中的与ref loginForm 名字要相同 或者要定义这个ref 没有定义或者名称不一致都会出现上述错误
  • 你的数字藏品可能真的只是一张图片

    国外 NFT 市场的火爆也同样引燃了国内的市场 像腾讯 阿里等诸多大厂纷纷入局 同时 大量中小企业也在这些头部企业的带领下聚集而来 出于政策风险隐患的防范要求 国内的区块链并不是国外的公链 而是由一个或多个机构独立部署的联盟链 同时也将 N
  • CMD查看当前文件路径下的所有文件名

    介绍 我们知道Linux系统下查看当前文件路径下的所有文件名 可以用ls或ll来查看 那么CMD中怎么查看当前路径下的所有文件呢 方案 使用 dir 命令即可 效果如下
  • Go语言编程思想3——错误处理和资源管理

    Go语言编程思想3 错误处理和资源管理 资源管理 及时关闭文件 及时释放资源 如果打开的文件还未关闭就因为出错而在中间跳出 就无法保证有效的资源管理 因此在这里两者一起进行考虑 一 defer调用 调用在函数结束时发生 在return pa
  • echarts 调整x类目轴axisLabel间距

    场景 产品认为x轴的刻度太密集 需要稀一点 调研 关于这个需求 想到的有 xAxis interval 指定的是所有横坐标的间隔 需要自行计算间隔多少 xAxis splitNumber 对类目轴不生效 xAxis axisLabel fo
  • 【java 程序设计实训】学生请假管理系统

    学生请假管理系统 运行结果 学生请假管理系统需求分析 GUI 编程 事件处理 数据库编程 部分代码 项目结构 实体类 Admin java LeaveData java UserLogin java MainWindow java leav
  • 嵌入式linux 第二章:软件下载

    嵌入式linux 目录 第一章 vi 使用 第二章 软件下载 第三章 软件下载 嵌入式linux 一 软件下载模式 1 deb 1 1 下载 1 2 删除 2 apt get 2 1 下载 2 2 删除 2 3 清除缓存 查询软件包信息 一
  • 每日一题:订单编号

    订单编号 题目 Daimayuan Online Judge 一开始想用二分答案的 但是后来发现不行 二分答案每找到一个值 就要去掉它的左半边或右半边 但是这里不能去 错误代码 include
  • C++(CMake)视觉OpenCV-Raspberry Pi图像处理-3D图像重建-面部界标检测-卷积神经网络车牌自动识别-深度神经网络面部检测和识别

    演示如何为桌面和小型嵌入式系统 如 Raspberry Pi 编写一些图像处理过滤器 使用 SfM 模块将场景重建为稀疏点云 包括相机位姿 以及如何使用多视图立体获取密集点云 使用人脸模块进行人脸界标 也称为人脸标记 检测的过程 图像分割和
  • SpringBoot系统整理

    写在前面 很早之前看了狂神的springboot快速入门 后来发现还是有很多开发知识点需要补充学习 乘着假期 将基础篇 运维实用篇 开发实用篇 原理篇一口气学习巩固 再次记录下学习笔记 系列笔记在springboot中哦 目录 1 快速上手
  • 【基于协同过滤算法的电影推荐】

    目录 1 协同过滤算法 1 1 CF与 User Item 推荐算法区别 1 2 UserCF 1 3 ItemCF 2 评价指标 3 基于userCF与itemCF电影推荐 3 1 MovieLens数据集 3 2 userCF代码实现