VB.NET中如何为NDtw构造SeriesVariable处理多变量数据
解决NDtw多变量数据格式转换问题
NDtw处理多变量数据时,SeriesVariable要求的是「按时间点组织」的结构:每个元素对应一个时间点的所有变量测量值,而非按变量分组的二维数组。你的原始二维数组是「变量为行、时间点为列」,需要调整为「时间点为元素、每个元素包含对应所有变量值」的格式。
正确的转换方法
- 遍历每个时间点,提取对应所有变量的测量值,组成单个
Double()数组 - 将这些数组集合转换为
SeriesVariable类型
修改后的代码
Imports NDtw Imports System.Collections.Generic Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim dist As Double Dim actualdist As Double ' 原始数据:行=变量,列=时间点 Dim rawSeries1(,) = {{1.0, 3.0, 7.0, 8.0, 11.0, 6.0, 6.0}, {3.0, 6.0, 3.0, 7.0, 13.0, 12.0, 7.0}} Dim rawSeries2(,) = {{3.0, 6.0, 3.0, 7.0, 13.0, 12.0, 7.0}, {1.0, 3.0, 7.0, 8.0, 11.0, 6.0, 6.0}} ' 转换为SeriesVariable格式:每个元素是一个时间点的所有变量值 Dim series1 As New SeriesVariable(ConvertToTimePointSeries(rawSeries1)) Dim series2 As New SeriesVariable(ConvertToTimePointSeries(rawSeries2)) Dim dtw As New Dtw(series1, series2) dist = dtw.GetCost() TextBox3.Text = dist.ToString End Sub ' 辅助方法:将「变量为行」的二维数组转为「时间点为元素」的数组集合 Private Function ConvertToTimePointSeries(rawData(,) As Double) As IEnumerable(Of Double()) Dim timePointCount As Integer = rawData.GetLength(1) ' 时间点数量(列数) Dim variableCount As Integer = rawData.GetLength(0) ' 变量数量(行数) Dim timePointList As New List(Of Double()) For timePointIndex As Integer = 0 To timePointCount - 1 Dim variablesAtTimePoint(variableCount - 1) As Double For variableIndex As Integer = 0 To variableCount - 1 variablesAtTimePoint(variableIndex) = rawData(variableIndex, timePointIndex) Next timePointList.Add(variablesAtTimePoint) Next Return timePointList End Function End Class
关键说明
SeriesVariable的构造函数接受IEnumerable(Of Double())类型参数,每个Double()对应一个时间点的多变量观测值- 辅助方法
ConvertToTimePointSeries负责将原始的「变量优先」二维数组,转换为NDtw要求的「时间点优先」结构 - 如果你不想写辅助方法,也可以手动逐个创建时间点数组并添加到
SeriesVariable中,比如:Dim series1 As New SeriesVariable() series1.Add(New Double() {1.0, 3.0}) ' 第一个时间点的两个变量值 series1.Add(New Double() {3.0, 6.0}) ' 第二个时间点的两个变量值 ' 依次添加剩余5个时间点的数据
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

