电子镇流器实物的工作原理和应用领域
电子镇流器是一种通过改变输入电源的电流波形来调节电压和频率的电子设备。它的工作原理基于电磁感应和电子器件的特性,可以有效地控制电路中的电流流动和功率输出。在工业和家庭应用中,电子镇流器被广泛用于调节灯光系统、电动机和电子设备的电源。
电子镇流器的工作原理
电子镇流器通过调整输入电流的频率和幅度来实现电流的稳定输出。它主要由电感、电容、晶体管等电子元件组成。当电流通过电感时,会产生一个磁场,而磁场的变化会引起电感中产生电势。通过控制电容的充放电过程和晶体管的导通时间,电子镇流器可以在输出端口上实现所需的电流和电压。
电子镇流器的应用领域
电子镇流器在照明系统、电动机驱动、电源适配器等领域具有重要的应用价值。下面将重点介绍其在这些领域的应用特点和优势。
照明系统
电子镇流器在照明系统中可以实现灯光的调光和色温调节。通过调整电流和电压,可以控制灯光的亮度和颜色,满足不同场景下的照明需求。此外,电子镇流器还可以提高灯具的光效和寿命,降低能源消耗和维护成本。
电动机驱动
电子镇流器广泛应用于各种电动机驱动系统中,如风扇、空调压缩机、水泵等。通过调节电流和电压,电子镇流器可以实现电动机的转速控制和负载调节,提高系统的效率和性能。同时,电子镇流器还能保护电动机免受过电流和过压等问题的损坏。
电源适配器
电子镇流器是各种电子设备的重要组成部分,特别是电源适配器。它可以将输入电源的电压和频率转换为适合设备工作的电流和电压。通过电子镇流器的调节和稳定,可以保证设备正常运行,并提供所需的电能稳定输出。
电子镇流器实物的重要性和研发趋势
电子镇流器作为电子器件和电力系统的关键组成部分,对于节能减排和电能利用的提高具有重要意义。随着科技的进步和需求的不断增长,电子镇流器的研发也日益受到重视。以下是电子镇流器实物研发的两个趋势:
高效节能
随着环保意识的增强和能源资源的有限性,高效节能是电子镇流器实物研发的重要方向。通过优化电子元件的设计和控制算法,提高电子镇流器的能效和功率因素,以减少能源的浪费和环境污染。
智能控制
智能控制是电子镇流器实物研发的另一个重点。通过集成传感器、通信模块和控制器,电子镇流器可以实现智能调节和远程控制,提高系统的灵活性和可操作性。例如,可以基于光线、温度和用户需求等因素来自动调节灯光和电动机的工作状态。
结语
电子镇流器实物作为电子设备和电力系统中的重要组成部分,其工作原理和应用领域具有广泛的应用前景。随着科技的发展和需求的变化,电子镇流器实物的研发也将不断创新和进步。相信在未来,电子镇流器实物将在节能减排、智能控制和电能利用等方面发挥越来越重要的作用。
在现代数字化的时代,用户界面(UI)设计在各个领域扮演着重要的角色,从网站到移动应用程序,它为用户提供了直观、易用的体验。然而,在虚拟世界中,有一个新兴领域正在崭露头角,那就是实物UI设计。
实物UI设计是一种将虚拟的UI元素与实实在在的物理产品结合起来的设计方法。它通过将数字界面与实际物体相互交织,为用户创造了一种全新的体验。这种设计方法可应用于各种产品,如智能家居设备、可穿戴设备以及交互式展览等。
实物UI设计凭借其独特的特点,有一些独特的原则需要遵循:
为了更好地理解实物UI设计,接下来我们将分析两个成功的案例:
智能家居设备是实物UI设计的一个典型应用领域。通过将虚拟界面与实际的家居设备结合起来,用户可以通过手机、平板电脑等远程操控设备。例如,用户可以使用手机控制家中的灯光、温度、音响等,而无需直接接触实际物体。
在设计智能家居设备的实物UI时,直观性和可控性是关键要素。设计师需要确保用户能够直观地找到并操作虚拟界面上的控制按钮,而这些按钮又能够准确地控制相应的设备。同时,反馈性也很重要,用户需要知道他们的指令是否成功执行。
另一个有趣的实物UI设计案例是可穿戴设备,如智能手表、智能眼镜等。这些设备将虚拟界面带到了用户的手腕上或眼前。用户可以通过滑动、点击等手势操作设备,并获得相应的反馈。
在可穿戴设备的实物UI设计中,直观性和一致性变得尤为重要。由于屏幕空间有限,设计师需要设计简洁、易于理解的界面,以确保用户能够快速找到所需的功能。同时,与智能手表外观风格相一致的UI设计,将提升用户对产品的整体体验。
虽然实物UI设计带来了许多新的机会和体验,但也面临着一些挑战:
然而,随着技术的不断发展和用户对新体验的接受度增加,实物UI设计有望在未来得到更广泛的应用。
实物UI设计是虚拟界面与实际物体相结合的一种创新设计方法。它为用户创造了新颖的体验,将数字化带到了现实生活中。在智能家居设备、可穿戴设备等领域,实物UI设计已经取得了成功并得到了用户的认可。
尽管实物UI设计面临一些挑战,但随着技术的发展和用户对新体验的接受度增加,它有望在未来继续发展和应用。设计师需要遵循一定的原则,如直观性、可控性、反馈性和一致性,以提供更好的用户体验。
在当今数字化时代,用户界面(UI)设计已经成为许多企业和组织不可或缺的一部分。UI设计不仅仅用于网页和应用程序的外观和感觉,而且还能通过创造出有吸引力、易用性强的实物设计来提升用户体验。本文将探讨UI设计实物的重要性以及如何将其融入日常业务中。
UI设计实物指的是将用户界面设计的理念应用于实际产品或物品中。这些物品可以包括但不限于家居用品、家电、手持设备以及各种消费品。UI设计实物关注的是如何通过外观、交互和视觉设计来提升用户对产品的感知和体验。
1. 品牌形象塑造:良好的UI设计实物可以帮助企业建立和塑造其品牌形象。品牌形象是企业在激烈的市场竞争中脱颖而出的关键因素之一。通过将UI设计的原则应用于实物产品中,企业能够打造独特且具有辨识度的品牌形象,从而吸引更多的目标客户。
2. 提升用户体验:优秀的UI设计实物能够提供更好的用户体验。当产品的外观美观、功能易用时,用户将更愿意接触并使用该产品。通过考虑用户的需求和行为习惯,UI设计实物可以提供直观且无障碍的用户界面,使用户能够更轻松地理解和操作产品。
3. 竞争优势:UI设计实物是企业获取竞争优势的关键之一。在饱和的市场中,产品的功能和性能往往变得相似。然而,通过在产品的UI设计中注入创新和独特性,企业能够与竞争对手区分开来,从而吸引更多的顾客选择他们的产品。
1. 集成跨职能团队:将UI设计师纳入产品开发团队的早期阶段是关键的一步。与工程师、市场营销团队和产品经理紧密合作,确保UI设计实物与整个产品开发过程无缝衔接。跨职能团队的协作能够提高设计质量,并确保在产品最终发布前进行充分的测试和优化。
2. 优化用户测试:通过进行用户测试,团队可以了解用户对UI设计实物的反应和意见。这有助于优化和改进设计,以更好地满足用户需求。在测试中,收集用户的反馈和建议,并将其纳入到设计迭代的过程中。
3. 追踪竞争对手:研究竞争对手的UI设计实物是一个重要的步骤。了解竞争对手在实物设计方面的策略和技术,可以帮助团队发现新的设计机会,并保持自身在市场中的竞争优势。
4. 持续创新:UI设计实物需要与时俱进,随着技术和用户需求的变化而不断创新。团队应保持对最新设计趋势、技术和用户行为的关注,并将其应用于UI设计实物中。持续创新是保持竞争力和吸引力的关键。
UI设计实物在如今数字化时代的业务中扮演着至关重要的角色。通过将UI设计的原则应用于实物产品中,企业能够塑造品牌形象、提供优质的用户体验并获取竞争优势。将UI设计实物融入业务中需要跨职能团队的协作、用户测试的优化、竞争对手的研究以及持续创新。只有不断追求创新和卓越,企业才能在激烈的市场竞争中脱颖而出。
在家居装修中,对于客厅的装修设计是非常重要的,因为客厅是客人进门后第一个见到的空间,也是家人聚集休闲的地方。因此,如何将客厅装修得美观、舒适并充满个性化,是每个业主所考虑的重要问题。
客厅装修设计应该注重实物感,即引入物质世界中的实体元素,使整个空间更具质感。一个充满实物感的客厅装修设计不仅可以增加空间的层次感和质感,还可以让人在其中感受到不同材质、色彩和纹理的多样性。
要打造具有实物感的客厅装修设计,首先要从选材入手。选择具有纹理感的天然石材地板或实木地板,能够为客厅增添一份自然与质感。同时,在软装方面,可以选择具有质感的织物材料,如丝绸、麻布或纯棉等,让人在触摸和视觉上都能感受到不同材质的特点。
另外,在客厅的摆设上也可以加入一些具有实物感的装饰品或家具。比如,摆放一些具有纹理感的陶瓷花瓶、实木雕刻工艺品或金属装饰品,能够为客厅增加一份雅致与个性。此外,选择一些具有特色的家具,如复古风格的沙发、实木茶几或金属餐桌等,也能够为客厅带来一种与众不同的实物感。
除了实物感,客厅装修设计还需要注重色彩的搭配。色彩是装修设计中非常重要的元素,能够直接影响人们的情绪和感受。因此,选择合适的色彩搭配是打造一个舒适且具有个性化的客厅装修的关键。
在色彩搭配方面,可以根据自己的喜好和个性来选择。比如,如果喜欢清新自然的感觉,可以选择绿色系或蓝色系的色彩;如果喜欢温暖浪漫的感觉,可以选择红色系或橙色系的色彩;如果喜欢简约时尚的感觉,可以选择灰色或黑白灰的色彩。
在搭配色彩时,还需要注意色彩的对比度和协调性。可以将亮色和暖色作为主要色调,搭配一些辅助色彩来增加层次感和趣味性。同时,还可以利用家具、软装和装饰品的色彩来进行点缀,使整个客厅装修设计更加丰富多彩。
除了实物感和色彩搭配,客厅装修设计还需要注重空间布局。合理的空间布局能够提高空间的利用率和流通性,并且营造出舒适和谐的氛围。
在客厅的空间布局上,首先要考虑家具的摆放位置。根据客厅的尺寸和形状,选择适合的家具尺寸并合理摆放,避免空间的拥挤和局促感。比如,将沙发和茶几放置在客厅的中心位置,使视线和活动空间更加开阔;将电视和音响设备放置在墙面上,既方便观看又节省空间。
另外,还可以通过合理布置软装和装饰品来增加空间的美感和舒适度。例如,在沙发上摆放一些柔软的靠垫和抱枕,营造出温馨舒适的氛围;在墙面上挂上一些艺术画作,增加空间的艺术感和层次感。
最后,客厅装修设计还需要注重光照与通风。良好的光照和通风能够为客厅带来舒适和健康的居住环境。
为了获得良好的自然光照,可以选择大面积的玻璃窗或窗户,让阳光尽可能地照射进客厅中。同时,还可以通过合理的窗帘选择来控制光线的亮度和透过率。在夜间或阴天,可以通过选择合适的灯具来补充光照,使客厅整体更加明亮。
在通风方面,保证客厅的空气流通非常重要。可以选择具有通风功能的门窗,如推拉门或落地窗,确保空气的流通和质量。同时,在装修材料的选择上,可以选择环保、无毒的材料,避免室内空气污染。
综上所述,客厅装修设计需要考虑到实物感、色彩搭配、空间布局、光照和通风等方面。只有在这些方面做到合理设计和搭配,才能打造出一个美观、舒适且具有个性化的客厅空间。
蜡烛灯实物是一种常见的应急照明设备,它使用蜡烛作为燃料,能够提供持久的照明效果。蜡烛灯实物通常由一个蜡烛和一个支架组成,支架可以是金属或塑料制成,用于固定蜡烛并保持其稳定性。
蜡烛灯实物的优点是它们非常便宜,易于使用和维护,并且适用于许多不同的应用场景。例如,在露营、徒步旅行或停电时,蜡烛灯实物可以提供可靠的照明,使人们能够看清周围的环境并进行各种活动。
使用蜡烛灯实物非常简单。首先,您需要将蜡烛插入支架中,并确保它稳定。如果支架是可折叠的,请将其展开到正确的位置。然后,点燃蜡烛,并将支架放置在需要照明的位置上。
当您使用蜡烛灯实物时,请务必注意以下事项:
如果您正在考虑购买蜡烛灯实物,请注意以下几个因素:
如果您正确地使用和维护蜡烛灯实物,它们可以持续很长时间。以下是一些帮助您保持蜡烛灯实物性能的提示:
总之,蜡烛灯实物是一种经济实惠,易于使用和维护的应急照明设备。如果您正在寻找一种可靠的照明解决方案,请考虑使用蜡烛灯实物。
厨房是家庭中最重要的区域之一,它需要一个良好的布局和功能性,以提高工作效率。在厨房中,挂钩实物是不可或缺的工具,它们可以帮助我们合理利用空间,保持厨房的整洁有序。下面是一些关于厨房挂钩实物的建议和技巧。
厨房挂钩实物有各种各样的种类,可以根据不同的需求选择合适的类型。以下是一些常见的挂钩实物:
正确使用挂钩实物可以提高厨房的整洁程度和工作效率。以下是一些使用挂钩实物的技巧:
购买挂钩实物时,可以考虑以下几个方面:
总之,挂钩实物在厨房中发挥着重要的作用,可以提高工作效率,增加空间利用率。选择适合的挂钩实物,并正确使用,可以使厨房更加整洁、美观。
高脂肪实物的影响和对策
在现代社会,饮食习惯发生了巨大的变化,高脂肪食物成为许多人日常饮食的一部分。然而,过量摄入高脂肪实物对健康产生负面影响。本文将探讨高脂肪实物对身体的影响以及应对策略。
高脂肪实物的摄入过量会导致多种健康问题。首先,高脂肪食物含有大量的饱和脂肪酸,这些脂肪酸会增加胆固醇水平,进而增加患心脏病的风险。其次,高脂肪摄入还会导致体重增加和肥胖,这对心血管系统、关节和代谢健康都带来负面影响。此外,过量的高脂肪摄入还与一些癌症的发生率增加有关。
高脂肪实物摄入对人体的影响不仅限于身体健康,还涉及情绪和心理状态。研究表明,高脂肪饮食可能导致情绪低落和抑郁。这种现象可能是由于高脂肪食物对大脑化学物质的影响,如血清素和多巴胺。因此,高脂肪实物不仅对身体产生负面影响,还可能对心理健康造成影响。
尽管高脂肪实物对健康的影响不可忽视,但通过采取一些应对策略,我们可以减少与高脂肪摄入相关的风险。
制定一个合理的膳食规划是减少高脂肪摄入的关键。我们应尽量选择低脂肪、高纤维的食物,如蔬菜、水果、全谷物和瘦肉。此外,可以减少摄入饱和脂肪和反式脂肪酸的食物,如炸食、快餐和糕点。通过合理膳食规划,我们可以在摄入必需的营养物质的同时,减少高脂肪实物的摄入。
适量的运动有助于减少高脂肪实物对身体的负面影响。运动可以帮助控制体重,增强心血管健康,改善新陈代谢,并提升身体的整体状况。每周至少进行150分钟的中等强度有氧运动,如快步走、跑步或骑自行车。此外,力量训练也对保持肌肉健康和骨密度有积极作用。
在减少高脂肪实物摄入的过程中,我们还应关注脂肪的来源。优选健康脂肪,如橄榄油、鱼油和坚果,这些脂肪富含不饱和脂肪酸,对心血管健康有益。同时,减少摄入动物脂肪和人工添加的脂肪,如黄油、奶酪和蛋糕等加工食品。
健康的生活方式对减少高脂肪实物摄入的风险也起到重要作用。充足的睡眠、减压活动(如瑜伽或冥想)和保持良好的心理状态都有助于控制情绪饮食和减少对高脂肪食物的渴望。
高脂肪实物的摄入过量对人体健康产生负面影响。然而,通过合理的膳食规划、适度运动、选择健康脂肪和养成良好的生活方式,我们可以减少高脂肪实物对身体的影响。重要的是保持平衡,摄取适量的脂肪并遵循健康的生活习惯,以促进整体健康。
打底裤实物在现代时尚界扮演着至关重要的角色。无论是作为基础单品还是时尚潮流的一部分,打底裤的实物品质对于消费者的决策产生着直接影响。本文将就打底裤实物的重要性进行深入探讨,探讨其在时尚产业中的意义和影响。
打底裤作为一种常见的服装单品,一直受到消费者的青睐。然而,仅凭外观和设计很难完全展现其品质。因此,打底裤的实物展示变得至关重要。消费者通过触摸、观察实物来判断其质地、弹性和舒适度,这些都是无法仅凭图片或描述准确传达的。
现代消费者越来越看重购物体验。在时尚产业中,通过提供高质量的打底裤实物展示,品牌可以提升消费者的购物体验,增强其对品牌的认知和信任感。消费者更愿意购买他们能够看到、触摸并亲身体验的产品。
打底裤实物展示也直接关系到品牌建设和客户忠诚度。精心设计的展示以及高品质的实物展示可以帮助品牌在激烈的市场竞争中脱颖而出,吸引更多消费者的关注和喜爱。通过提供精美的打底裤实物展示,品牌可以赢得客户的忠诚度,形成稳定的消费群体。
打底裤实物展示也是品牌理念表达的重要途径。通过展示优质的实物,品牌可以传达自己的设计理念、工艺精湛以及对品质和细节的追求。消费者通过实物展示能更好地理解品牌的核心价值观,从而建立起深厚的情感连接。
除了直接影响消费者购买行为外,打底裤实物展示还可以作为消费者教育和市场推广的重要手段。通过详细展示打底裤的设计特点、面料材质和工艺制作过程,品牌可以帮助消费者更好地了解产品,并激发其购买欲望。同时,精心设计的实物展示也可以在市场中脱颖而出,吸引更多目光。
打底裤实物展示在时尚产业中扮演着至关重要的角色。通过精心设计和展示打底裤的实物,品牌可以提升购物体验,加强客户忠诚度,并有效传达自身的品牌理念。消费者也可以通过实物展示更好地了解并选择适合自己的打底裤,实现购物的愉快体验。
UI实物设计在当今数字化时代具有不可忽视的重要性。随着用户体验和用户界面设计对于产品成功的关键性日益增强,UI实物设计作为其中不可或缺的一环,扮演着至关重要的角色。通过创造具有吸引力、易用性和功能性的界面,UI实物设计不仅让用户感受到愉悦和舒适,更有助于提升产品的价值和竞争力。
UI实物设计不仅关乎美学和视觉感受,更在于用户体验的优化。一个成功的UI实物设计能够使用户更加便捷地进行交互,提升用户对产品的好感度,从而增强用户的粘性和忠诚度。通过对用户习惯、心理和行为的深入研究,UI实物设计师能够打造出符合用户期望和需求的界面,实现用户和产品之间的无缝连接。
另外,UI实物设计还能够为产品赋予个性化和品牌特色,帮助产品树立独特的形象和认知。通过在用户界面中融入品牌元素和风格,用户不仅能够轻松辨识产品的身份,更能够感受到品牌所传达的价值观和情感共鸣。因此,一个精心设计的UI实物界面不仅是产品的外在表现,更是品牌文化和精神的具体体现。
随着技术的不断发展和用户需求的不断变化,UI实物设计也在不断演进和创新。未来的UI实物设计将更加注重与人工智能、虚拟现实和增强现实等新兴技术的结合,为用户带来更加智能和沉浸式的体验。
同时,UI实物设计也将更加关注用户情感和情感设计。通过情感设计元素的引入,产品能够更好地触及用户内心,激发情感共鸣,从而加深用户对产品的情感链接和忠诚度。情感设计不仅让产品更具人情味,更能够为产品赋予更为丰富和深刻的内涵。
总的来说,UI实物设计的发展方向将更加智能化、情感化和个性化,致力于提升用户体验的深度和广度,从而为用户创造更加美好和有意义的数字生活。
之前看了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());
}
}
显示全部
收起