分类 工具 下的文章

深度学习和机器学习的区别

首先看看机器学习的定义:
“A computer program is said to learn from experience E with respect to some class of tasksT and performance measureP if its performance at tasks inT, as measured by P, improves with experience E ”(这段话我真的是看了100遍才知道怎么断句啊!!(Д))
翻译过来就是:“一个电脑程序要完成任务(T),如果电脑获取的关于T的经验(E)越多就表现(P)得越好,那么我们就可以说这个程序‘学习’了关于T的经验。”
简单来说,就是解释什么叫“机器的学习”,如果输入的经验越多表现的越好,这就叫“学习”嘛。
我们首先浏览所有的历史风暴数据,从这些大量的数据中学习出某些“模式”,这些“模式”包含了具体的哪些条件可以导致风暴。
比如我们也许可以通过学习历史数据发现:温度超过40度,湿度在80-100之间,就容易发生风暴。种种类似的模式。
这里注意了!“温度”、“湿度”等等指标,就是机器学习中的“特征”,而这些特征都是人工设置好的!就是说,我们在做这样一个预测系统的时候,首先由专家通过分析哪些“特征”是重要的,然后机器就通过分析历史数据中的这些特征的数据,来找到相应的模式,也就是怎样的特征的组合会导致怎样的结果。
还是首先看看深度学习的定义:
“Deep learning is a particular kind of machine learning that achieves great power and flexibility by learning to represent the world as nested hierarchy of concepts, with each concept defined in relation to simpler concepts, and more abstract representations computed in terms of less abstract ones.”(这个起码听起来像人话,但还是让人疑惑。。。)
我试着翻译一下:深度学习是一种特殊的机器学习,它可以获得高性能也十分灵活。它可以用概念组成的网状层级结构来表示这个世界,每一个概念更简单的概念相连,抽象的概念通过没那么抽象的概念计算。(有没有大佬帮忙指正一下?)
2.识别狗和猫:
如果是传统机器学习的方法,我们会首先定义一些特征,如有没有胡须,耳朵、鼻子、嘴巴的模样等等。总之,我们首先要确定相应的“面部特征”作为我们的机器学习的特征,以此来对我们的对象进行分类识别。
而现在,深度学习的方法则更进一步。深度学习自动地找出这个分类问题所需要的重要特征!而传统机器学习则需要我们人工地给出特征!
5.运行时间
深度学习需要花大量的时间来训练,因为有太多的参数需要去学习。顶级的深度学习算法ResNet需要花两周的时间训练。但是机器学习一般几秒钟最多几小时就可以训练好。
但是深度学习花费这么大力气训练处模型肯定不会白费力气的,优势就在于它模型一旦训练好,在预测任务上面就运行很快。这才能做到我们上面看到的视频中实时物体检测。
6.可理解性
最后一点,也是深度学习一个缺点。其实也说不上是缺点吧,那就是深度学习很多时候我们难以理解。一个深层的神经网络,每一层都代表一个特征,而层数多了,我们也许根本就不知道他们代表的啥特征,我们就没法把训练出来的模型用于对预测任务进行解释。例如,我们用深度学习方法来批改论文,也许我们训练出来的模型对论文评分都十分的准确,但是我们无法理解模型到底是啥规则,这样的话,那些拿了低分的同学找你质问“凭啥我的分这么低啊?!”,你也哑口无言····因为深度学习模型太复杂,内部的规则很难理解。
但是机器学习不一样,比如决策树算法,就可以明确地把规则给你列出来,每一个规则,每一个特征,你都可以理解。
但是这不是深度学习的错,只能说它太牛逼了,人类还不够聪明,理解不了深度学习的内部的特征。
以上就是关于机器学习和深度学习的联系和区别了。首先说说感受吧,感觉很多国外的文章,尤其是这样的类似科普文章写的真心棒!很好理解,而且解释的非常详细,这是很多国内博客所不能比的。所以建议大家有问题可以多搜搜国外的文章读一读,而且其实英文也用的很简单。
https://www.analyticsvidhya.com/blog/2017/04/comparison-between-deep-learning-machine-learning/

hive中的join

一、hive中的join
inner join 等价于 join, 可以理解为 join 是 inner join 的缩写;left join 等价于 left outer join ;right join 等价于 right outer join;
二、
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

基于用户标签的推荐系统

拿到了用户标签行为数据,相信大家都可以想到一个最简单的个性化推荐算法。这个算法的描述如下所示:
1)统计每个用户最常用的标签。
2)对于每个标签,统计被打过这个标签次数最多的物品。
3)对于一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门物品推荐给这个用户
未完待续

Hadoop distcp集群间同步数据

hadoop distcp -D ipc.client.fallback-to-simple-auth-allowed=true -log /temp/tianhailong/ webhdfs://10.11.4.240:50070/test/tianhl webhdfs://10.11.1.10/user/hive

遇到的坑:
1、数据所在的集群所有机器,需要配置同步集群的hosts。
2、带有Kerberos安全认证,需要加参数。-D ipc.client.fallback-to-simple-auth-allowed=true
3、 注意运行日志,需要写入有权限的文件夹。 -log /temp/tianhailong/
4、被写入数据的集群是hive用户写入的,需要找一个hive可以写入的权限的文件夹存放数据。/user/hive
 
参数说明:

-m <num_maps> 同时拷贝的最大数目 指定了拷贝数据时map的数目。请注意并不是map数越多吞吐量越大。

参考网址:
https://community.hortonworks.com/questions/294/running-distcp-between-two-cluster-one-kerberized.html
http://stardust.wang/?p=331

维度表和事实表

维度表示你要对数据进行分析时所用的一个量, 比如你要分析产品销售情况, 你可以选择按类别来进行分析,或按区域来分析. 这样的按..分析就构成一个维度。前面的示例就可以有两个维度:类型和区域。另外每个维度还可以有子维度(称为属性),例如类别可以有子类型,产品名等属性。
下面是两个常见的维度表结构:
产品维度表:Prod_id, Product_Name, Category, Color, Size, Price
时间维度表:TimeKey, Season, Year, Month, Date
而事实表是数据聚合后依据某个维度生成的结果表。它的结构示例如下:
销售事实表:Prod_id(引用产品维度表), TimeKey(引用时间维度表), SalesAmount(销售总量,以货币计), Unit(销售量)
 
上面的这些表就是存在于数据仓库中的。从这里可以看出它有几个特点:
1. 维度表的冗余很大,主要是因为维度一般不大(相对于事实表来说的),而维度表的冗余可以使事实表节省很多空间。
2. 事实表一般都很大,如果以普通方式查询的话,得到结果一般发的时间都不是我们可以接受的。所以它一般要进行一些特殊处理。如SQL Server 2005就会对事实表进行如预生成处理等。
3. 维度表的主键一般都取整型值的标志列类型,这样也是为了节省事实表的存储空间。
 
事实表和维度表的分界线
事实表是用来存储主题的主干内容的。以日常的工作量为例,工作量可能具有如下属性:工作日期,人员,上班时长,加班时长,工作性质,是否外勤,工作内容,审核人。那么什么才是主干内容?很容易看出上班时长,加班时长是主干,也就是工作量主题的基本内容,那么工作日期,人员,工作性质,是否外勤,工作内容是否为主干信息呢?认真分析特征会发现,日期,人员,性质,是否外勤都是可以被分类的,例如日期有年-月-日的层次,人员也有上下级关系,外勤和正常上班也是两类上班考勤记录,而上班时长和加班时长则不具有此类意义。所以一般把能够分类的属性单独列出来,成为维度表,在事实表中维护事实与维度的引用关系。
在上述例子中,事实表可以设计成如下
WorkDate EmployeeID,WorkTypeID,Islegwork,Content,
而时间,员工,工作类型,是否外勤则归为维度表。
总的来看,和其他建立主外键关系的表也都一样。但是维度表的建立是需要有层次的(虽然不是必须,但是也是典型特征),而事实表的建立是针对已经发生的事实的,是历史数据的存档,也就是说是不应该修改的。以测试部测试软件的Bug为例。每个Bug都是一个事实。这个Bug的状态在数据字典里可能设计成新建,转派,修复,拒绝等等。那么在事实表中Bug表中有一个字段为Status。当测试员或者开发人员改变了这个状态的值,事实表中该如何更新呢?是直接更新Status还是什么其他的方式?显然,为了能够追踪这个Bug的历史信息,应该是重新插入一条新的记录。那么这和以往的数据库设计有什么区别呢?可以看出对于原始记录和新插入的记录,其他字段全部是相同的,也就是全部冗余的。如果以BugID作为主键,这时候会发现主键都是冗余的(当然,插入之前只能删除主键)。所以可以看出,事实表一般是没有主键的。数据的质量完全由业务系统来把握。
总的说来,事实表的设计是以能够正确记录历史信息为准则,维度表的设计是以能够以合适的角度来聚合主题内容为准则。
 
维是分析问题的角度,每一维代表一个统一的访问数据仓库中信息的路径。
在实际问题中,有些维包含多个层次。
事实是各个维度的交点,是对某个特定事件的度量,只有当特定维值的组合没有造成空穴时,一个事实才会存在。事实的数量属性称为度量。
事实数据和维度数据的识别必须依据具体的主题问题而定。“事实表”,用来存储事实的度量(measure)及指向各个维的外键值。维表用来保存该维的元数据,即维的描述信息,包括维的层次及成员类别等

所产生的数据,事实数据表通常包含大量的行。事实数据表的主要特点是包含数字数据(事实),并且这些数字信息可以汇总,以提供有关单位作为历史的数据,每个事实数据表包含一个由多个部分组成的索引,该索引包含作为外键的相关性纬度表的主键,而维度表包含事实记录的特性。事实数据表不应该包含描述性的信息,也不应该包含除数字度量字段及使事实与纬度表中对应项的相关索引字段之外的任何数据。
包含在事实数据表中的“度量值”有两中:一种是可以累计的度量值,另一种是非累计的度量值。最有用的度量值是可累计的度量值,其累计起来的数字是非常有意义的。用户可以通过累计度量值获得汇总信息,例如。可以汇总具体时间段内一组商店的特定商品的销售情况。非累计的度量值也可以用于事实数据表,单汇总结果一般是没有意义的,例如,在一座大厦的不同位置测量温度时,如果将大厦中所有不同位置的温度累加是没有意义的,但是求平均值是有意义的。
一般来说,一个事实数据表都要和一个或多个纬度表相关联,用户在利用事实数据表创建多维数据集时,可以使用一个或多个维度表。
再举个实际的例子。银行对存款记账,A表中存放实际数据,包括账号、所属机构号、存款金额等,B表存放机构号和机构名称的对应关系。则A是事实表,B是维表。
维度表可以看作是用户来分析数据的窗口,纬度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。例如,包含产品信息的维度表通常包含将产品分为食品、饮料、非消费品等若干类的层次结构,这些产品中的每一类进一步多次细分,直到各产品达到最低级别。
在维度表中,每个表都包含独立于其他维度表的事实特性,例如,客户维度表包含有关客户的数据。维度表中的列字段可以将信息分为不同层次的结构级。
简单的说:
1、事实表就是你要关注的内容;
2、维表就是你观察该事务的角度,是从哪个角度去观察这个内容的。
例如,某地区商品的销量,是从地区这个角度观察商品销量的。事实表就是销量表,维表就是地区表

 

hadoop spark 大数据相关资源

小象《Hadoop 2.X大数据平台V3》
链接:http://pan.baidu.com/s/1nvS7GFJ 密码:tqng
《Spark 1.X 大数据平台V2》11月份班
链接:http://pan.baidu.com/s/1sl6KOGX 密码:qlea
深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存
链接:http://pan.baidu.com/s/1gfsmj3X 密码:50y2
资源整理中…….
欢迎大家补充!

CMU博士Tom Murphy的人工智能超级马里奥

跑了一下CMU博士Tom Murphy的人工智能程序来玩任天堂的超级马里奥,虽然是2013年就出来了,但是还是很激动呀。
这是他本人的博客:http://radar.spacebar.org/
资源都在这个网上有:http://www.cs.cmu.edu/~tom7/mario/
在文章的最下边是论文链接、源程序和编译好的可执行文件。
论文链接:http://www.cs.cmu.edu/~tom7/mario/mario.pdf
源程序:http://sourceforge.net/p/tom7misc/svn/HEAD/tree/trunk/tasbot/
可执行程序:http://www.cs.cmu.edu/~tom7/mario/playfun.7z
解压playfun.7z压缩包,会看到这些程序

playfun7z

playfun7z


打开readme文档,看作者的步骤提示:
1、运行平台是win7 64位系统
2、FCEUX是必须的,录制视频和回放人工智能玩的游戏都是靠这个来播放的。下载链接:http://www.fceux.com/web/download.html FCEUX 2.2.3 win32 Binary
下载超级马里奥的nes文件,用FCEUX完超级马里奥的游戏,并且录制视频
3、创建一个config.txt文件,文件内容包括下边三行文件:

game mario
movie me-playing-mario.fm2
moviename me-playing-mario.fm2

PS:readme文件是这么写的: Modify config.txt to contain e.g. 英文不好,理解为修改一个config.txt文件了,找了半天没找到,哎。其实是自己创建,后来在radar.spacebar.org/f/a/weblog/comment/1/1097 看到别人的评论里详细解释了这个步骤才得以解决。
4、记得在当前目录下有一个叫“mario.nes”的文件,还有录制好的视频命名为“me-playing-mario.fm2”,如下图:

nes

nes


5、点击ansicon.exe 在命令行里运行learnfun.exe 这个应该很快就运行完了
6.运行
playfun.exe –helper 8000
playfun.exe –helper 8001
….
playfun.exe –helper 8005
PS:根据机器配置选择合适的运行个数,否则机器会卡死。还有这个需要的时间特别长,据作者说几分钟的的视频需要运行好多天。我只启动了两个进程。
6、当所有的helper都输出ready,就可以跑主程序了 playfun.exe –master 8000 8001
7.最后会输出mario-playfun-backtrack-269-replacement.fm2文件,再用FCEUX就可以看到了。
mario

mario


这是用程序自己玩马里奥的视频,大概耗时24小时:

Presto的作用

Presto不是什么
虽然Presto一直被一些个人或者团体称为 数据库 ,但是Presto并不是数据库。
千万不要以为Presto可以解析SQL,那么Presto就是一个标准的数据库。Presto并不是传统意义上的数据库。Presto并不是MySQL、PostgreSQL或者Oracle的代替品。Presto并不能用来处理在线事务。其实很多其他的数据库产品也是被用来设计为数据仓库或者数据分析工具,但是也不能处理在线事务。
Presto是什么
Presto通过使用分布式查询,可以快速高效的完成海量数据的查询。如果你需要处理TB或者PB级别的数据,那么你可能更希望借助于Hadoop和HDFS来完成这些数据的处理。作为Hive和Pig(Hive和Pig都是通过MapReduce的管道流来完成HDFS数据的查询)的替代者,Presto不仅可以访问HDFS,也可以操作不同的数据源,包括:RDBMS和其他的数据源(例如:Cassandra)。
Presto被设计为数据仓库和数据分析产品:数据分析、大规模数据聚集和生成报表。这些工作经常通常被认为是线上分析处理操作。
谁使用Presto?
Presto是FaceBook开源的一个开源项目。Presto在FaceBook诞生,并且由FaceBook内部工程师和开源社区的工程师公共维护和改进。
既然Presto是一个交互式的查询引擎,我们最关心的就是Presto实现低延时查询的原理,我认为主要是下面几个关键点,当然还有一些传统的SQL优化原理,这里不介绍了。
完全基于内存的并行计算
流水线
本地化计算
动态编译执行计划
小心使用内存和数据结构
类BlinkDB的近似查询
GC控制

elasticsearch在window下的安装和java查询

下载elasticsearch的zip包,elasticsearch的版本是2.2.1
ps:elasticsearch的api随版本更新的速度快,这里边需要查看对应版本的api文档
解压后安装,elasticsearch的访问地址:
http://localhost:9200/

{
  "name" : "Venus",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.2.1",
    "build_hash" : "d045fc29d1932bce18b2e65ab8b297fbf6cd41a1",
    "build_timestamp" : "2016-03-09T09:38:54Z",
    "build_snapshot" : false,
    "lucene_version" : "5.4.1"
  },
  "tagline" : "You Know, for Search"
}

安装插件:
elasticsearch插件elasticsearch-head安装:
elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,你可以通过插件把它集成到es。
在cmd进入elasticsearch安装的bin目录,执行下边的命令:

plugin install mobz/elasticsearch-head

网上查的命令是:

plugin -install mobz/elasticsearch-head

注意比较不同
安装完命令可以打开url:http://localhost:9200/_plugin/head/ 查看效果

elasticsearch-head

elasticsearch-head


bigdesk这个插件就不要安装了,github上的代码都是几年前的了
pojo类:

package com.rong360.elasticsearch;
public class User {
	private long id;
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

elasticsearch建立索引:

package com.rong360.elasticsearch;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
public class ElasticSearchClient {
	private static Client client;
	public void init() {
		try {
			client = TransportClient.builder().build()
					.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
	public void close() {
		client.close();
	}
	public void createIndex() {
		for (int i = 0; i < 1000; i++) {
			User user = new User();
			user.setId(new Long(i));
			user.setName("huang fox " + i);
			user.setAge(i % 100);
			client.prepareIndex("users", "user").setSource(generateJson(user)).execute().actionGet();
		}
	}
	private String generateJson(User user) {
		String json = "";
		try {
			XContentBuilder contentBuilder = XContentFactory.jsonBuilder().startObject();
			contentBuilder.field("id", user.getId() + "");
			contentBuilder.field("name", user.getName());
			contentBuilder.field("age", user.getAge() + "");
			json = contentBuilder.endObject().string();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return json;
	}
	public static void search() {
		SearchResponse response = client.prepareSearch("users").setTypes("user")
				.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
				.setQuery(QueryBuilders.termQuery("name", "fox")) // Query
				.setPostFilter(QueryBuilders.rangeQuery("age").from(22).to(26))// Filter
				.setFrom(0).setSize(60).setExplain(true).execute().actionGet();
		SearchHits hits = response.getHits();
		System.out.println(hits.getTotalHits());
		for (int i = 0; i < hits.getHits().length; i++) {
			System.out.println(hits.getHits()[i].getSourceAsString());
		}
	}
	public static void main(String[] args) {
		long a = System.currentTimeMillis();
		ElasticSearchClient elasticSearchClient = new ElasticSearchClient();
		elasticSearchClient.init();
		System.out.println("监测的时间1:"+(System.currentTimeMillis()-a)/1000f+" 秒 ");
		elasticSearchClient.createIndex();	//创建索引
		System.out.println("监测的时间2:"+(System.currentTimeMillis()-a)/1000f+" 秒 ");
		search();	//查询
		System.out.println("监测的时间3:"+(System.currentTimeMillis()-a)/1000f+" 秒 ");
		elasticSearchClient.close();
	}
}
elasticsearch_demo

elasticsearch_demo