iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 练手程序合集(三)
  • 356
分享到

Python 练手程序合集(三)

合集程序Python 2023-01-31 07:01:53 356人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

六、协同过滤 Slope One是一个可以用于推荐系统的算法,在只有很少的数据时候也能得到一个相对准确的推荐,而且算法很简单, 易于实现, 执行效率高,由此衍生的还有加权 Slope One 算法、双极 SlopeOne 算法(B

六、协同过滤

Slope One是一个可以用于推荐系统的算法,在只有很少的数据时候也能得到一个相对准确的推荐,而且算法很简单, 易于实现, 执行效率高,由此衍生的还有加权 Slope One 算法、双极 SlopeOne 算法(BI-Polar SlopeOne)将用户对于其的厌恶程度也引入打分机制中,下面简单解释一下 Slope One 算法的原理:

用户 东西一 东西二
张三 5分 3分
李四 4分 3分
王五 4分 X分

我们已知张三和李四对两个东西的评分,然后知道王五关于东西一的评分,问王五有可能对东西二是什么态度,基于这个评分我们可以选择推荐给王五什么东西来吸引王五进行购买
给东西一和东西二打分的“平均差距”应该是相似的,比如这个样本中只有两个人,张三认为东西二要比东西一低2分,李四认为东西二应该比东西一低1分,根据已购买的这两个用户,东西二平均应该比东西一低1.5分,那么我有理由认为,王五有很大可能性也会这样认为,给东西二打分为3.5分(4分-1.5分)
所以Slope One的计算方法是:
这里写图

# encoding: utf-8


class SlopeOne(object):
    # self.diffs 矩阵存储评分矩阵,
    # self.freqs 存储一对 items 被相同用户评分的数量。
    def __init__(self):
        self.diffs = {}
        self.freqs = {}
    # 根据提供的数据,构建self.diffs / self.freqs字典

    def update(self, data):
        # 遍历每个用户的每个评分数据
        for user, prefs in data.items():
            # 确保子字典存在
            for item, rating in prefs.items():
                self.freqs.setdefault(item, {})
                self.diffs.setdefault(item, {})
                # setdefault 作用:
                # 如果对于给定的键值/setdefault的第一个参数,
                # 字典中为对应value为空,
                # 则将setdefault的第二个参数赋值给它。
                # 下面再次循环遍历user对应的prefs中的每一组评分
                for item2, rating2 in prefs.items():
                    self.freqs[item].setdefault(item2, 0)
                    self.diffs[item].setdefault(item2, 0.0)
                    # 使用整数0初始化次数,浮点型零初始化评分。
                    # 利用两个item是否同时被一个用户评分,
                    # 对self.freqs进行更新
                    self.freqs[item][item2] += 1
                    # 利用两个item的评分之差,对self.diffs矩阵进行更新
                    self.diffs[item][item2] += rating - rating2
        # 将两个item在diffs 矩阵与 freqs矩阵对应位置相除,
        # 结果保存到freqs中,即为两个item的平均差距
        for item, ratings in self.diffs.items():
            for item2, rating in ratings.items():
                ratings[item2] /= self.freqs[item][item2]
    # 对新的用户偏好,根据 self.diffs / self.freqs 对新用户进行评分预测

    def predict(self, userprefs):
        # 定义两个空字典,preds存储预测数据,freqs存储计数
        preds, freqs = {}, {}
        # 迭代每一个物品(被用户评分过的)
        # 使用try/except跳过没有被评分的物品对
        for item, rating in userprefs.items():
            for diffitem, diffratings in self.diffs.items():
                try:
                    freq = self.freqs[diffitem][item]
                except KeyError:
                    continue
                # 设置preds初始值为0.0, freqs初始值为0
                preds.setdefault(diffitem, 0.0)
                freqs.setdefault(diffitem, 0)
                # 累加
                preds[diffitem] += freq * (diffratings[item] + rating)
                freqs[diffitem] += freq
        # 在返回结果之前,进行过滤
        # 返回一个 带权重预测值 的新字典
        # 结果中除去了 用户已经评分过的内容 和 物品计数为零的内容
        return dict([(item, value / freqs[item]) for item, value in preds.items() if item not in userprefs and freqs[item] > 0])


s = SlopeOne()
s.update(dict(alice = dict(squid=1.0, cuttlefish=4.0), bob = dict(squid=1.0, cuttlefish=1.0, octupus=3.0)))
prediction = s.predict(dict(squid=3.0, cuttlefish=4.0))
for item, rating in prediction.items():
    print(item+":\t"+str(rating))

注意的是文章中的iteritems以迭代器对象,返回键值对儿(python3中不再支持),改用iterms

参考文献:
1、协同过滤算法的python实现
2、上面文章英文原文的翻译

七、Bitmap算法

我们可能在算法书中都看过,对于海量数据的处理是有一些独特的算法的,通常来说如下六种:

序号 算法
1 分而治之/hash映射 + hash统计 + 堆/快速/归并排序
2 双层桶划分
3 Bloom filter/Bitmap
4 Trie树/数据库/倒排索引
5 外排序
6 分布式处理之hadoop/mapReduce

这里我介绍的是Bitmap,BitMap就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素,该方法在快速查找、去重、排序、压缩数据上都有应用
假设我们要对0-7内的5个元素(4,7,2,5,3)排序,因为要表示8个数,我们就只需要8个bit(1Bytes)。

元素 2 3 4 5 7
占位 × × ×
地址 0 1 2 3 4 5 6 7

这样就排序完成了,该方法难在数对二进制位的映射,因为类型到底多长是和平台和环境有关的,我们假定int是32bit,之后假设我们现在有320个数据需要排序,则int a[1+10],a[0]可以表示从0-31的共32个数字,a[1]可以表示从32-61的共32个数字,我们可以想象这是一个二位数组,但是其实并不是
我们可以很容易得出,对于一个十进制数n,对应在数组a[n/32][n%32]中

# encoding: utf-8

from collections import namedtuple
from copy import copy

Colour = namedtuple('Colour','r,g,b')
Colour.copy = lambda self: copy(self)

black = Colour(0,0,0)
white = Colour(255,255,255) # Colour ranges are not enforced.

class Bitmap():
    def __init__(self, width = 40, height = 40, background=white):
        assert width > 0 and height > 0 and type(background) == Colour
        self.width = width
        self.height = height
        self.background = background
        self.map = [[background.copy() for w in range(width)] for h in range(height)]

    def fillrect(self, x, y, width, height, colour=black):
        assert x >= 0 and y >= 0 and width > 0 and height > 0 and type(colour) == Colour
        for h in range(height):
            for w in range(width):
                self.map[y+h][x+w] = colour.copy()

    def chardisplay(self):
        txt = [''.join(' ' if bit==self.background else '@'
                       for bit in row)
               for row in self.map]
        # Boxing
        txt = ['|'+row+'|' for row in txt]
        txt.insert(0, '+' + '-' * self.width + '+')
        txt.append('+' + '-' * self.width + '+')
        print('\n'.join(reversed(txt)))

    def set(self, x, y, colour=black):
        assert type(colour) == Colour
        self.map[y][x]=colour

    def get(self, x, y):
        return self.map[y][x]


bitmap = Bitmap(20,10)
bitmap.fillrect(4, 5, 6, 3)
assert bitmap.get(5, 5) == black
assert bitmap.get(0, 1) == white
bitmap.set(0, 1, black)
assert bitmap.get(0, 1) == black
bitmap.chardisplay()

八、优先队列

优先队列和普通队列大体上相似,但有一个重大区别:每个被添加进队列的元素都有一个优先级,在从队列中移除元素时,先移除优先级最高的元素。在观念上,元素是存储在按照优先级排序的队列中,而不是插入顺序。
Python的标准库中有优先队列这个数据结构,队列这个数据结构中是同步的多生产者-多消费者,并且支持多线程

# encoding: utf-8
'''
Priority    Task
  3        Clear drains
  4        Feed cat
  5        Make tea
  1        Solve RC tasks
  2        Tax return
'''

import queue
pq = queue.PriorityQueue()
for item in ((3, "Clear drains"), (4, "Feed cat"), (5, "Make tea"), (1, "Solve RC tasks"), (2, "Tax return")):
    pq.put(item)

while not pq.empty():
    print(pq.get_nowait())

想进一步了解优先队列,可以使用

import queue
help(queue.PriorityQueue)
Help on class PriorityQueue in module queue:

查看帮助手册来获得更多get、join、put等函数的使用方法

--结束END--

本文标题: Python 练手程序合集(三)

本文链接: https://www.lsjlt.com/news/191476.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python 练手程序合集(三)
    六、协同过滤 Slope One是一个可以用于推荐系统的算法,在只有很少的数据时候也能得到一个相对准确的推荐,而且算法很简单, 易于实现, 执行效率高,由此衍生的还有加权 Slope One 算法、双极 SlopeOne 算法(B...
    99+
    2023-01-31
    合集 程序 Python
  • python案例练习合集
    目录一、python批量查询练习二、python批量请求(GET | POST)三、python列表转集合练习一、python批量查询练习 通过接口批量查询该ip是否属于指定接口: ...
    99+
    2024-04-02
  • PYTHON-模拟练习题目集合
     🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0&...
    99+
    2023-09-25
    python 开发语言 学习
  • python 教程与手册(60IN1合集
    python 教程与手册(60IN1合集)1个豆 下载地址: http://down.51cto.com/data/659954   CGI介绍及使用Python来开发CGI应用示例.pdfdive into pythonDjango绝对简...
    99+
    2023-01-31
    合集 手册 教程
  • 【python学习】新手基础程序练习(一
      首先得先编一下程序员必须编的程序——Hello World……(这应该是程序员情结。。。) 1 #coding=utf-8 2 #Version:python3.7.0 3 #Tools:Pycharm 2017.3.2 4 _da...
    99+
    2023-01-30
    新手 基础 程序
  • 【python学习】新手基础程序练习(二
    Ι  继续上一节得内容,这里主要是对各种知识的理解以及如何运用。 一、执行 Python 脚本的两种方式 1.把python执行文件加到计算机的环境变量中,然后新建文件把程序写在新文件里,再通过cmd命令打开命令提示符终端,输入pytho...
    99+
    2023-01-30
    新手 基础 程序
  • python基础知识(三)set集合
    set集合不同元素组成无序集合中元素必须是不可变的类型s={1,2,3,4,5,6} #增加 s.add("s") #清空 s.clear() #弹出 s.pop() #删除指定值,删除元素不存在报错 s.remove("s") #删除指定...
    99+
    2023-01-31
    基础知识 python set
  • 适合Python 新手的5大练手项目,你
    已经学习了一段时间的Python,如果你看过之前W3Cschool的文章,就知道是时候该进去【项目】阶段了。但是在练手项目的选择上,还存在疑问?不知道要从哪种项目先下手?W3Cschool首先有两点建议:最好不要写太应用的程序练手,要思考...
    99+
    2023-01-31
    适合 新手 项目
  • 教自己学Python(三)练手小游戏:不
    不要猜中的小游戏 背景 和朋友闲待着两个人无聊,都想吃苹果又都不想洗,想起玩过的一个酒桌上猜数字的游戏,然后在手机上写了出来,三局两胜输了去洗苹果…… 游戏介绍 零到99(包括边界),随机一个数两人(N人也可以)轮流猜测,如果没猜...
    99+
    2023-01-31
    小游戏 Python
  • Python练习程序(一)Python用
    功能:用户认证后,联系人信息查询#!/usr/bin/env python #coding=utf-8 name = raw_input("请输入你的用户名:") while name != 'fgf':         name = ra...
    99+
    2023-01-31
    程序 Python
  • Python Flask + Redis 程序练习
    目录1.程序准备2.镜像准备3.创建一个docker bridge4.创建redis container5.创建flask container6.查看页面7.总结两个容器,一个fla...
    99+
    2024-04-02
  • C#中对集合排序的三种方式
    对集合排序,可能最先想到的是使用OrderBy方法。 class Program { static void Main(string[] args) ...
    99+
    2024-04-02
  • Python-表白小程序练习
    测试代码 在结果导向的今天,切勿眼高于顶,不论用任何方法能转换、拿出实际成果东西才是关键,即使一个制作很简易的程序,你想将其最终生成可运行的版本也是需要下一番功夫的。不要努力成为一个嘴炮成功者,要努力成为一个有价值的人。 # encodin...
    99+
    2023-09-30
    python 小程序 开发语言
  • 五个有趣的Python整蛊小程序合集
    目录无聊程序之一无聊程序之二无聊程序之三无聊程序之四无聊程序之五pyinstaller 编码 BUGPython 能做很多无聊,但有意思的事情,例如接下来的一些案例。 以下程序,不要...
    99+
    2024-04-02
  • 3个适合新手练习的python小游戏
    目录1.猜拳2.数字炸弹3.赌大小学Python之前我们先来几个简单的小游戏练练手,这三个小游戏一个比一个复杂,建议新手慢慢来: 1.猜拳 import random  #导入随机模...
    99+
    2024-04-02
  • 【Python】编程练习的解密与实战(三)
    ​🌈个人主页:Sarapines Programmer🔥 系列专栏:《Python | 编程解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 ᾩ...
    99+
    2024-01-21
    python 开发语言 算法 编程 练习
  • Python划分数组为连续数字集合的练习
    目录1、问题描述2、解决方案3、结语本文转自微信公众号:"算法与编程之美" 1、问题描述 给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个...
    99+
    2024-04-02
  • Python学习笔记三(Python程序
     Linux系统自带的python版本通常都比较低,可以在python官方网站(http://www.python.org/download/)下载最新源码包,然后进行升级安装。1.下载python源码包。wget http://www....
    99+
    2023-01-31
    学习笔记 程序 Python
  • Python学习之路1 有序集合和无需集
    1.集合是指包含一组元素的数据结构,包括: 1. 有序集合:list,tuple,str和unicode; 2. 无序集合:set 3. 无序集合并且具有 key-value 对:dict ...
    99+
    2023-01-31
    之路 Python
  • 小程序tip集合如何使用
    这篇文章主要介绍“小程序tip集合如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“小程序tip集合如何使用”文章能帮助大家解决问题。小程序组件中tip的集合:view(视图容器。)tip: 如...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作