迭代计算

详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++

淺唱寂寞╮ 提交于 2020-03-25 09:36:18
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天是 机器学习专题的第13篇 文章,我们来看下Kmeans算法的优化。 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我们提出了一个问题:Kmeans算法虽然效果不错,但是每一次迭代都需要遍历全量的数据,一旦数据量过大,由于计算复杂度过大迭代的次数过多,会导致 收敛速度非常慢 。 想想看,如果我们是在面试当中遇到的这个问题,我们事先并不知道正解,我们应该怎么回答呢? 还是老套路,我们在回答问题之前,先来分析问题。问题是收敛速度慢,计算复杂度高。计算复杂度高的原因我们也知道了, 一个是因为样本过大,另一个是因为迭代次数过多 。所以显然,我们想要改进这个问题,应该从这两点入手。 这两点是问题的关键点,针对这两点我们其实可以想出很多种优化和改进的方法。也就是说这是一个开放性问题,相比标准答案,推导和思考问题的思路更加重要。相反,如果我们抓不住关键点,那么回答也会跑偏,这就是为什么我在面试的时候,有些候选人会回答使用分布式系统或者是增加资源加速计算,或者是换一种其他的算法的原因。 也就是说分析问题和解决问题的思路过程,比解决方法本身更加重要。 下面,我们就上面提到的两个关键点各介绍一个优化方法。 mini batch mini batch的思想非常朴素,既然全体样本当中数据量太大

迭代器。

情到浓时终转凉″ 提交于 2020-03-24 21:11:34
什么是迭代器! 迭代器指的是迭代取值的工具,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”, 迭代是一个重复的过程,而每一次迭代得到的结果会作为下一次迭代的初始值 每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代 while True: msg = input('>>: ').strip() print(msg)    为何要有迭代器 迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型 有:列表、字符串、元组、字典、集合、打开文件 要想了解迭代器为何物,必须事先搞清楚一个很重要的概念:可迭代对象(Iterable)。 从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象: l=['egon','liu','alex'] i=0 while i < len(l): print(l[i]) i+=1    如何用迭代器 可迭代的对象:但凡内置有__iter__方法的都称之为可迭代的对象 s1='' # s1.__iter__() l=[] # l.__iter__() t=(1,) # t.__iter__() d={'a':1} # d.__iter__() set1={1,2,3} # set1.__iter__() with open('a.txt',mode='w'

机器学习:Python实现聚类算法(二)之AP算法

吃可爱长大的小学妹 提交于 2020-03-24 18:42:52
1.算法简介 AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法,是在2007年的Science杂志上提出的一种新的聚类算法。AP算法的基本思想是将全部数据点都当作潜在的聚类中心(称之为exemplar),然后数据点两两之间连线构成一个网络(相似度矩阵),再通过网络中各条边的消息(responsibility和availability)传递计算出各样本的聚类中心。 2.相关概念(假如有数据点i和数据点j) (图1) (图2) (图3) 1)相似度: 点j作为点i的聚类中心的能力,记为S(i,j)。一般使用负的欧式距离,所以S(i,j)越大,表示两个点距离越近,相似度也就越高。使用负的欧式距离,相似度是对称的,如果采用其他算法,相似度可能就不是对称的。 2)相似度矩阵:N个点之间两两计算相似度,这些相似度就组成了相似度矩阵。如图1所示的黄色区域,就是一个5*5的相似度矩阵(N=5) 3) preference:指点i作为聚类中心的参考度(不能为0),取值为S对角线的值(图1红色标注部分),此值越大,最为聚类中心的可能性就越大。但是对角线的值为0,所以需要重新设置对角线的值,既可以根据实际情况设置不同的值,也可以设置成同一值。一般设置为S相似度值的中值。(有的说设置成S的最小值产生的聚类最少,但是在下面的算法中设置成中值产生的聚类是最少的) 4

JavaScript中的迭代器与循环

烂漫一生 提交于 2020-03-24 18:15:35
引言: 本文涉及内容包括: forEach方法 for-in方法 for-of方法 eval()方法 map()方法 今天来总结一下,JS中我们常见的循环方式与迭代器,深入了解他们之间的区别,及适合的使用场景。 最早的数组遍历方式 var a = ["a", "b", "c"]; for(var index = 0;index < a.length;index++){ console.log(a[index]); } for循环 ,我们最熟悉也是最常用的循环迭代方式,后来的许多迭代方法都是基于for循环封装的。 1 forEach 语法: [].forEach( function (value, index, array) { // ... }); forEach遍历数组,而不是遍历对象哦,而且在遍历的过程中不能被终止,必须每一个值遍历一遍后才能停下来. 也就是说:你不能使用break来退出循环, 不能使用return语句来返回到外层 jquery中forEach 注意其与jQuery的$.each类似,只不过参数正好是相反的! $.each([], function (index, value, array) { // ... }); 2 for...in 适合进行普通对象的遍历 for-in循环遍历对象的key,即键值对的键名。 特性如下: 1. 方法遍历到的index

Python常用语句及流程控制

孤人 提交于 2020-03-24 17:42:10
1. 赋值语句常用技巧 通过序列解包(sequence unpacking) 可以将多个值的序列解开,让后一一放置到变量的序列中。解包的序列中的元素必须和等号左边变量数量一致。如下: 1 values = 1,2,3 2 3 print values # output: (1, 2, 3) 4 5 x,y,z = values # output: 1 2 3 6 print x,y,z 7 8 bob_Info = {'name':'Bob','email':'bob@gmail.com'} 9 key,value = bob_Info.popitem() 10 11 print value # output: Bob 1.2 链式赋值 通过使用链式赋值(chained assignment)可以将一个值同时赋给多个变量,如下: x = y = z = 1 print x,y,z # output: 1 1 1 1.3 增量赋值 将表达式运算符( + 、 - 、 * 、 % 、 / 等)放置在赋值运算符(=)的左边,这些写法被称为增量赋值(augmented assignment),如下: 1 x = 6 2 3 x += 1 4 print x # output: 7 5 6 x *= 6 7 print x # output: 42 2. 缩进 —— Python语言的风格

Python专题——详解enumerate和zip

China☆狼群 提交于 2020-03-24 10:27:55
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天是 Python专题的第7篇 文章,我们继续介绍迭代相关。 enumerate 首先介绍的是enumerate函数。 在我们日常编程的过程当中,经常会遇到一个问题。 在C语言以及一些古老的语言当中是没有迭代器这个概念的,所以我们要遍历数组或者是容器的时候,往往只能通过下标。有了迭代器之后,我们遍历的过程方便了很多,我们可以直接用一个变量去迭代一个容器当中的值。最简单的例子就是数组的遍历,比如我们要遍历items这个数组。我们可以直接: for item in items: 通过迭代器的方式我们可以很轻松地遍历数组,而不再需要下标,也不需要计算数组的长度了。但是 如果我们在循环体当中需要知道元素的下标该怎么办 ? 难道我们真的只能在下标和迭代器当中选择一个吗,比如在循环体的外面添加一个变量来记录下标? idx = 0for item in items: operation() idx += 1 这样可以解决问题,但是很麻烦,一点也不简洁,用专业的话来说一点也不 pythonic (符合Python标准的代码)。为了追求pythonic,于是有了enumerate函数,来解决了我们又想直接迭代又需要知道元素下标的情形。 它的用法也很简单,我们把需要迭代的对象或者迭代器传入enumerate函数当中,它会为我们

C++标准模板库里面的容器

ぃ、小莉子 提交于 2020-03-23 13:32:09
1. 顺序容器 sequential container 单一类型 元素组成的 有序 集合 优:顺序访问元素快 不足:添加、删除元素性能相对低 非顺序访问元素性能相对低 vector、string、array都是连续的内存空间 容器选择:取决于执行访问的操作多还是插入删除的操作多     ①一般用vector     ②空间开销很重要时,不适用链表如list、forward_list     ③需要随机访问:vector、deque     ④要在中间进行插入、删除:链表类型如list、forwad_list     ⑤只要在头尾插入、删除:deque     ⑥读取输入时要在中间插入,之后要随机访问: 输入时用vector追加数据,在调用sort()函数,以避免在中间添加元素 若必须要在中间插入元素,输入时用list,输入完成后将list的内容保存到vector中 1.1 vector    https://zh.cppreference.com/w/cpp/container/vector (1)vector的增长 vector<int> ivec; cout<<"size:"<<ivec.size()<<endl; cout<<"capacity:"<<ivec.capacity()<<endl; for(int i=0;i<20;i++) { ivec.push_back

Python之迭代器、装饰器、软件开发规范

喜你入骨 提交于 2020-03-23 09:00:27
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需求,看列表 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 1 >>> a 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 3 >>> b = [] 4 >>> for i in a:b.append(i+1) 5 ... 6 >>> b 7 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 8 >>> a = b 9 >>> a 10 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 普通青年版 a = [1,3,4,6,7,7,8,9,11] for index,i in enumerate(a): a[index] +=1 print(a) 原值修改 1 >>> a 2 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 3 >>> a = map(lambda x:x+1, a) 4 >>> a 5 <map object at 0x101d2c630> 6 >>> for i in a:print(i) 7 ... 8 3 9 5 10 7 11 9 12 11

python3之迭代器&生成器

China☆狼群 提交于 2020-03-23 07:06:06
1、迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: iter() 生成迭代器和 next() 遍历迭代器元素。 >>> dil = iter(range(10)) #使用iter方法创建一个迭代器 >>> print(type(dil)) #类型为迭代器 <class 'range_iterator'> >>> print(dil) <range_iterator object at 0x7fb9bf466ed0> >>> l1 = [1,2,3,4,5] >>> it = iter(l1) #将列表转换为迭代器 >>> print(type(it)) <class 'list_iterator'> >>> print(it) <list_iterator object at 0x7fb9bf42e9e8> >>> print(next(it)) 1 >>> print(next(it)) 2 >>> print(next(it)) 3 >>> print(next(it)) 4 >>> print(next(it)) 5 >>> print(next(it)) #如果迭代器元素到最后没有了就会报错

PYTHON_DAY_04

馋奶兔 提交于 2020-03-23 06:02:11
目录 一.函数对象 二.函数的嵌套 三.函数名称空间与作用域 四.闭包函数 五.无惨装饰器简单实现 六.装饰器的流程分析及修订 七.有参装饰器的实现及附加多个装饰器流程分析 八.叠加多个装饰器 九.迭代器 十.生成器 十一.内置函数 一:函数对象:函数是第一类对象,即函数可以当作数据传递1. 可以被引用 def foo(): print('from foo') func=foo print(foo) print(func) func()    2. 可以当作参数传递 def foo(): print('from foo') def bar(func): print(func) func()      # 这里在执行foo() 并打印结果 bar(foo) # 这里执行函数bar() 传入的参数func就是foo地址    3. 返回值可以是函数 def foo(): print('from foo') def bar(func): return func f=bar(foo) print(f) f()    4. 可以当作容器类型的元素 def foo(): print('from foo') dic={'func':foo} #这里的value-foo就是函数的地址 print(dic['func']) dic['func']() #利用该特性,优雅的取代多分支的ifdef