2010-11-08 14 views
0

陣列羣集通過間隔通過哈希我有一個看起來像這樣在Perl

#Status value 
TP  5.000 
TP  3.000 
TP  3.000 
TN  10.000 
TP  2.000 
TP  9.000 
TN  1.000 
TP  9.000 
TN  1.000 

我們想要做的是基於集羣在value給定的間隔狀態的數據。 讓該間隔爲1-3, 4-6, 7-9, 10-12, etc ..(即Bin大小3)。

我們希望得到陣列的像這樣的哈希:

my %hoa = (
'1-3' => [TP,TP,TP,TN,TN], 
'4-6' => [TP], 
'7-9' => [TP,TP], 
'10-12' => [TN]); 

什麼是實現這一目標的方式?

更新:由於ysth,更正了7-9的HoA。

回答

2

抽象掉的代碼,以確定間隔:

sub interval { 
    my ($val) = @_; 
    my $i = int(($val + 2)/3); 
    my $interval = sprintf('%d-%d', $i * 3 -2, $i * 3); 
    return $interval; 
} 

my %hoa; 
while (my $line = <>) { 
    next if $line =~ /^#/; 
    my ($status, $value) = split ' ', $line; 
    push @{ $hoa{ interval($value) } }, $status; 
} 

use Data::Dumper; 
print Dumper \%hoa; 

(它得到兩個TP 7-9,而不是一個你展示)。

2

ysth的回答是我首先想到的,我認爲他有正確的做法。

我只想留下一個建議:您可以使用聚類算法以面向未來的方式(例如,當您的數據變爲多維時)爲您完成此操作。例如,K-means可以正常工作,即使對於您的一維數據也是如此。

例如:

use strict; use warnings; 
use Algorithm::KMeans; 

my $datafile = $ARGV[0] or die; 
my $K  = $ARGV[1] or 0; 
my $mask  = 'N1'; 

my $clusterer = Algorithm::KMeans->new(
    datafile => $datafile, 
    mask  => $mask, 
    K  => $K, 
    terminal_output => 0, 
); 

$clusterer->read_data_from_file(); 

my ($clusters, $cluster_centers) = $clusterer->kmeans(); 

my %clusters; 

while (@$clusters) { 

    my $cluster = shift @$clusters; 
    my $center = shift @$cluster_centers; 

    $clusters{"@$center"} = $cluster; 
} 

use YAML; print Dump \%clusters;