以一个10年的持证潜水员身份来回答这个问题。
其实绝大部分吸上了“蓝色鸦片”(对潜水上瘾)的人都是很纯正的海岛控,一有假期,甚至用周末挤出一个几天的小假也要跑到东南亚找个海岛赶紧吸两口缓解一下毒瘾。
这时候你需要一份东南亚潜水地图,绝对实用干货。
常常有人问我去哪里考证,去哪里潜水。其实潜点介绍的资料网上很多,但没有最好的潜点,只有最适合的潜点,而每个人的需求都不一样——有人爱热闹,有人爱清静,有人爱吃海鲜,有人除了潜水还要玩玩别的,有人除了潜水什么都不关心,有人精打细算紧捂钱包,有人就要吃好住好,有人信心不足,希望有一对一教学和导潜……
你去或不去,鱼就在哪里,你需要考虑的是时间和交通成本、旅行预算、潜水经验、语言条件、当地治安等,以及自己对一次旅行的期待。这些,比知道某个潜点“好不好”更重要。
本文对比了泰国、马来西亚、菲律宾、印尼四个东南亚国家主要潜点的优劣,简单概括:要省钱,去淘岛;要适中,去马来西亚和菲律宾;要顶级体验,去印尼。当然,这只是我的个人观点。
跟许多人一样,我跨出国门的第一站是东南亚。这片地区距离我们最近,旅行便利,航班密集,物价低廉,值得一去再去。后来,我的脚步从东南亚延伸到印度、中东、欧洲、非洲、加勒比海,也迷上了潜水这个“蓝色鸦片”。
暮然回首才发现,其实不需远渡重洋,家门口东南亚就坐拥多个全球一流潜点。这里大部分潜点终年水温在28度以上,让夏天也只能在冰冷海水中颤抖的欧洲人羡慕不已,不惜万里飞来。占尽地利的我们又岂能暴殄天物?
从珊瑚礁到百年沉船,从袖珍豆丁海马到巨型锤头鲨,从入门级考证到挑战级技术潜水,从一两天的消遣到十天八天的船宿……去哪里潜水?这不是个问题。去多少次才够?这才是最难回答的问题。
有些人总觉得,东南亚很LOW,咱有钱任性,就要去更高大上的地方,大溪地,夏威夷,斐济,毛里求斯,塞班,巴哈马……如果你追求奢华度假feel,尽管去。然而,如果你最在乎的是潜水,我可以告诉你,海底世界的含金量跟陆地度假村的标价并不成正比。
潜点的硬指标之一是物种多样性,通俗说就是能看到很丰富的海洋生物,生物品种多,每一种生物的类别多,其中以珊瑚和鱼类品种为代表。珊瑚需要在温暖健康的水域成长,鱼类生存需要食物,洋流带来浮游物,养活食物链低端的生物,也带来鲨鱼这样的顶级猎食者。
菲律宾、马来西亚、印尼、巴布亚新几内亚、东帝汶和所罗门群岛之间的海域被称为“珊瑚大三角”,是全球海洋物种多样性的中心,也叫“海里的亚马逊”,面积达570万平方公里(可怜大堡礁被排挤在外)。
本图来自维基
而有另外一些潜点,物种多样性不如东南亚,珊瑚稀稀落落,一片海底沙漠,却有很突出的亮点,比如说洞穴、沉船、大翅鲸、锤头鲨、沙丁鱼……随着你“蓝色鸦片”的毒瘾越来越深,你可能会转向这些潜点,万里奔波,转N趟国际航班,只为了看某一种鱼,还不一定能看到。这种瘾,谁染上了谁懂。
淘岛 潜水工厂
在东南亚,如果你问十个潜水员在哪里考的潜水证,也许有五个会回答:淘岛(Koh Tao)。没有人能说清淘岛上有多少家潜水学校、一年培养出多少名潜水员,只能给她一个响亮的外号——“潜水工厂”。
“潜水工厂”的流水线从曼谷就开始运作了。在著名的背包客大本营考山路上,走进一家潜店办公室,花5分钟时间,你就能预订到含曼谷到淘岛车船联票、淘岛度假村住宿及潜水课程的套餐。接下来的几天,除了吃饭、睡觉和潜水,什么都不用你操心了。
虽然紧挨着游人如织的苏梅岛(Koh Samui)和以满月派对著称的帕岸岛(Koh Pha Ngan),淘岛却往往被非潜水者忽略。这里有丝毫不逊色于苏梅和帕岸的悠长细白沙滩,沙滩上游人寥寥,人们不在泳池里学习潜水技巧,就在去往潜点的船上,或者已经在海里潜游。
2008年我在淘岛上OW平静水域课
从淘岛走出的潜水员很快会发现,淘岛的海底实在说不上惊艳,珊瑚礁并不壮观,鱼类也不算丰富。淘岛最大的优势是便宜。就拿OW(Open Water Diver,开放水域潜水员)课程来说,4天的套餐仅人民币2000元左右(有些潜店还提供免费住宿),比三亚便宜近半,也比东南亚其它地方便宜得多。更何况,不少课程都安排在泳池进行,海里美不美又有什么关系呢?在淘岛考证,在别处休闲潜水(Fun Dive),是最经济的选择。“毕业”之后,到苏梅开摩托车环岛游,到帕岸参加疯狂的海滩电音派对,就是一个完美假日。
当然,基于淘岛的流水线性质,教练一对多教学,能保证的是合格、规范,但未必能教给你规定动作以外的东西,比如说他从多年实践中总结出的潜水经验和潜水观念。如果你有更充裕的预算,在其他人少的潜店跟有10年以上教龄的教练进行一对一教学,收获将是无价的。
难度:★
优点:几乎是全世界考证最便宜的地方
缺点:海洋环境不佳,学员较多,教学不够细致
提醒:请谨慎选择潜店,确保教练和学生比例不超过1:4
交通:直飞曼谷后转车船联运,或飞素叻他尼(Surat Thani)或苏梅后乘船前往
华语潜店或教练:有
斯米兰群岛
斯米兰群岛(Similan)距离著名的普吉岛(Phuket)仅95公里,但往往只会被潜水员列入行程。这里有世界上最大的动物鲸鲨,以及双翅展开达7米的魔鬼鱼,属于世界级的潜点。只是斯米兰潜水多为船宿(吃住在船上的多天潜水),适合有50潜以上经验的潜水员,新手不宜前往,个人也不建议去斯米兰考OW。(斯米兰每年5-10月封岛,具体日期可咨询船宿公司)
至于普吉、皮皮(Phi Phi)、甲米(Krabi)等几个安达曼海的小岛都适合潜水,虽然海底环境比诗巴丹、巴厘岛、斯米兰都要逊色,但综合海岛风景、旅行便利等因素考虑,也不失为理想的潜水度假目的地。
诗巴丹 上帝的水族箱
对于地球上过份美丽的地方,人们喜欢用“上帝的XXX”来赞美,比如说“上帝的自留地”、“上帝的后花园”。至于“上帝的水族箱”,这个美誉属于马来西亚沙巴洲的小岛诗巴丹(Sipadan)。
诗巴丹是从海底“长”出的竹笋状海岛,游出仅5米左右的浅滩,海水陡然从浅蓝变深蓝,600米深的峭壁和遮天蔽日的鱼群出现在眼前,从海龟到海狼、隆头莺哥、白鳍鲨都是寻常风景。在海狼风暴点(Barracuda point),成千上万条海狼聚成飓风眼状迅速移动,蔚为壮观,游着游着,你甚至发现自己进入了“飓风眼”中心!
淘岛的缺点,就是诗巴丹的优点,反之亦然。由于诗巴丹实行限额潜水制度,每日仅发放120张潜水许可证,这里的潜水价格也比东南亚各地高不少。你需要至少提前一个月向当地潜店预订。不仅如此,岛上不允许居住,部分潜店实行捆绑销售,你必须在周边小岛潜3天以上,才能获得1次进入诗巴丹的机会,想要去两次,就得潜6天。另外,由于海水深达600米,常有洋流,不适合新手前往。
作为前往诗巴丹的落脚点,小镇仙本那(Semporna)已发展成马来西亚的淘岛,价格比淘岛贵,还没有悠长白沙滩,但依然深受中国考证潜水员的欢迎,也同样有学员多、教学质量参差的隐患。仙本那附近小岛马布(Mabul)则以微距潜水为主。
难度:★★★
优点:海洋环境佳,鱼类丰富,大型鱼群尤其多
缺点:潜水限制较多,一度发生绑架事件
提醒:须提前至少一个月预订
交通:从广州或香港直飞沙巴洲首府亚庇(Kota Kinabalu)后转车前往,或从吉隆坡转机至斗湖(Tawau)
华语潜店或教练:有
西马
马来西亚西海岸的小岛兰卡威(Langkawi)、刁曼岛(Tioman)、热浪岛(Redang)、停泊岛(Perhentian Kecil)与普吉周边海岛类似,属于海滩景致优美、海底风光尚可的一类,适合休闲度假,不适合以潜水为旅行唯一目的的发烧级潜水员。比起诗巴丹,这几个海岛距离吉隆坡较近,可以通过车船联运到达。
就旅行度假而言,我喜欢泰国胜于菲律宾,前者更干净有序,除了海岛观光,文化、美食、购物也精彩纷呈。但自从迷上潜水,我护照上的菲律宾签证数量已经迅速超过了泰国。作为拥有超过7000个海岛的群岛国家,菲律宾的世界级潜点数目远远多于泰国和马来西亚,想要从容地把这些潜点都潜个遍,至少得一两个月!
妈妈拍丝瓜附近离岛的狭长沙滩,宛如世界尽头
宿雾 “跳岛”潜水
位于米沙鄢群岛中心位置的宿雾省(Cebu)是菲律宾潜点最密集的区域,167个小岛中有不少一流潜点。在这里,你可以来一次“跳岛”潜水,花上几个星期,挨个拜访这些潜点,拜访海里的美丽生物。
与宿雾岛隔宿雾海峡相望的薄荷岛(Bohol)是菲律宾仅次于长滩(Boracay)的热门海滨度假地,除了巧克力山风光和世界上最小的猴子眼睛猴,薄荷周边的潜点也值得流连。
Alona Beach被菲律宾官方誉为“下一个长滩”,以此美丽海滩为据点,你可以前往邦劳(Panglao)、卡毕佬(Cabilao)、巴里卡萨(Balicasag)乃至杜马盖地(Dumaguete)的阿波(Apo)。巴里卡萨的“黑森林”(Black Forest)因大片黑色珊瑚而得名,“天堂”(Heaven)则拥有许多像大教堂一样的景致,在别处并不常见。
宿雾岛东北面的马拉帕斯加(Malapascua)被潜水员们取其谐音,亲昵地称为“妈妈拍丝瓜”。这里的海底景致不逊于巴里卡萨,尤以尾巴占体长达1/3的长尾鲨(Thresher Sharks)著称。比起薄荷,“妈妈拍丝瓜”要宁静得多,适合只想安心过个吃饭、睡觉、潜水简单假期的人们。
宿雾岛西南的墨宝(Moalboal)曾以遮天蔽日的沙丁鱼风暴著称,2011年地震后,大队沙丁鱼搬家,好在这两年又回来了。
难度:★★
优点:潜点密集,行程丰富,海底景致佳
缺点:游客较多,对海洋的保护意识逊于诗巴丹
提醒:行程不宜安排得太紧张,在多个潜点间奔波不如精选一两个地方潜个够
交通:可从香港直飞宿雾市,或经马尼拉转机至宿雾、薄荷岛上机场塔比拉兰(Tagbilaran)或杜马盖地
华语潜店或教练:有
妈妈岛“特产”长尾鲨
科隆 沉船博物馆
科隆?德国那个科隆么?非也。说起这个小镇的所在地巴拉望省(Palawan),有些人会猛然醒悟——哦!爱昵岛(El Nido)就在那里!是的,巴拉望群岛被菲律宾旅游局誉为“菲律宾最后的秘境”,更为游人熟知的地点是爱昵岛和首府所在地公主港(Puerto Princesa),科隆(Coron)尚藏在深闺,安静等待着潜水员前来探索水下的十余条沉船。
1944年9月24日,停泊在科隆湾的日本舰队遭遇美国空军偷袭,至少9艘军舰和商船,此外还有几艘不同时间沉没的商船和渔船。由于此地沉船大多位于水深10米-40米处,终年海水温暖、洋流微弱,大部分沉船保持着较完整的外形结构,内部坍塌也不多,使得科隆成为世界知名的沉船潜水胜地。
其中,唯一一艘战舰秋津洲号(Akisushima)长118米,拥有巨型起重机、电报发射塔和炮台,令人叹为观止。而运油船Okikawa Maru长达160米,为科隆沉船之首。
早在上世纪90年代,科隆就已出现潜水店。如今的科隆俨然一个沉船主题小镇,潜水店数目不亚于饭店和旅馆,街上处处可见沉船模型和沉船手绘画。是的,沉船是这里最大的话题,不感兴趣或有幽闭恐惧症的人弃之如履,热爱历史和挑战自我的人则爱之若狂。较之同样拥有多艘沉船的苏比克湾(Subic),科隆湾的海水能见度更高,而苏比克有不少沉船深度超过40米的休闲潜水极限,更适合技术潜水员前往。
难度:★★★
优点:沉船数量多,深度浅,适合休闲潜水
缺点:镇上基础设施较差,没有海滩和豪华度假村,经常停电
提醒:岛上ATM有时会罢工,记得带足现金
交通:距离科隆最近的机场在布桑加岛(Busuanga)上,可从马尼拉或宿雾转机前往,从爱昵岛前往则须坐长达8小时的螃蟹船
华语潜店或教练:有
其它潜点
除了宿雾周边和科隆,菲律宾值得体验的潜点还有很多。海豚湾(即波塞罗拉,Puerto Galera,简称PG)较为中国潜水员熟悉,阿尼洛(Anilao)以小生物著称,图巴塔哈国家公园(Tubbataha)多大型动物,适合船宿。
相比泰国、马来西亚和菲律宾,“千岛之国”印尼距离我们较远,除巴厘岛以外的潜点都需要转机前往,飞行成本提高了,当地潜水住宿价格也比前面几个国家高出不少。但一旦你去到当地,你会发现,所有的舟车劳顿和金钱付出都是值得的!淘岛适合作为潜水的起点,而印尼则非初学者乐园,大多数潜点有强流或适合船宿,建议至少累计了30-50潜经验再前往。
巴厘岛 追寻翻车鱼
自从巴厘岛进入国人视野以来,人们往往把她与“蜜月旅行”联系在一起,而忽略了她原来也是个潜水胜地。
巴厘岛的潜点相当多,也各具亮点。图兰本(Tulamben)有著名的二战美国货轮自由号(Liberity),深达65米的峭壁上各种珊瑚令人眼花撩乱。秘密海湾(Secret Bay)顾名思义,人迹罕至,在沙地寻找袖珍动物的体验能与蓝碧媲美。
但奴撒帕尼达(Nusa Pedida)才是巴厘岛的王牌潜点,这里聚集了翻车鱼(Mola Mola)、魔鬼鱼(Manta)、白鳍鲨(White Tip Shark)、鹰鳐(Eagle Ray)等诸多大型海洋生物,而且洋流强、海浪大,潜水体验非常刺激。
翻车鱼是已知体型最大的硬骨鱼,翼展近3米,体重能达到3000镑。它的繁殖和洄游至今仍是个迷,巴厘岛是亚洲少数能固定见到其踪迹的地方,有许多潜水员专奔着它而来。翻车鱼在当地冬季也就是8-10月才出来活动,届时水温只有20度左右,相当寒冷。但你若能幸运看到翻车鱼浮出水面做日光浴,并让天使鱼、清洁虾等“清洁工”为它清洁皮肤上的寄生虫和牙缝里的残屑,那将是毕生难忘的经历。魔鬼鱼的出现没有特别的季节性,但它喜欢冷水,所以看翻车鱼的季节也有很大机率能看到魔鬼鱼。
潜水之余,可以享受巴厘岛海滩和稻田风光,体会独特的印度教文化,欣赏创意手工艺品。就旅行体验的丰富多样而言,巴厘岛远胜于普吉、苏梅、薄荷等东南亚热门度假地。
难度:★★★★
优点:潜点丰富且各具特色,潜水与旅行度假两全其美
缺点:奴撒帕尼达洋流强,冬季水温低,潜水员多
交通:从香港直飞,或经吉隆坡、雅加达转机前往
华语潜店或教练:有
蓝碧 微距天堂
与巴厘岛相反,北苏拉维西省省会美娜多(Manado,又名万鸦老)的名字对大部分人来说是陌生的。其实,这里早在16世纪就成为荷兰的第一个海外殖民地,欧洲风情浓郁,岛上丰富的丁香与豆蔻等香料更带给它“香料之岛”的美誉。
北苏拉维西位于亚洲与大洋洲的交汇点,海洋生态多样,拥有三大海洋国家公园自然生态保护区:布纳肯(Bunaken)、曼卡(Bangka)和蓝碧(Lembeh)。其中蓝碧是美娜多的明星潜点,在这里潜水就像是在垃圾里寻宝,英文叫做Muck Diving。
不像其它著名潜点一样有绚烂的珊瑚礁、令人目瞪口呆的大鱼、遮天蔽日的鱼群,蓝碧的海底平平无奇,甚至还有些许垃圾。但就在这令人失望的外表下,藏着许多容易被忽略的小生物,你需要一个有火眼金睛、对此地了如指掌的潜导,才能在泥沙里找到宝贝,微距摄影发烧友把这里视为天堂。
宝贝有啥?最讨人喜欢的是豆丁海马(Pygmy Seahorse),这种小生灵身长仅1厘米左右,还善于伪装,隐秘栖身在海扇珊瑚里,在别的地方也许难得一见,这里却命中率很高。
蓝碧海峡位于北苏拉威西和蓝碧岛之间,来自苏拉威西的火山灰沉淀下来,为海底生物提供了丰富的营养,蓝碧岛又阻挡了风浪,在这里潜水无需像在巴厘岛一样惊心动魄。但中性浮力控制不好的潜水员容易踢起海底淤泥、阻碍视线。而布纳肯拥有高300米、长2公里的海底断崖彩色珊瑚墙,能见度达30-40米,也是个不容错过的潜点。
蓝碧与巴厘岛,也恰是优劣互补的一对。前往美娜多须转机,交通成本高,但洋流弱、水温高,而且游客和潜水员都比巴厘岛少得多,没有拥挤排队之苦。选巴厘岛还是美娜多,颇需要一番纠结,当然最美好的方案是——两个都去!
难度:★★
优点:人少清净,风平浪静,还能顺便潜布纳肯
缺点:交通成本高,中转费时
交通:国内没有直飞航班,须经新加坡或雅加达转机,广州出发的往返机票价格约3000元,旺季有航空公司提供广州包机直航,但往返时间短不够潜
华语潜店或教练:暂无
其它潜点
印尼的世界一流潜点还有达拉湾(Derawan)、科莫多(Komodo)、安汶(Ambon)和四王群岛(Raja Ampat)等,均游客罕至,须转机前往,是资深潜水员珍爱的目的地。
四王岛魔鬼鱼
本文图片:Cobis, Luo Yi, Evolution, Rocksteady, Stefan Soh
如果想了解更多关于潜水入门和安全的干货,欢迎参加我的live:
潜入深蓝:如何安全地享受大海的美?(已超1000人报名)
潜入深蓝:如何安全地享受大海的美?分享我在世界各地200多次潜水的难忘经历:
潜水员眼里的大海到底有多美?(已超1000人报名)
潜水员眼里的大海到底有多美?骆仪,Lonely Planet作者,潜水员,跟你分享超过10年的背包旅行故事:从珠峰到深海,从撒哈拉沙漠到巴以隔离墙,从零下35度雪国到40度火炉……
欢迎关注我的微信公众号「 骆仪 」(luoyi_gz)
原创文字及图片版权所有,仅限知乎及知乎官方渠道发布,未经授权,任何组织或个人不得转载或节选摘录;欢迎转发分享
之前看了Mahout官方示例 20news 的调用实现;于是想根据示例的流程实现其他例子。网上看到了一个关于天气适不适合打羽毛球的例子。
训练数据:
Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No
检测数据:
sunny,hot,high,weak
结果:
Yes=》 0.007039
No=》 0.027418
于是使用Java代码调用Mahout的工具类实现分类。
基本思想:
1. 构造分类数据。
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
接下来贴下我的代码实现=》
1. 构造分类数据:
在hdfs主要创建一个文件夹路径 /zhoujainfeng/playtennis/input 并将分类文件夹 no 和 yes 的数据传到hdfs上面。
数据文件格式,如D1文件内容: Sunny Hot High Weak
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
这三步,代码我就一次全贴出来;主要是两个类 PlayTennis1 和 BayesCheckData = =》
package myTesting.bayes;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.ToolRunner;
import org.apache.mahout.classifier.naivebayes.training.TrainNaiveBayesJob;
import org.apache.mahout.text.SequenceFilesFromDirectory;
import org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles;
public class PlayTennis1 {
private static final String WORK_DIR = "hdfs://192.168.9.72:9000/zhoujianfeng/playtennis";
/*
* 测试代码
*/
public static void main(String[] args) {
//将训练数据转换成 vector数据
makeTrainVector();
//产生训练模型
makeModel(false);
//测试检测数据
BayesCheckData.printResult();
}
public static void makeCheckVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"testinput";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeTrainVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"input";
String output = WORK_DIR+Path.SEPARATOR+"tennis-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeModel(boolean completelyNB){
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-vectors"+Path.SEPARATOR+"tfidf-vectors";
String model = WORK_DIR+Path.SEPARATOR+"model";
String labelindex = WORK_DIR+Path.SEPARATOR+"labelindex";
Path in = new Path(input);
Path out = new Path(model);
Path label = new Path(labelindex);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
if(fs.exists(label)){
//boolean参数是,是否递归删除的意思
fs.delete(label, true);
}
TrainNaiveBayesJob tnbj = new TrainNaiveBayesJob();
String[] params =null;
if(completelyNB){
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow","-c"};
}else{
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow"};
}
ToolRunner.run(tnbj, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("生成训练模型失败!");
System.exit(3);
}
}
}
package myTesting.bayes;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.mahout.classifier.naivebayes.BayesUtils;
import org.apache.mahout.classifier.naivebayes.NaiveBayesModel;
import org.apache.mahout.classifier.naivebayes.StandardNaiveBayesClassifier;
import org.apache.mahout.common.Pair;
import org.apache.mahout.common.iterator.sequencefile.PathType;
import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirIterable;
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.Vector.Element;
import org.apache.mahout.vectorizer.TFIDF;
import com.google.common.collect.ConcurrentHashMultiset;
import com.google.common.collect.Multiset;
public class BayesCheckData {
private static StandardNaiveBayesClassifier classifier;
private static Map<String, Integer> dictionary;
private static Map<Integer, Long> documentFrequency;
private static Map<Integer, String> labelIndex;
public void init(Configuration conf){
try {
String modelPath = "/zhoujianfeng/playtennis/model";
String dictionaryPath = "/zhoujianfeng/playtennis/tennis-vectors/dictionary.file-0";
String documentFrequencyPath = "/zhoujianfeng/playtennis/tennis-vectors/df-count";
String labelIndexPath = "/zhoujianfeng/playtennis/labelindex";
dictionary = readDictionnary(conf, new Path(dictionaryPath));
documentFrequency = readDocumentFrequency(conf, new Path(documentFrequencyPath));
labelIndex = BayesUtils.readLabelIndex(conf, new Path(labelIndexPath));
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), conf);
classifier = new StandardNaiveBayesClassifier(model);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("检测数据构造成vectors初始化时报错。。。。");
System.exit(4);
}
}
/**
* 加载字典文件,Key: TermValue; Value:TermID
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<String, Integer> readDictionnary(Configuration conf, Path dictionnaryDir) {
Map<String, Integer> dictionnary = new HashMap<String, Integer>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
String name = path.getName();
return name.startsWith("dictionary.file");
}
};
for (Pair<Text, IntWritable> pair : new SequenceFileDirIterable<Text, IntWritable>(dictionnaryDir, PathType.LIST, filter, conf)) {
dictionnary.put(pair.getFirst().toString(), pair.getSecond().get());
}
return dictionnary;
}
/**
* 加载df-count目录下TermDoc频率文件,Key: TermID; Value:DocFreq
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<Integer, Long> readDocumentFrequency(Configuration conf, Path documentFrequencyDir) {
Map<Integer, Long> documentFrequency = new HashMap<Integer, Long>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
return path.getName().startsWith("part-r");
}
};
for (Pair<IntWritable, LongWritable> pair : new SequenceFileDirIterable<IntWritable, LongWritable>(documentFrequencyDir, PathType.LIST, filter, conf)) {
documentFrequency.put(pair.getFirst().get(), pair.getSecond().get());
}
return documentFrequency;
}
public static String getCheckResult(){
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String classify = "NaN";
BayesCheckData cdv = new BayesCheckData();
cdv.init(conf);
System.out.println("init done...............");
Vector vector = new RandomAccessSparseVector(10000);
TFIDF tfidf = new TFIDF();
//sunny,hot,high,weak
Multiset<String> words = ConcurrentHashMultiset.create();
words.add("sunny",1);
words.add("hot",1);
words.add("high",1);
words.add("weak",1);
int documentCount = documentFrequency.get(-1).intValue(); // key=-1时表示总文档数
for (Multiset.Entry<String> entry : words.entrySet()) {
String word = entry.getElement();
int count = entry.getCount();
Integer wordId = dictionary.get(word); // 需要从dictionary.file-0文件(tf-vector)下得到wordID,
if (StringUtils.isEmpty(wordId.toString())){
continue;
}
if (documentFrequency.get(wordId) == null){
continue;
}
Long freq = documentFrequency.get(wordId);
double tfIdfValue = tfidf.calculate(count, freq.intValue(), 1, documentCount);
vector.setQuick(wordId, tfIdfValue);
}
// 利用贝叶斯算法开始分类,并提取得分最好的分类label
Vector resultVector = classifier.classifyFull(vector);
double bestScore = -Double.MAX_VALUE;
int bestCategoryId = -1;
for(Element element: resultVector.all()) {
int categoryId = element.index();
double score = element.get();
System.out.println("categoryId:"+categoryId+" score:"+score);
if (score > bestScore) {
bestScore = score;
bestCategoryId = categoryId;
}
}
classify = labelIndex.get(bestCategoryId)+"(categoryId="+bestCategoryId+")";
return classify;
}
public static void printResult(){
System.out.println("检测所属类别是:"+getCheckResult());
}
}
1. 请介绍一下WebGIS的概念和作用,以及在实际应用中的优势和挑战。
WebGIS是一种基于Web技术的地理信息系统,通过将地理数据和功能以可视化的方式呈现在Web浏览器中,实现地理空间数据的共享和分析。它可以用于地图浏览、空间查询、地理分析等多种应用场景。WebGIS的优势包括易于访问、跨平台、实时更新、可定制性强等,但也面临着数据安全性、性能优化、用户体验等挑战。
2. 请谈谈您在WebGIS开发方面的经验和技能。
我在WebGIS开发方面有丰富的经验和技能。我熟悉常用的WebGIS开发框架和工具,如ArcGIS API for JavaScript、Leaflet、OpenLayers等。我能够使用HTML、CSS和JavaScript等前端技术进行地图展示和交互设计,并能够使用后端技术如Python、Java等进行地理数据处理和分析。我还具备数据库管理和地理空间数据建模的能力,能够设计和优化WebGIS系统的架构。
3. 请描述一下您在以往项目中使用WebGIS解决的具体问题和取得的成果。
在以往的项目中,我使用WebGIS解决了许多具体问题并取得了显著的成果。例如,在一次城市规划项目中,我开发了一个基于WebGIS的交通流量分析系统,帮助规划师们评估不同交通方案的效果。另外,在一次环境监测项目中,我使用WebGIS技术实现了实时的空气质量监测和预警系统,提供了准确的空气质量数据和可视化的分析结果,帮助政府和公众做出相应的决策。
4. 请谈谈您对WebGIS未来发展的看法和期望。
我认为WebGIS在未来会继续发展壮大。随着云计算、大数据和人工智能等技术的不断进步,WebGIS将能够处理更大规模的地理数据、提供更丰富的地理分析功能,并与其他领域的技术进行深度融合。我期望未来的WebGIS能够更加智能化、个性化,为用户提供更好的地理信息服务,助力各行各业的决策和发展。
这块您需要了解下stm32等单片机的基本编程和简单的硬件设计,最好能够了解模电和数电相关的知识更好,还有能够会做操作系统,简单的有ucos,freeRTOS等等。最好能够使用PCB画图软件以及keil4等软件。希望对您能够有用。
1.负责区域大客户/行业客户管理系统销售拓展工作,并完成销售流程;
2.维护关键客户关系,与客户决策者保持良好的沟通;
3.管理并带领团队完成完成年度销售任务。
你好,面试题类型有很多,以下是一些常见的类型:
1. 技术面试题:考察候选人技术能力和经验。
2. 行为面试题:考察候选人在过去的工作或生活中的行为表现,以预测其未来的表现。
3. 情境面试题:考察候选人在未知情境下的决策能力和解决问题的能力。
4. 案例面试题:考察候选人解决实际问题的能力,模拟真实工作场景。
5. 逻辑推理题:考察候选人的逻辑思维能力和分析能力。
6. 开放性面试题:考察候选人的个性、价值观以及沟通能力。
7. 挑战性面试题:考察候选人的应变能力和创造力,通常是一些非常具有挑战性的问题。
需要具体分析 因为cocoscreator是一款游戏引擎,面试时的问题会涉及到不同的方面,如开发经验、游戏设计、图形学等等,具体要求也会因公司或岗位而异,所以需要根据实际情况进行具体分析。 如果是针对开发经验的问题,可能会考察候选人是否熟悉cocoscreator常用API,是否能够独立开发小型游戏等等;如果是针对游戏设计的问题,则需要考察候选人对游戏玩法、关卡设计等等方面的理解和能力。因此,需要具体分析才能得出准确的回答。
以下是一些可能出现在MyCat面试中的问题:
1. 什么是MyCat?MyCat是一个开源的分布式数据库中间件,它可以将多个MySQL数据库组合成一个逻辑上的数据库集群,提供高可用性、高性能、易扩展等特性。
2. MyCat的优势是什么?MyCat具有以下优势:支持读写分离、支持分库分表、支持自动切换故障节点、支持SQL解析和路由、支持数据分片等。
3. MyCat的架构是怎样的?MyCat的架构包括三个层次:客户端层、中间件层和数据存储层。客户端层负责接收和处理客户端请求,中间件层负责SQL解析和路由,数据存储层负责实际的数据存储和查询。
4. MyCat支持哪些数据库?MyCat目前支持MySQL和MariaDB数据库。
5. MyCat如何实现读写分离?MyCat通过将读请求和写请求分别路由到不同的MySQL节点上实现读写分离。读请求可以路由到多个只读节点上,从而提高查询性能。
6. MyCat如何实现分库分表?MyCat通过对SQL进行解析和路由,将数据按照一定规则划分到不同的数据库或表中,从而实现分库分表。
7. MyCat如何保证数据一致性?MyCat通过在多个MySQL节点之间同步数据,保证数据的一致性。同时,MyCat还支持自动切换故障节点,从而保证系统的高可用性。
8. MyCat的部署方式有哪些?MyCat可以部署在单机上,也可以部署在多台服务器上实现分布式部署。
对。根据查询《小小蚁国》游戏攻略得知,海岛蚂蚁是海岛特有的特殊兵种,在海岛地图上有属性加成,不可在其他岛屿进行使用。
需要考虑以下几个方面:
1. 增加历史文化元素。经典海岛通常拥有悠久的历史和文化背景,可以加入相关的历史文化元素,如博物馆、古迹、文化节庆等。
2. 改善基础设施。经典海岛通常有完善的基础设施,如酒店、餐厅、商店等,可以改善海岛的基础设施,提高游客的舒适度和体验感。
3. 提高服务质量。经典海岛的服务质量通常非常高,可以提高海岛的服务质量,如提供更多的旅游咨询服务、导游服务等,以提高游客的满意度。
4. 引入更多的旅游项目。经典海岛通常拥有各种各样的旅游项目,如水上运动、潜水、观光等,可以引入更多的旅游项目,以增加游客的体验和乐趣。
5. 加强环境保护。经典海岛通常拥有优美的自然风景和生态环境,可以加强环境保护工作,保护海岛的自然环境和生态系统,以保持海岛的美丽和独特性。