首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl中数组的区间哈希聚类

Perl中数组的区间哈希聚类
EN

Stack Overflow用户
提问于 2010-11-08 03:20:22
回答 2查看 427关注 0票数 0

我有这样的数据

代码语言:javascript
运行
复制
#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 .. (即斌大小3)。

我们希望得到如下数组的散列:

代码语言:javascript
运行
复制
my %hoa = (
'1-3' => [TP,TP,TP,TN,TN],
'4-6' => [TP],
'7-9' => [TP,TP],
'10-12' => [TN]);

实现这一目标的方法是什么?

Update:由于ysth,更正了7-9的HoA。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-08 03:35:23

提取代码以确定间隔:

代码语言:javascript
运行
复制
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;

( 7-9有两个TPs,而不是你显示的一个)。

票数 2
EN

Stack Overflow用户

发布于 2010-11-08 06:57:33

ysth的回答也是我的第一件事,我认为他有正确的方法。

我只想留下一个建议:您可以使用聚类算法以一种未来证明的方式(例如,当您的数据变得多维时)为您完成这一任务。例如,K-指可以正常工作,即使是你的一维数据也是如此。

例如:

代码语言:javascript
运行
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4120995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档