亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2840 | 回復(fù): 2
打印 上一主題 下一主題

利用Moose寫Pileline模塊 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2017-08-18 22:56 |只看該作者 |倒序?yàn)g覽
本帖最后由 aef25u 于 2017-08-18 23:03 編輯

眾所周知,Spark的ML Pipelines類庫用于構(gòu)建機(jī)器學(xué)習(xí)的工作流,每一個PipelineStage 都會完成一個任務(wù),如數(shù)據(jù)集處理轉(zhuǎn)化,模型訓(xùn)練,參數(shù)設(shè)置或數(shù)據(jù)預(yù)測等。
Spark的ML Pipelines工作流大概是這個樣子的。
  1. val pipeline = new   
  2. Pipeline().setStages(Array(labelIndexer,vectorAssembler,rfClassifier,labelConverter))  
  3. val model = pipeline.fit(trainingData)
復(fù)制代碼
而perl的cpan上也有個Pipeline模塊,作者是用perl的舊版oop實(shí)現(xiàn)的,在分析了源碼和個人需求后,用Moose改寫出了自已的Pipeline,主要實(shí)現(xiàn)了類ML Pipelines的DataFrame(改用perl的Data::Table模塊)與Transformer功能。以下介紹如何使用Moose寫Pipeline模塊。
一、UML類圖設(shè)計(jì)


二、模塊間關(guān)系說明
  • Pipeline類的dispatcher屬性是PipelineDispatch的實(shí)例對象
  • PipelineDispatch類繼承自ipelineBase,屬性segments是利用Moose的屬性委托功能實(shí)現(xiàn)的用于存放PipelineSegment實(shí)例對象的數(shù)組引用
  • PipelineDispatch類內(nèi),屬性dfhash是利用Moose的屬性委托功能實(shí)現(xiàn)的用于存放各PipelineSegment->dispatch()返回值的hash引用:{ref($PipelineSegment)=>$df}即(YouSegmentClassName=>$df)
  • PipelineSegment類的store屬性是Pipelinestore的實(shí)例對象
  • Pipelinestore類的功能,主要是在不同的PipelineSegment間存入數(shù)據(jù)或取出數(shù)據(jù)
dispatch()是核心方法,抽象方法如下:
  • dispatch()屬Pipeline類方法
  • dispatch_loop()屬Pipeline類方法,是dispatch()的內(nèi)置方法
    • next()屬PipelineDispatch類方法
內(nèi)部調(diào)用關(guān)系如下:
  1.     Pipeline->dispatch(
  2.          Pipeline->dispatch_loop(
  3.                Pipeline::Dispatch->next(
  4.                       Pipeline::Segment->prepare_dispatch(Pipeline);
  5.                       my $df = Pipeline::Segment->dispatch();
  6.               );
  7.           );
  8.     );
復(fù)制代碼


注:自已寫的繼承自Pipeline::Segment的Segment類,即是Spark的ML Pipelines類的一個個Transformer
三、模塊源碼3.1Pipeline類
  1. package Pipeline;

  2. use Moose;

  3. #use namespace::clean;
  4. use Pipeline::Dispatch;

  5. has 'debug' => (
  6.     is      => 'rw',
  7.     isa     => 'Int',
  8.     default => 0,
  9. );
  10. has 'dispatcher' => (
  11.     is      => 'ro',
  12.     isa     => 'Pipeline::Dispatch',
  13.     default => sub { Pipeline::Dispatch->new(); },
  14.     handles => {
  15.         get_segment => 'get',
  16.         add_segment => 'add',
  17.         del_segment => 'delete'
  18.     }
  19. );

  20. has 'store' => (
  21.     is      => 'rw',
  22.     isa     => 'Pipeline::Store',
  23.     default => sub { Pipeline::Store->new() },
  24. );

  25. sub segments {
  26.     my $self = shift;
  27.     return $self->{dispatcher}->segments(@_);
  28. }

  29. sub dispatch {
  30.     my $self = shift;
  31.     $self->dispatch_loop();
  32.     $self->{dispatcher}->reset();
  33. }

  34. sub dispatch_loop {
  35.     my $self = shift;
  36.     $self->{dispatcher}->debug( $self->{debug} );
  37.     while ( $self->{dispatcher}->segment_available ) {
  38.         $self->{dispatcher}->next($self);
  39.     }
  40. }
  41. sub getDf {
  42.     my ($self,$segname) = @_;
  43.    
  44.     $self->{dispatcher}->getDf($segname);
  45. }

  46. #__PACKAGE__->meta->make_immutable;

  47. 1;
復(fù)制代碼

3.2Pipeline:ispatch類
  1. package Pipeline::Dispatch;

  2. use Moose;
  3. use Pipeline::Store;
  4. use Pipeline::Segment;
  5. extends 'Pipeline::Base';

  6. use Data::Printer;

  7. has 'segments' => (
  8.     traits  => ['Array'],
  9.     is      => 'rw',
  10.     isa     => 'ArrayRef[Pipeline::Segment]',
  11.     default => sub { [] },
  12.     handles => {
  13.         get               => 'get',
  14.         add               => 'push',
  15.         get_next_segment  => 'shift',
  16.         delete            => 'delete',
  17.         segment_available => 'count'
  18.     }
  19. );

  20. has 'dispatched_segments' => (
  21.     is      => 'rw',
  22.     isa     => 'ArrayRef[Pipeline::Segment]',
  23.     default => sub { [] }
  24. );
  25. has 'dfhash' => (
  26.     traits  => ['Hash'],
  27.     is      => 'ro',
  28.     isa     => 'HashRef',
  29.     default => sub { {} },
  30.     handles => {
  31.         _set_opt => 'set',
  32.         getDf    => 'get',
  33.     }
  34. );

  35. sub setDf {
  36.     my ( $self, $obj, $df ) = @_;

  37.     if ( defined($obj) ) {
  38.         $self->_set_opt( ref($obj), $df );
  39.     }
  40.     return $self;

  41. }

  42. sub next {
  43.     my $self = shift;
  44.     my $pipe = shift;

  45.     my $segment = $self->get_next_segment();
  46.     $segment->prepare_dispatch($pipe);
  47.     $self->emit( "dispatching to " . ref($segment) ) if $self->debug;

  48.     my $df = $segment->dispatch();

  49.     #將segment->dispatch的返回值克隆一份保存進(jìn)dfhash
  50.     if ( ref($df) eq 'Data::Table' ) {
  51.         $self->setDf( $segment, $df->clone() );
  52.     }
  53.     else {
  54.         $self->setDf( $segment, $df );
  55.         $df=undef;
  56.     }
  57.     push @{ $self->{dispatched_segments} }, $segment;
  58. }

  59. sub reset {
  60.     my $self = shift;
  61.     $self->segments( $self->{dispatched_segments} );
  62.     $self->dispatched_segments( [] );
  63. }

  64. #__PACKAGE__->meta->make_immutable;

  65. 1;
復(fù)制代碼

3.3Pipeline::Base類
  1. package Pipeline::Base;

  2. use Moose;
  3. #use namespace::clean;

  4. has 'debug' => (
  5.     is      => 'rw',
  6.     isa     => 'Int',
  7.     default => 0,
  8. );

  9. sub emit {
  10.     my ( $self, $mesg ) = @_;
  11.     $self->log( $self->_format_message($mesg) ) if $self->debug;
  12. }

  13. sub log {
  14.     my ( $self, $mesg ) = @_;
  15.     print STDERR $mesg;
  16. }

  17. sub _format_message {
  18.     my ( $self, $mesg ) = @_;
  19.     my $class = ref($self);
  20.     return "[$class] $mesg\n";
  21. }

  22. #__PACKAGE__->meta->make_immutable;

  23. 1;
復(fù)制代碼

3.4Pipeline::Segment類
  1. package Pipeline::Segment;

  2. use Moose;

  3. has 'store' => (
  4.     is      => 'rw',
  5.     isa     => 'Pipeline::Store',
  6.     default => sub { Pipeline::Store->new() },
  7. );

  8. sub dispatch {
  9.     my $self = shift;
  10. }

  11. sub prepare_dispatch {
  12.     my ( $self, $pipe ) = @_;
  13.     $self->store( $pipe->store );
  14. }

  15. #__PACKAGE__->meta->make_immutable;

  16. 1;
復(fù)制代碼

3.5Pipeline::Store類
  1. package Pipeline::Store;

  2. use Moose;

  3. has 'storehash' => (
  4.     traits  => ['Hash'],
  5.     is      => 'ro',
  6.     isa     => 'HashRef[Object]',
  7.     default => sub { {} },
  8.     handles => {
  9.         _set_opt => 'set',
  10.         get      => 'get',
  11.     }
  12. );

  13. sub set {
  14.   my $self = shift;
  15.   my $obj  = shift;
  16.    if (defined( $obj )) {
  17.     $self->_set_opt(ref($obj),$obj);
  18.   }
  19.   return $self;
  20.   
  21. }

  22. #__PACKAGE__->meta->make_immutable;

  23. 1;
復(fù)制代碼

四、Example
4.1example.pl
  1. package MyDf;
  2. use Moose;

  3. extends 'Pipeline::Segment';

  4. has 'df' => (
  5.     is  => 'rw',
  6.     isa => 'Data::Table',
  7. );

  8. package MyData;
  9. use Moose;

  10. extends 'Pipeline::Segment';

  11. has 'df' => (
  12.     is  => 'rw',
  13.     isa => 'Data::Table',
  14. );

  15. sub dispatch {
  16.     my $self = shift;
  17.     $self->store->set( MyDf->new( df => $self->{df} ) );
  18.     return $self->{df};
  19. }

  20. package MySeg1;
  21. use Moose;

  22. extends 'Pipeline::Segment';

  23. sub dispatch {
  24.     my $self = shift;
  25.     my $df   = $self->store->get('MyDf');
  26.     #MySeg1將MyDf增加了一行合計(jì)數(shù)
  27.     $df->{df}->addRow( ['合計(jì)',8,undef], 3 );
  28.     return $df->{df};
  29. }

  30. package MySeg2;
  31. use Moose;

  32. extends 'Pipeline::Segment';

  33. sub dispatch {
  34.     my $self = shift;

  35.     my $df = $self->store->get('MyDf');
  36.     #MySeg2將MyDf增加了一列總金額
  37.     $df->{df}->addCol( [100,100,100,300],"total" ,3 );
  38.     return $df->{df};
  39. }

  40. package main;
  41. use lib './lib';
  42. use Pipeline;
  43. use Data::Table;
  44. use Data::Printer;

  45. my $headers = [ 'name', 'count', 'price' ];

  46. my $rows = [ [ 'A', '1', '100' ],
  47.              [ 'B', '2', '50' ],
  48.              [ 'C', '5', '20' ]];
  49. my $df = Data::Table->new( $rows, $headers, 0 );

  50. #p $df->csv;

  51. my $pipeline = Pipeline->new();
  52. $pipeline->debug(1);

  53. my $mydata = MyData->new( df => $df );
  54. my $seg1 = MySeg1->new();
  55. my $seg2 = MySeg2->new();
  56. $pipeline->add_segment( $mydata, $seg1, $seg2 );
  57. my $production = $pipeline->dispatch();
  58. #p $pipeline->store->get('MyDf')->{df}->csv;
  59. p $pipeline->getDf("MyData")->csv;
  60. p $pipeline->getDf("MySeg1")->csv;
  61. p $pipeline->getDf("MySeg2")->csv;

  62. #Author blog:tianyv.github.io
復(fù)制代碼



評分

參與人數(shù) 1信譽(yù)積分 +10 收起 理由
rubyish + 10 3Q~~

查看全部評分

求職 : 軟件工程師
論壇徽章:
3
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-13 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-05 06:20:00
2 [報告]
發(fā)表于 2017-08-19 02:19 |只看該作者
能用 Moose 寫的代碼,用 Ruby, Python 也能寫吧。

不知道用 Java, C++ 能重寫嗎?

Java, C++, Golang 等靜態(tài)類型語言,對數(shù)據(jù)結(jié)構(gòu)有一些限制,例如數(shù)組中的元素都是同種類型,沒有嵌套結(jié)構(gòu)的數(shù)組。

論壇徽章:
0
3 [報告]
發(fā)表于 2017-08-23 00:05 |只看該作者
Moose的Traits確實(shí)很好用啊。有時覺得Perl5是不是應(yīng)該直接把Moose捆綁到core里面,從工程角度講這樣更有利于推廣Perl5。然而現(xiàn)在CPAN上Moose/Moo/Mouse/Mo/Dios/Moxie。。。牛人們都在忙著玩輪子。。。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP