算法

【深度学习基础】从零开始的炼丹生活07——深度模型中的优化

喜夏-厌秋 提交于 2020-02-04 07:09:35
往期回顾: 04——从传统机器学习走向深度学习 05——深度前馈网络、神经网络概述 06——深度学习中的正则化 介绍了神经网络的基本构件和正则化策略之后,学习一下深度模型中的优化。先说一说传统的纯优化与机器学习中的优化的异同,再介绍一下神经网络中优化的挑战,最后说说基本的优化算法。(参考《深度学习》第8章) 一、机器学习中的优化 传统的优化方法是纯优化最小化目标 J 本身,而机器学习的优化是间接作用的。在机器学习问题中,我们关注某些性能度量 P ,其定义于测试集上并且是不可解的。因此机器学习希望通过降低代价函数 J(θ)来间接提高 P 。 1. 经验风险最小化 机器学习算法的目标是降低期望泛化误差 J ∗ ( θ ) = E ( x , y ) ∼ p d a t a L ( f ( x ; θ ) , y ) J^*(\theta)=\mathbb E_{(\bold {x,y})\sim p_{data}}L(f(x;\theta),y) J ∗ ( θ ) = E ( x , y ) ∼ p d a t a ​ ​ L ( f ( x ; θ ) , y ) 这被称为 风险 。此时数据取自真实的潜在分布,然而,我们遇到的问题通常并不清楚真实分布,只知道训练集中的样本。 我们将机器学习中的优化转换回一个优化问题的最简单方法就是最小化训练集上的期望损失,以训练集上的经验分布 p

数据结构与算法——Day01

纵饮孤独 提交于 2020-02-04 05:46:53
数据结构与算法——Day01 1:数组 1.1 什么是数组 数组本质上就是一组数的集合 1.2 数组的定义 在内存中开辟 连续 的存储空间,存贮 相同类型数据 的 有序 集合 1.2.1基础定义: 连续:在内存中连续分配的,有序的 相同数据类型:数组中存储的数据都是相同数据类型的 有序:数组存储时内存有序,存在一个连续的索引,索引从0开始 1.3 数组的特点 数组的长度不能修改 查询,修改效率高 迭代元素效率高 添加删除效率低 1.4 数组的使用场景 ​ 对于数据进行查询,但是不会频次较高的添加或者删除动作。 1.5 问题 数组的索引为什么是从0开始的 因为从0开始可以通过简单的计算快速定位到元素的地址值 数组中元素的地址值=首元素的地址+(索引*元素的宽度) 结论:数组能够快速的通过索引定位到元素。一旦从数组中对于元素进行各项操作,如果知道当前元素的索引就能够款苏进行操作 为什么说数组的长度一旦指定不能修改 数组开辟的是内存中连续的存储空间 ,导致如果从出现长度可以修改是特别小号内存资源的,很多时可能出现内存够用,但实质的连续内存空间不够用导致内存溢出问题。 来源: CSDN 作者: 三木成森. 链接: https://blog.csdn.net/Asdzxc968/article/details/104161050

70.冒泡排序的基础算法

扶醉桌前 提交于 2020-02-04 05:11:51
package test1 ; import java . util . Arrays ; public class testBubbleSort { public static void main ( String [ ] args ) { int [ ] values = { 3 , 1 , 6 , 2 , 9 , 0 , 7 , 4 , 5 , 8 } ; bubbleSort ( values ) ; System . out . println ( Arrays . toString ( values ) ) ; int [ ] values2 = { 3 , 1 , 6 , 2 , 9 , 0 , 7 , 4 , 5 , 8 } ; bubbleSort2 ( values2 ) ; System . out . println ( Arrays . toString ( values2 ) ) ; } static void bubbleSort ( int [ ] arr ) { for ( int i = arr . length - 1 ; i > 0 ; -- i ) { for ( int j = 0 ; j < i ; ++ j ) { if ( arr [ j ] > arr [ j + 1 ] ) swap ( arr , j , j + 1 ) ;

推荐系统实践读书笔记

跟風遠走 提交于 2020-02-04 04:59:59
最近大概复习了一下这本书,了解了较早的推荐系统的一些方法,记录如下,以便大家对本书内容有个快速地了解。略去了第一张,详细的代码和细节可以参考其他博客。需要关注的地方直接标出了页码。 书里面的代码不是很完整,用来学习还可以。第八章介绍了一些svd等机器学习的算法,在2020年的今天可以回顾一下。 推荐系统实践 第二章:利用用户行为数据 常见数据集: Book-Crossing(有评分、年龄、书籍的简介等) ,Last.fm , Netflix Prize ,Delicious(有标签) ,CiteULike(有标签),Digg, Yahoo!Music, GroupLens, KDD cup. 基于用户的cf:可以先构造倒排表,然后再计算用户相似度,这样能降低计算开销(p47)。User-IIF算法的表现更好。 基于物品的cf:解释性强。IUF算法(1998)降低了活跃用户对物品相似性的影响,归一化的物品cf能提高推荐的多样性。 两种cf的比较:usercf更加类似社会网络推荐,itemcf更加偏重挖掘某个用户的爱好。Itemcf在覆盖率方面不如usercf,可以通过p63的方法改进。 隐语义模型:借鉴文本挖掘领域的知识,包括LDA\pLSA\矩阵分解等。书中介绍了LFM,推导和伪代码已经给出。这个方法能极大地提高覆盖率,在Netflix Prize比赛中也使用了LFM

数据结构与算法篇二

落花浮王杯 提交于 2020-02-04 04:53:41
查找算法 这篇主要写一些查找算法 线性查找 package lx3 ; public class TestSearch { //线性查找 public static void main ( String [ ] args ) { //目标数组 int [ ] elements = new int [ ] { 2 , 9 , 5 , 1 , 6 , 8 , 3 , 4 } ; //目标元素 int target = 5 ; //目标元素所在下标(默认-1) int index = - 1 ; //遍历数组 //思考一下 若(i<=elements.length)会是什么情况? for ( int i = 0 ; i < elements . length ; i ++ ) { //若数组中值等于target则返回 if ( elements [ i ] == target ) { intdex = i ; break ; } } //打印 System . out . println ( "index:" + index ) ; } } 二分法查找 package lx3 ; public class TestBinarySearch { public static void main ( String [ ] args ) { //目标数组 int [ ] arr = new

JSON Web Token

我与影子孤独终老i 提交于 2020-02-04 03:57:52
JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。虫虫今天给大家介绍JWT的原理和用法。 1.跨域身份验证 Internet服务无法与用户身份验证分开。一般过程如下。 1.用户向服务器发送用户名和密码。 2.验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中。 3.服务器向用户返回session_id,session信息都会写入到用户的Cookie。 4.用户的每个后续请求都将通过在Cookie中取出session_id传给服务器。 5.服务器收到session_id并对比之前保存的数据,确认用户的身份。 这种模式最大的问题是,没有分布式架构,无法支持横向扩展。如果使用一个服务器,该模式完全没有问题。但是,如果它是服务器群集或面向服务的跨域体系结构的话,则需要一个统一的session数据库库来保存会话数据实现共享,这样负载均衡下的每个服务器才可以正确的验证用户身份。 例如虫虫举一个实际中常见的单点登陆的需求:站点A和站点B提供同一公司的相关服务。现在要求用户只需要登录其中一个网站,然后它就会自动登录到另一个网站。怎么做? 一种解决方案是听过持久化session数据,写入数据库或文件持久层等。收到请求后,验证服务从持久层请求数据。该解决方案的优点在于架构清晰,而缺点是架构修改比较费劲,整个服务的验证逻辑层都需要重写,工作量相对较大

Paxos 算法

主宰稳场 提交于 2020-02-04 02:55:04
一致性投票算法 :(分布式网络系统)(共识算法) 过程: Paxos第一阶段:预提案(准备Perpare/诺言Promises)     提议者Proposer:     向接受者Acceptor广播预提案,附带接下来提案Proposal的proposal_id   接受者Acceptor:     收到预提案后更新a_proposal_id = max(proposal_id,a_proposal_id),如果预提案的proposal_id>a_proposal_id,Acceptor回复记录的接受过的proposal_id最大的提案。     【第一阶段A:Proposer选择一个提议编号n,向所有的Acceptor广播Prepare(n)请求。     第一阶段B:Acceptor接收到Prepare(n)请求,若提议编号n比之前接收的Prepare请求都要大,则承诺将不会接收提议编号比n小的提议,并且带上之前Accept的提议中编号小于n的最大的提议,否则不予理会。】 Paxos第二阶段:提案阶段(Paoxs接纳Acceptance)     提议者Proposer:       等待直到收到大多数接受者对预提案的回复,从所有回复的提案组成的法定数目的提案集合K中挑选proposal_id最大的提案,以该提案的值作为本次提案的值。       如果K是空集

【Python】实现A*算法解决8 puzzle问题

强颜欢笑 提交于 2020-02-03 22:12:47
问题: 8 Puzzle game - Develop and code an algorithm to solve the 8 puzzle game. You will probably want to use A* to solve this one. The maze should be randomizeable, and the program should show every move to solve the puzzle. Your program should be able to work for any size board. You must show at least two puzzles being solved, one for 8×8, and one for 10×10. 翻译为: 8益智游戏-开发并编码一个算法来解决8益智游戏。你可能想用A*算法来解决这个问题。迷宫应该是随机的,程序应该显示出解决这个难题的每一步。你的程序应该可以在任何大小的板上工作。您必须显示至少两个正在解决的谜题,一个用于8×8,一个用于10×10。 结果如图所示: 需要的微信滴滴我 来源: CSDN 作者: winrh 链接: https://blog.csdn.net/qq_32117641/article/details/104161647

JVM的认识

不问归期 提交于 2020-02-03 22:08:56
一、概念   JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个 虚构出来 的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在 不同平台上运行时不需要重新编译 。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 二、概述 Java虚拟机有自己 完善的硬件架构 ,如处理器、堆栈等,还具有相应的指令系统。 Java虚拟机本质上就是一个 程序 ,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“ 一次编译,多次运行 ”。 Java技术使同一种应用可以运行在不同的平台上。Java平台可分为两部分,即J ava虚拟机 (Java virtual machine,JVM)和 Java API类库 三、体系结构 Java虚拟机主要分为五大模块: 类装载器子系统 、 运行时数据区 、 执行引擎 、 本地方法接口 和 垃圾收集模块。 Java虚拟机不是真实的物理机,它没有寄存器,所以指令集是使用

并发编程中一些问题

假如想象 提交于 2020-02-03 22:00:02
多线程就一定好吗?快吗?? 并发编程的目的就是为了能提高程序的执行效率提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、上下文切换、死锁还有受限于硬件和软件的资源闲置问题。 多线程就是几乎同时执行多个线程(一个处理器在某一个时间点上永远都只能是一个线程!即使这个处理器是多核的,除非有多个处理器才能实现多个线程同时运行)。CPU通过给每个线程分配CPU时间片来实现伪同时运行,因为CPU时间片一般很短很短,所以给人一种同时运行的感觉。 上下文切换 当前任务在执行完CPU时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换会这个任务时,可以再加载这个任务的状态。 任务从保存到再加载的过程就是一次上下文切换。 上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以, 上下文切换对系统来说意味着消耗大量的 CPU 时间 ,事实上,可能是操作系统中时间消耗最大的操作。 Linux相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。 减少上下文切换 上下文切换又分为2种: 让步式上下文切换 和 抢占式上下文切换 。前者是指执行线程主动释放CPU,与锁竞争严重程度成正比,可通过 减少锁竞争