Python购物篮数据(关联分析)
pip install mlxtend
由于已经是csv格式,所以直接输入:
每一行: 一个购物篮
每一列: 购物篮中的商品
先看看pd读的对不对:
然后按行打印:
再将这些存在一个数组中:
1、什么是独热码
独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制,更加详细参加 one_hot code(维基百科) 。在机器学习中对于离散型的分类型的数据,需要对其进行数字化比如说性别这一属性,只能有男性或者女性或者其他这三种值,如何对这三个值进行数字化表达?一种简单的方式就是男性为0,女性为1,其他为2,这样做有什么问题?
使用上面简单的序列对分类值进行表示后,进行模型训练时可能会产生一个问题就是特征的因为数字值得不同影响模型的训练效果,在模型训练的过程中不同的值使得同一特征在样本中的权重可能发生变化,假如直接编码成1000,是不是比编码成1对模型的的影响更大。为了解决上述的问题,使训练过程中不受到因为分类值表示的问题对模型产生的负面影响,引入独热码对分类型的特征进行独热码编码。
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征(如成绩这个特征有好,中,差变成one-hot就是100, 010, 001)。并且,这些 特征互斥 ,每次只有一个激活。因此,数据会变成稀疏的。
这样做的好处主要有:
(1)解决了分类器不好处理 属性数据 的问题
(2)在一定程度上也起到了 扩充特征 的作用
M
以下为我摘取的别人的,贴上原文链接
著名的啤酒与尿布, 这是典型的购物篮问题, 在数据挖掘界叫做频繁项集(Frequent Itemsets).
note: 数据类型写法按照Python的格式.
一. 目标与定义
1. 问题背景
超市中购物清单中总是有一些项目是被消费者一同购买的. 如果我们能够发现这些 关联规则 ( rules), 并合理地加以利用, 我们就能取得一定成果. 比如我们发现热狗和芥末存在这种关系, 我们对热狗降价促销, 而对芥末适当提价, 结果能显著提高超市的销售额.
2. 目标
找到频繁地 共同 出现在消费者结账小票中项目(比如啤酒和尿布), 来一同促销, 相互拉动, 提高销售额.
3. 定义
支持度support: 其实就是概率论中的频次frequency
支持度阈值support : 记为s, 指分辨频繁项集的临界值.
频繁项集: 如果I是一个项集(Itemset), 且I的出现频次(i.e.支持度)大于等于s, 那么我们说I是频繁项集.
一元项, 二元项, 三元项: 包含有一种商品, 两种, 三种商品的项集.
4. 关联规则
关联规则: 形式为I->j, 含义是如果I种所有项都出现在某个购物篮的话, 那么j很有可能也出现在这个购物篮中. 我们可以给出相应的值(可信度, 即概率论中的置信度).
其中, 这个关联规则的可信度计算为 = I∪{j} / I, 本身是非常符合直觉和常识的. 比如我们说关联规则{dog, cat} -> and 的可信度为0.6, 因为{dog, cat}出现在了1, 2, 3, 6, 7五个购物篮中, 而and出现在了1,2,7中, 因此我们可以算出 = freq[{dog, cat, and}] / freq[{dog, cat}] = 3/5 = 0.6
注意到, 分子部分的频次总是比分母低, 这是因为{dog, cat} 出现的次数总是大于等于{dog, cat, and}的出现次数.
二. 购物篮与A-Priori算法
1. 购物篮数据表示
我们将有一个文本文件输入, 比如allBills.txt, 或者allBills.csv. 里面每行是一个购物篮.
文件的头两行可能是这样(df.show(2)):
{23, 456, 1001}
{3, 18, 92, 145}
我们假定这是一家大型连锁超市, 比如沃尔玛, 因此这个文本文件是非常大的, 比如20GB. 因此我们无法一次将该文件读入内存. 因此, 算法的主要时间开销都是磁盘IO.
我们同时还假定, 所有购物篮的平均规模是较小的, 因此在内存中产生所有大小项集的时间开销会比读入购物篮的时间少很多.
我们可以计算, 对于有n个项目组成的购物篮而言, 大小为k的所有子集的生成时间约为(n, k) = n! / ((n-k)!k!) = O(n^k/ k!), 其中我们只关注较小的频繁项集, 因此我们约定k=2或者k=3. 因此所有子集生成时间T = O(n^3).
Again, 我们认为 在内存中产生所有大小项集的时间开销会比读入购物篮的时间少很多.
2. Itemset计数过程中的内存使用
我们必须要把整个k,v字典放在内存中, 否则来一个Itemset就去硬盘读取一次字典将十分十分地慢.
此处, 字典是k=(18, 145), v=15这种形式. 此处, 应当注意到, 如果有{bread, milk, orange}这样的String类型输入, 应当预先用一个字典映射成对应的整数值编码, 比如1920, 4453, 9101这样.
那么, 我们最多能用字典存储多少种商品?
先看下我们存储多少个count值.
我们假定项的总数目是n, 即超市有n种商品, 每个商品都有一个数字编号, 那么我们需要(n, 2) = n^2/2 的大小来存储所有的二元组合的count, 假设int是占4个byte, 那么需要(2·n^2)Byte内存. 已知2GB内存 = 2^31 Byte, 即2^31/2 = 2^30 >= n^2 --> n <= 2^15. 也就是说n<33 000, 因此我们说商品种类的最多是33k种.
但是, 这种计算方法存在一个问题, 并不是有10种商品, 那么这10种商品的任意二元组合都会出现的. 对于那些没出现的组合, 我们在字典中完全可以不存储, 从而节省空间.
同时, 别忘了我们同样也得存储key = (i, j), 这是至少额外的两个整数.
那么我们到底具体怎么存储这些计数值?
可以采用三元组的方式来构造字典. 我们采用[i, j, count]形式来存储, 其中i代表商品种类1, j代表商品种类2, 前两个值代表key, 后面的value就是count, 是这个二元组合下的计数.
现在, 让我们注意到我们(1)假定购物篮平均大小较小, 并(2)利用三元组(2个key的)字典和(3)不存储没出现组合优势. 假设有100k = 10^5种商品, 有10million=10^7个购物篮, 每个购物篮有10个项, 那么这种字典空间开销是(10, 2) · 10^7 = 45 x 10^7 x 3= 4.5x10^8x3 = 1.35x10^9 个整数. 这算出来约为4x10^8 Byte = 400MB, 处于正常计算机内存范围内.
3. 项集的单调性
如果项集I是频繁的, 那么它的所有子集也都是频繁的. 这个道理很符合常识, 因为{dog, cat} 出现的次数总是大于等于{dog, cat, and}的出现次数.
这个规律的推论, 就是严格地, 我们频繁一元组的个数> 频繁二元组的个数 > 频繁三元组的个数.
4. A-Priori算法
我们通过Itemset计数中内存使用的*, 已经明确了我们总是有足够的内存用于所有存在的二元项集(比如{cat, dog})的计数. 这里, 我们的字典不存放不存在于购物篮中的任何二元项集合, 而且频繁二元组的数目将会大于三元频繁三元组> ...
我们可以通过单边扫描购物篮文件, 对于每个购物篮, 我们使用一个双重循环就可以生成所有的项对(即二元组). 每当我们生成一个项对, 就给其对应的字典中的value +1(也称为计数器). *, 我们会检查所有项对的计数结果,并且找出那些>=阈值s的项对, 他们就是频繁项对.
1) A-Priori算法的*遍扫描
在*遍扫描中, 我们将建立两个表. *张表将项的名称转换为1到n之间的整数, 从而把String类型这样的key转为空间大小更小的int类型. 第二张表将记录从1~n每个项在所有购物篮中出现的次数. 形式上类似
table 0(name table): {'dolphin': 7019, 'cat': 7020} //dict形式, 其实也可以做成list形式 [['dolphin', 7019], ['cat', 7020]]
table 1(single-item counter table): {7019: 15, 7020: 18} //dict形式, 其实也可以做成数组形式A[7019] = 2, A[7020] = 18
2) *遍扫描完的处理
*遍扫描完后, 我们会按照自己设定的阈值s, 对整个table 1再进行一次mapping, 因为我们只关注*counter值大于等于阈值的项目, 而且不关心其counter值具体多少. 因此, mapping策略是:
对凡是counter
=s的, 按照次序, 把其设置成1~m的值(总共有m个满足要求的项)
3) 第二遍扫描
第二遍扫描所做的事有三:
(1) 对每个购物篮, 在table 1中检查其所有的商品项目, 把所有为频繁项的留下来建立一个list.
(2) 通过一个双重循环生成该list中的所有项对.
(3) 再走一次循环, 在新的数据结构table 2(dict或者list)中相应的位置+1. 此时的效果是dicta = {48: {13: 5}, 49: {71, 16}} 或者 lista [ [48, 13, 5],[49, 71, 16], ... ]
注意此时内存块上存储的结构: table1(name table), table2(single-item counter table), table3(double-item counter table)
5. 推广: 任意大小频繁项集上的A-Priori算法
我们对上面这个算法进行推广.
从任意集合大小k到下一个大小k+1的转移模式可以这么说:
(1) 对每个购物篮, 在table 1中检查其所有的商品项目, 把所有为频繁项的留下来建立一个list.
(2) 我们通过一个k+1重循环来生成该list中的所有(k+1)元组
(3) 对每个k+1元组, 我们生成其的(k+1 choose k)个k元组, 并检查这些k元组是否都在之前的table k中. (注意到k=1的时候, 这步与(1)是重复的, 可以省略)
(4)再走一次循环, 在新的数据结构table k+1(dict或者list)中相应的位置+1. 此时的效果是k=2, k+1=3, 生成dicta = {48: {13: {19: 4}}, 49: {71: {51: 10}}, ... } 或者 生成lista [ [48, 13, 19, 4],[49, 71, 51, 10], ... ]
注意, 在进入下一次扫描前, 我们还需要额外把counter中值小于s的元组的计数值都记为0.
模式总体是: C1 过滤后 L1 计数后 C2 置零后 C2' 过滤后 L2 计数后 C3 置零后 C3' ......
END.
生成的商品种类为set形式:转成list形式
*张表:把项名称转换为1~n的整数:
至于数数,大神说,你就用.Counter就好:哈?
哈哈,可爱的wyy,开始分析吧~噜噜噜啦啦啦~噜啦噜啦噜~
生成全零矩阵:
换成zeros:
统计每一列的和,即每种商品的购买总数:
每一行列:
*行:
建立一个新的只含有频繁一项集的购物篮矩阵:
频繁二项集:用python怎么实现购物车的加减功能
1、利用selenium控制浏览器实现抢购加减功能,用此库模拟用户从打开浏览器到加入购物车提交订单付款的过程即可实现抢购优点是简单方便,缺点是速度慢和受网速影响较大。
2、用Requests库,模拟提交浏览器到服务器的数据,浏览器在开发者模式界面看到每一次请求的具体信息,把这些信息通过此库发送到服务器也可实现抢购加减功能,优点是速度快,缺点是复杂,容易被识别反爬虫。python怎么使用?
答:如果您已经成功安装Python,那么对于初学者来说,你可以先在命令行下执行一些语句去看一下效果。 Python和C语言等有一些不一样,它可以逐行解析语句,如下所示,定义一个变量a的值。
当你更深入的时候,你就可以使用一些专用的Python开发环境来进行代码编写比如PyChatm和Jupyter。希望可以帮助到你。
少儿编程python哪家好?
一、什么是少儿编程
少儿编程教育是通过编程游戏启蒙、可视化图形编程等课程,培养学生的计算思维和创新解难能力的课程。少儿编程教育并不是要培养未来的程序员,而是让孩子能掌握新科技并应用新科技表达自己,由科技时代的消费者转变为创造者;同时,少儿编程是培养小朋友思维能力的理想载体。
二、STEAM教育是什么
STEAM是一种教育理念,有别于传统的单*、重书本知识的教育方式。STEAM代表科学(Science)、技术()、工程()、艺术(Arts)、数学()。STEAM教育就是集科学,技术,工程,艺术,数学多*融合的综合教育。
三、少儿编程主要学习什么
不同年龄段的孩子,其认知能力不同,适合入门学习的编程语言也不同。
编程主要学的是逻辑和算法,少儿编程中更重要的是学习逻辑,就目前而言,刚入门的孩子以scratch或Python作为*门编程语言来学习是非常合适的。
四、scracth相关知识
1、什么是scratch
Scratch是麻省理工的“终身幼儿园团队”开发的图形化编程工具,目的是帮助孩子发展学习技能,学习创造性思维,以及学习集体合作。
Scratch将程序指令变为一个个“积木块”,使用者无需敲击代码或是背诵任何编程指令,只需要将积木块拖拽并连接在一起,就可以很方便的进行编程,从而快速制作出动画、游戏、交互程序。
2、Scratch是游戏吗
Scratch不是游戏,而是一款可以制作游戏、动画、工具的编程语言。一旦掌握了Scratch,孩子们就能自由自在地挥洒它们无限的创意,享受创造的乐趣。Scratch由麻省理工媒体实验室开发出来至今,有超过100万的孩子在学习Scratch。在中*的教育中通过Scratch,扩展了语文,数学,外语,音乐,体育,科学的教学深度。
3、Scratch为什么适合孩子学习(特点)
(1)操作简单易懂
Scratch不像其他编程那样复杂,整个编程的过程,Scratch是以鼠标拖拽的形式操作的,所以对于不会阅读,不认识英文字母,不会使用键盘的小朋友们来说,完全不构成障碍;并且scratch对计算机硬件配置没有任何特殊要求。
(2)学习过程视觉化,对初学者非常友好
编程过程中,孩子们拖动鼠标移动积木,立刻就能看见他们这一操作所产生的结果,非常直观生动。传统的文本代码的编程语言,有很多严格语法规则,比如括号,字母的大小写等都有严格的要求,而scratch完全简化了这些规则,孩子们不需要死记硬背,不需要理解乱七八糟的符号是什么意思,总之一句话:有了scratch,孩子学编程非常简单。
(3)学习内容全面,有利于过度到其他语言
在这里要给各位家长们强调一点,scratch不是一个游戏,是一门真正的计算语言。很多成年人也在使用它,成熟的scratch程序员,可以用它来实现非常复杂的功能。而且scratch包含了所有计算机语言的通用概念:有函数、循环、条件判断等等。不管学哪种程序语言,都会碰到这些最基本的东西。对于学习scratch的孩子而言,想要继续深入学习任何别的编程语言,都是水到渠成,没有任何障碍的。
(4)学习成果快速反馈,给孩子极大的成就感
孩子们用scratch完成的动画、游戏、故事等各种作品,都可以发布,跟朋友们分享,可以极大的增加孩子的成就感。
Python常用的场景:
(1)WEB开发。就是通常所说的网站开发,APP后端接口的开发,Python最火的WEB开发框架Django在业界非常流行,其中的设计哲学常用于其它程序语言设计的框架。
(2)爬虫。爬虫就是俗话说的抓网页,抓别人的东西。在爬虫领域,Python几乎是霸主地位,拥有成熟强大的爬虫框架库,想从网络中抓什么就抓什么。
云计算。目前最*的云计算框架OpenStack就是使用Python开发。
(3)人工智能。毫无疑问,人工智能是当下乃至未来科技发展的主旋律。人工智能在这些年获得快速发展也是得益于Python丰富而强大的科学计算能力。大家都知道谷歌开源的人工智能学习框架就是采用Python开发,人工智能的发展反过来也深深的影响了Python的大规模使用。
(4)自动化运维。相信每一个运维人员都知道Python,各行各业中的系统经常使用Python写小工具来自动化操作一系列机器指令,让一个人能够管理成百上千的机器。同时Python也是金融分析,量化交易领域用的最多的语言。
掌握Python,小朋友们可以尝试使用它做各种各样有趣的事,在未来工业化4.0的背景下,使用编程语言,能够帮助小朋友知其然又知其所以然,顺利的与人工智能机器人协同工作。
六、scracth与Python有什么不同
1、开发目的不同。Scratch是专注于提供适用于儿童的编程语言和工具,而Python是一种计算机编程语言,更多的被用于计算机项目。
2、使用对象不同,Scratch针对的一般是*及以下阶段的学生,可视化语言可以很好的帮助学生学习基本的逻辑、关系推理、数学的概念,同时避免过早的接触到“形式运算阶段”之后才能理解的抽象的演绎推理。Python针对*高年级,初高中阶段,这个时候学生的数理逻辑基础相对扎实,有了基础的思维逻辑。
3、学习方式不同。scratch是界面色彩丰富,图形化编程,只要用鼠标拖动图标就可以,通过一步一步指导,可以做出很复杂的作品。python是命令式编程,本身打字就慢,还要打那么多,如果是急性子的孩子,会很容易失去兴趣;但是它是高级语言,灵活性高,学会后,能够做的事情远远比scratch多。
python有少儿编程吗
有少儿编程。少儿编程的优点:
少儿程序员可以使孩子加强思维训练,从而使他们的大脑能够为孩子提供良好的实践活动,从而使他们具有一定的创造力和想象力
Python编程使孩子们在学习的道路上走得越来越远。它提供的编程软件非常有趣。它可以带给孩子学习的兴趣,带来学习的动力,并使孩子有一个持久的过程。学习编程不仅可以让孩子掌握一项新技能,还可以给孩子带来良好的互动,从而使孩子们对未来充满挑战。
学习编程将是一个循序渐进的过程,使孩子们能够不断发现新知识,不断思考和分析问题,从而为孩子提供更好的锻炼方法。现在,许多孩子都在大约4岁时开始编程课程。这表明父母有长远眼光,可以给孩子更好的基础。
Python编程可以使孩子们更轻松地学习编程课程,并且还可以通过多种方式给孩子们学习。孩子们可以通过当前的在线教学方法学习编程,从而使父母不必来回走动,从而孩子可以自由地掌握时间。
更多Python知识,请关注:Python自学网!!