VB.NET 规范化数据 [1, -1]
VB.NET Normalizing Data [1, -1]
我目前正在使用以下代码规范化数据:
Public Function NormalizeData(values As Double()) As Double()
Dim min = values.Min
Dim max = values.Max
Dim outList(values.Count - 1) As Double
For i = 0 To values.Count - 1
outList(i) = (values(i) - min) / (max - min)
Next
Return outList
End Function
此 returns 值相应地从 0 到 1。我对如何在 [1, -1] 而不是 [1, 0] 之间进行标准化感到困惑。
您已经知道如何归一化到 0 到 1 的范围。如果您希望范围为 -1 到 1,只需将归一化数据乘以 2 并减去 1。
正如我在评论中所说,您只需修改 For 循环中的语句即可调整数据:
outList(i) = 2 * (values(i) - min) / (max - min) - 1
对数据进行反规范化的等效语句是:
outList(i)= (values(i) + 1) * (max - min) / 2 + min
如果您需要对多个数据数组进行规范化和反规范化,我建议创建一个 NormalData
class,它可以存储规范化数据以及最大值和最小值,并且具有以下属性: return 标准化或非标准化值。这是一个 class 的例子。您可以使用
创建它
- 一组非规范化数据,或者...
- 归一化数据数组以及最小值和最大值
NormalValues
和 Values
属性 return 分别是规范化和非规范化数据。
Public Class NormalData
''' <summary>Create a NormalData object from and unnormalised array of values</summary>
''' <param name="values">Unnormalised values</param>
Sub New(values() As Double)
Minimum = values.Min
Maximum = values.Max
NormalValues = values.Select(Function(val) 2 * (val - Minimum) / (Maximum - Minimum) - 1).ToArray
End Sub
''' <summary>Create a NormalData object from and normalised array of values</summary>
''' <param name="normal">Normalised values</param>
''' <param name="min">Minimum value of unnormalised data</param>
''' <param name="max">Maximum value of unnormalised data</param>
Sub New(normal() As Double, min As Double, max As Double)
Minimum = min
Maximum = max
NormalValues = normal
End Sub
ReadOnly Property Minimum As Double
ReadOnly Property Maximum As Double
ReadOnly Property NormalValues As Double()
ReadOnly Property Values As Double()
Get
Return NormalValues.Select(Function(norm) (norm + 1) * (Maximum - Minimum) / 2 + Minimum).ToArray
End Get
End Property
End Class
我目前正在使用以下代码规范化数据:
Public Function NormalizeData(values As Double()) As Double()
Dim min = values.Min
Dim max = values.Max
Dim outList(values.Count - 1) As Double
For i = 0 To values.Count - 1
outList(i) = (values(i) - min) / (max - min)
Next
Return outList
End Function
此 returns 值相应地从 0 到 1。我对如何在 [1, -1] 而不是 [1, 0] 之间进行标准化感到困惑。
您已经知道如何归一化到 0 到 1 的范围。如果您希望范围为 -1 到 1,只需将归一化数据乘以 2 并减去 1。
正如我在评论中所说,您只需修改 For 循环中的语句即可调整数据:
outList(i) = 2 * (values(i) - min) / (max - min) - 1
对数据进行反规范化的等效语句是:
outList(i)= (values(i) + 1) * (max - min) / 2 + min
如果您需要对多个数据数组进行规范化和反规范化,我建议创建一个 NormalData
class,它可以存储规范化数据以及最大值和最小值,并且具有以下属性: return 标准化或非标准化值。这是一个 class 的例子。您可以使用
- 一组非规范化数据,或者...
- 归一化数据数组以及最小值和最大值
NormalValues
和 Values
属性 return 分别是规范化和非规范化数据。
Public Class NormalData
''' <summary>Create a NormalData object from and unnormalised array of values</summary>
''' <param name="values">Unnormalised values</param>
Sub New(values() As Double)
Minimum = values.Min
Maximum = values.Max
NormalValues = values.Select(Function(val) 2 * (val - Minimum) / (Maximum - Minimum) - 1).ToArray
End Sub
''' <summary>Create a NormalData object from and normalised array of values</summary>
''' <param name="normal">Normalised values</param>
''' <param name="min">Minimum value of unnormalised data</param>
''' <param name="max">Maximum value of unnormalised data</param>
Sub New(normal() As Double, min As Double, max As Double)
Minimum = min
Maximum = max
NormalValues = normal
End Sub
ReadOnly Property Minimum As Double
ReadOnly Property Maximum As Double
ReadOnly Property NormalValues As Double()
ReadOnly Property Values As Double()
Get
Return NormalValues.Select(Function(norm) (norm + 1) * (Maximum - Minimum) / 2 + Minimum).ToArray
End Get
End Property
End Class