机器学习之推荐算法(代码片段)

ywjfx ywjfx     2022-12-21     395

关键词:

1、知识点

"""
推荐系统
    1、相似度计算:
        1、欧几里德距离
        2、皮尔逊相关系数
        3、Cosin距离
        
    2、推荐相似度选择:
            1、固定数量的邻居
            2、基于相似度门槛的邻居
            
    3、基于用户的协同过滤:根据用户和其他用户之间的相关系数值,选择值越小的用户数据,并和该用户比较,推荐物品
            需要解决的问题:1、已知用户评分矩阵R(一般很稀疏) 2、推断矩阵中空格empty cells处的值
        基于用户的协同过滤不利于对全0矩阵进行推荐,其解决方案:
            1、相似度计算最好使用皮尔逊相似度
            2、考虑共同打分物品的数目
            3、对打分进行归一化处理
            4、设置一个相似度阈值  
        缺点:1、稀疏问题(很多值为0)   2、大用户量不利于计算,因此不推荐基于用户的协同过滤
        row:为用户  ,column:为物品
        场景:实时新闻、突发情况(实时数据)


    4、基于物品的协同过滤:根据物品和物品之间的相似度,然后取阈值,获取相邻的值,即推荐物品   (一般使用皮尔逊相关系数)
        优点:1、计算性能高,用户数量大于物品数量
        row:为用户物品  ,column:为用户
        场景:图书、电子商务、电影(离线数据)
        
    5、用户冷启动问题(即用户注册的时候):
            1、引导用户把自己的一些属性表达出来
            2、利用现有的开发数据平台
            3、根据用户注册的属性
            4、推荐排序榜单
      
    6、物品冷启动问题:
        1、文本分析
        2、主题模型
        3、打标签
        4、推荐排行榜单   
          
    7、隐语义模型:将矩阵进行分解,然后求解隐含特征F,从而可以根据F得到一个先的具有填充值的NM矩阵,从而实现推荐,即NM = NF * FM
            1、从数据出发,今天个性化推荐
            2、用户和物品之间有着隐含联系
            3、隐含因子让计算机能理解就好
            4、将用户和物品通过中介隐含因子联系起来
        隐语义模型参数选择:
            1、隐特征的个数F,通常F=100
            2、学习率alpha 别太大
            3、正则化参数lambda,别太大
            4、负样本和正样本比例ratio    
    8、协同过滤与  隐语义对比
        1、原理:协同过滤基于统计方法,隐语义基于建模
        2、空间复杂度,隐语义模型较小
        3、实时推荐依旧难,目前离线计算多
      
    9、模型评估指标
        1、准确率 :均方误差
        2、召回率 :正负样本中,推荐正样本中正确的比例
        3、覆盖率
        4、多样性
        
推荐难点:
    1、计算量解决
    2、模型的好坏怎么评估,怎么更新


suprise 推荐系统api
    url:https://surprise.readthedocs.io/en/stable/getting_started.html
    数据地址:http://files.grouplens.org/datasets/movielens/ml-100k-README.txt

基于用户的协同过滤:
"""

2、代码实现推荐案例

# coding = utf-8
from __future__ import (absolute_import,division,print_function,unicode_literals)

from surprise import SVD,KNNBasic
from surprise import Dataset
from  surprise import evaluate,print_perf

from surprise import GridSearch

import pandas as pd


import os
import io
from surprise import KNNBaseline

def collaborativeFiltering():
    """
    协同过滤算法
    :return:
    """
    #1、加载数据
    data = Dataset.load_builtin(ml-100k)
    data.split(n_folds=3)#3折,结果有3个

    #2、实例化协同过滤算法对象
    algo = KNNBasic()
    pref =evaluate(algo,data,measures=[RMSE,MAE])#算法模型评估
    print_perf(pref)

def matrixFactorization():
    """
    SVD,矩阵分解
    :return:
    """
    param_grid = n_epochs:[5,10],lr_all:[0.002,0.005],reg_all:[0.4,0.6]
    grid_search = GridSearch(SVD,param_grid,measures=[RMSE,FCP])
    data = Dataset.load_builtin(ml-100k)
    data.split(n_folds=3)  # 3折,结果有3个
    grid_search.evaluate(data)

    print(grid_search.best_score[RMSE]) #最好的得分值
    print(grid_search.best_params[RMSE])  # 最好的得分值

    result_df =pd.DataFrame.from_dict(grid_search.cv_results)
    print(result_df)

def recommendItem():
    data = Dataset.load_builtin(ml-100k) #加载u.data文件
    trainset = data.build_full_trainset()
    sim_options = name:pearson_baseline,user_based:False #皮尔逊相似度pearson_baseline ,‘user_based‘:False表示基于物品的协同过滤
    algo = KNNBaseline(sim_options=sim_options) #协同过滤
    algo.train(trainset) #训练

    #获取电影的id
    rid_to_name,name_to_rid = read_item_names()
    toy_story_raw_id = name_to_rid[Now and Then (1995)]
    print(toy_story_raw_id) #数据文件中的id

    toy_story_inner_id =algo.trainset.to_inner_iid(toy_story_raw_id)
    print(toy_story_inner_id)#实际计算矩阵中的id

    toy_story_neighbors_id = algo.get_neighbors(toy_story_inner_id,k=10)
    print(toy_story_neighbors_id) #实际计算矩阵中的id

    toy_story_neighbors_id = (algo.trainset.to_raw_iid(inner_id) for inner_id in toy_story_neighbors_id) #数据文件中的id

    toy_story_neighbors_name = (rid_to_name[rid] for rid in toy_story_neighbors_id) #数据文件中的name

    print("##########推荐item#########")
    for movie in toy_story_neighbors_name:
        print(movie)


def read_item_names():
    file_name=(./ml-100k/u.item)
    rid_to_name=
    name_to_rid=

    with io.open(file_name,r,encoding=ISO-8859-1) as  f:
        for line in f:
            line = line.split(|)
            rid_to_name[line[0]] = line[1]
            name_to_rid[line[1]]=line[0]
    return rid_to_name,name_to_rid

if __name__ == __main__:
    recommendItem()

 3、基于物品的协同过滤图

技术图片

 

强烈推荐机器学习之算法篇(代码片段)

机器学习算法机器学习算法数据类型:可用数据集:监督学习和无监督学习:算法分类:scikit-learn数据集获取数据集:获取数据集方式:数据集的划分:本地数据集:分类数据集:回归数据集&#x... 查看详情

机器学习之协同过滤算法(推荐系统)

前言      以下内容是个人学习之后的感悟,转载请注明出处~  简介  很多网站都有推荐系统,向我们推荐我们想要地或者有可能需要的信息,那么它是怎么实现的呢?因为它们都采用了推荐算法... 查看详情

机器学习之集成学习算法(代码片段)

...#xff0c;因此优于任何一个单分类的做出预测。1.2复习:机器学习的两个核⼼任务任务一:如何优化训练数据 —>主要用于解决欠拟合问题任务二:如何提升泛化性能 — 查看详情

机器学习之k-近邻(knn)算法(代码片段)

 一.K-近邻算法(KNN)概述   最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到... 查看详情

菜鸟之路——机器学习之knn算法个人理解及python实现(代码片段)

KNN(KNearestNeighbor)还是先记几个关键公式距离:一般用Euclideandistance  E(x,y)√∑(xi-yi)2 。名字这么高大上,就是初中学的两点间的距离嘛。     还有其他距离的衡量公式,余弦值(cos),相关度(corr... 查看详情

机器学习之五:神经网络反向传播算法(代码片段)

一、逻辑回归的局限在逻辑回归一节中,使用逻辑回归的多分类,实现了识别20*20的图片上的数字。但所使用的是一个一阶的模型,并没有使用多项式,为什么?可以设想一下,在原有400个特征的数据样本中,增加二次、三次、... 查看详情

集成学习之随机森林案例专题python机器学习系列(十七)(代码片段)

集成学习之随机森林案例专题【Python机器学习系列(十七)】文章目录1.Bagging与随机森林简介2.随机森林--分类任务2.1准备数据2.2python实现随机森林--分类任务2.3绘制ROC曲线与计算AUC2.4绘制决策树3.随机森林--回归任务集成... 查看详情

机器学习之fp-growth频繁项集算法(代码片段)

FP-growth算法项目背景/目的对于广告投放而言,好的关联会一定程度上提高用户的点击以及后续的咨询成单对于产品而言,关联分析也是提高产品转化的重要手段,也是大多商家都在做的事情,尤其是电商平台曾经我用SPSSModeler做过Aprio... 查看详情

机器学习之knn鸢尾花分类(代码片段)

KNN简介邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。kNN算法的核... 查看详情

机器学习之k均值算法应用(代码片段)

1.应用K-means算法进行图片压缩读取一张图片观察图片文件大小,占内存大小,图片数据结构,线性化用kmeans对图片像素颜色进行聚类获取每个像素的颜色类别,每个类别的颜色压缩图片生成:以聚类中收替代原像素颜色,还原为... 查看详情

机器学习之深度学习入门(代码片段)

...习资料,学习建议本文用浅显易懂的语言精准概括了机器学习的相关知识,内容全面,总结到位,剖析了机器学习的what,who,when,where,how,以及why等相关问题。从机器学习的概念,到机器学习的发... 查看详情

机器学习之决策树(代码片段)

1、C4.5算法介绍C4.5算法与ID3算法不同的是采用了信息增益比作为特征的选择,原因是:信息增益在选择属性时偏向于选择取值较多的属性。2、信息增益比特征A对训练数据集D的信息增益比定义为其信息增益g(D,A)与特征A的熵HA(D)之... 查看详情

菜鸟之路——机器学习之hierarchicalclustering层次分析及个人理解(代码片段)

这个算法。我个人感觉有点鸡肋。最终的表达也不是特别清楚。原理很简单,从所有的样本中选取Euclideandistance最近的两个样本,归为一类,取其平均值组成一个新样本,总样本数少1;不断的重复,最终样本数为1。这样的话就... 查看详情

机器学习之支持向量机(手推公式版)(代码片段)

...ine,SVM)源于统计学习理论,是一种二分类模型,是机器学习中获得关注最多的算法,没错, 查看详情

rust机器学习之tch-rs(代码片段)

Rust机器学习之tch-rstch-rs是PyTorch接口的Rust绑定,可以认为tch-rs是Rust版的PyTorch。本文将带领大家学习如何用tch-rs搭建深度神经网络识别MNIST数据集中的手写数字。本文是“Rust替代Python进行机器学习”系列文章的第五篇,其... 查看详情

机器学习之logistic回归(逻辑回归)(代码片段)

目录Logistic回归博客园地址:https://www.cnblogs.com/chenyoude/git地址:https://github.com/nickcyd/machine_learning微信:a1171958281Logistic回归本章内容回归算法Logistic回归的一般过程Logistic的优缺点基于Logistic回归和Sigmoid函数的分类Sigmoid函数Logistic... 查看详情

python机器学习之svm(支持向量机)实例(代码片段)

其实在很早以前写过一期SVM,只不过当时对SVM只是初步的了解,现在重新来看,其实SVM还是有很多值得学习的地方。1.SVM介绍SVM可以理解为:使用了支持向量的算法,支持向量机是一种基于分类边界分界的方法。以... 查看详情

机器学习之logistic回归算法

1Logistic回归算法的原理1.1需要的数学基础我在看机器学习实战时对其中的代码非常费解,说好的利用偏导数求最值怎么代码中没有体现啊,就一个简单的式子:θ=θ - α Σ[(hθ(x(i))-y(i) )]*xi。经过查找资料才知道,... 查看详情