首页 > 其他 > 详细

C# chart.DataManipulator.FinancialFormula()公式的使用 线性回归预测方法

时间:2014-05-07 00:40:46      阅读:1087      评论:0      收藏:0      [点我收藏+]

最近翻阅资料,找到 chart.DataManipulator.FinancialFormula()公式的使用,打开另一扇未曾了解的窗,供大家分享一下。

一 DataManipulator类

运行时,执行数据操作。此类是通过chart中DataManipulator属性对外公开的。

在C#中的继承关系如下:

System.Object           

  System.Web.UI.DataVisualization.Charting.DataFormula

    System.Web.UI.DataVisualization.Charting.DataManipulator

《命名空间:System.Web.UI.DataVisualization.Charting》

《程序集:System.Web.DataVisualization(在 System.Web.DataVisualization.dll 中)》

在DataManipulator属性中囊括了很多数学计算方法(大多都是针对图表的数据序列展开的)以下是这样一个列子:

double result = Chart1.DataManipulator.Statistics.Mean("Series1");平均值函数

double result = Chart1.DataManipulator.Statistics.Median("Series1");中值函数

 StatisticFormula 类计算统计公式。

二、DataFormula.FinancialFormula 方法

使用指定的参数从公式模块调用方法。

重载此成员。有关此成员的完整信息(包括语法、用法和示例),请单击重载列表中的相应名称。

在这里特别讲到的是预测函数功能的实现情况。

预测公式尝试根据历史数据找出拟合度最佳的回归函数,然后根据最拟合的函数预测最可能的未来数据值。

Chart.DataManipulator.FinancialFormula(
    FinancialFormula.Forecasting,
    "RegressionType,Period,ApproxError,ForecastError",
    "Historical",
    "Forecast,UpperError,LowerError")

三 预测函数的语法分析说明

此公式采用四个可选参数。

RegressionType

回归类型。使用一个数字来指示特定次数的多元回归,或者使用以下值之一指定不同的回归类型:LinearExponentialLogarithmicPower默认值为 2,与指定 Linear 等效。

Period

预测时段。公式会预测此指定的未来天数内的数据变化。默认值为序列长度的一半。

ApproxError

是否输出近似误差。如果设置为 false,则输出误差序列不包含相应历史数据的数据。默认值为 true

ForecastError

是否输出预测误差。如果设置为 false,并且 ApproxError 设置为 true,则输出误差序列将包含所有预测数据点的近似误差。默认值为 true

输入值:

此公式采用一个输入 Y 值。

Historical:用于预测的历史数据。

输出值:

此公式输出三个 Y 值。

Forecast:预测测值。

UpperError:上限误差。

LowerError:下限误差。
1
2
下面的示例以 Series1 (Series1:Y) 作为输入,在 Series2 上输出预测值 (Series2:Y),在 Series3 上输出误差范围(Series3:Y、Series3:Y2)。该示例采用二次多元回归,预测期间为 40 天。
Chart1.DataManipulator.FinancialFormula (FinancialFormula.Forecasting, "2,40,true,true", "Series1:Y", "Series2:Y,Series3:Y,Series3:Y2");

 在编程的过程中,注意原始历史数据的输入,要求X轴的间隔是一定的,否则影响数据的回归分析

四:以下是自己编写的线性回归预测方法的一个公用类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System.Drawing;
using System.Windows.Forms.DataVisualization.Charting;
using System;
 
namespace WindowsFormsApplication8
{
    class RegressionModelClass
    {
        #region  字段
        double[] sourceData_X = new double[4];  // 样本数据 X 轴坐标值
        double[] sourceData_Y = new double[4];  // 样本数据 Y 轴坐标值
 
        double[] predictData_Y = new double[8]; // 预测的未来数据的 Y 轴坐标值
        int n = 4;                              // 样本数据的个数
 
        // Chart
        System.Windows.Forms.DataVisualization.Charting.Chart chart_temp = new System.Windows.Forms.DataVisualization.Charting.Chart();
 
        #endregion
 
        /// <summary>
        /// 构造函数
        /// </summary>
        public RegressionModelClass(double[] data_x, double[] data_y)
        {
            for (int i = 0; i < n;i++)
            {
                sourceData_X[i] = data_x[i];
                sourceData_Y[i] = data_y[i];
            }
 
            InitialChart(chart_temp, sourceData_X, sourceData_Y);
        }
 
        // 初始化 Chart 控件
        private void InitialChart(System.Windows.Forms.DataVisualization.Charting.Chart chart, double[] data_x, double[] data_y)
        {
            #region  1. Title 设置
            Title title = new Title();  //* 实例化
            title.Text = "信息预测";
            //** 关联
            chart.Titles.Add(title);  //* 当使用这种重载方式时,可以将属性传递
            #endregion
 
            #region 2. ChartArea 设置
            ChartArea chartarea1 = new ChartArea();  //* 实例化
            chartarea1.Name = "chartarea1";     //* ChartArea 的唯一名称
            // 关联
            chart.ChartAreas.Add(chartarea1);  //重要//使用这种重载方法
            #endregion
 
            #region 3. 坐标轴设置
            #region  3.1 X轴
            Axis axis_X = new Axis();
            axis_X.IntervalType = DateTimeIntervalType.Days; 
            axis_X.Title = "时 间"//* 轴的标题
            // ** 关联
            chart.ChartAreas[0].AxisX = axis_X;
            chart.ChartAreas[0].AxisX.Enabled = AxisEnabled.True;
            #endregion
 
            #region   3.2.1  深度 -- Y 轴
            Axis axisY_depth = new Axis();
            axisY_depth.Title = "深度";
            axisY_depth.LineColor = Color.Black;
            axisY_depth.ArrowStyle = AxisArrowStyle.None;
            axisY_depth.TextOrientation = TextOrientation.Stacked;
            axisY_depth.TitleFont = new Font("微软雅黑", 14F, FontStyle.Bold);
            axisY_depth.TitleForeColor = Color.Black;
            axisY_depth.TitleAlignment = StringAlignment.Far;
            axisY_depth.IsLabelAutoFit = false;
 
            axisY_depth.IntervalType = DateTimeIntervalType.Number;
            axisY_depth.IsStartedFromZero = false;
            axisY_depth.Minimum = 0;
            axisY_depth.Maximum = 10;
            axisY_depth.IntervalAutoMode = IntervalAutoMode.FixedCount;
            axisY_depth.InterlacedColor = Color.Red;
 
            // ** 关联
            chart.ChartAreas[0].AxisY = axisY_depth;
            chart.ChartAreas[0].AxisY.Enabled = AxisEnabled.True;
            #endregion
 
            #endregion
 
            #region 4. Series 设置
 
            Series series = new Series();
            series.Name = "样本数据曲线";
            series.ChartType = SeriesChartType.Line;
            series.XAxisType = AxisType.Primary;
            series.YAxisType = AxisType.Primary;
            // important
            series.XValueType = ChartValueType.DateTime;
            series.YValueType = ChartValueType.Double;
            series.Enabled = true;
 
            //关联
            series.ChartArea = chart.ChartAreas[0].Name;
            chart.Series.Clear();
            chart.Series.Add(series);  // 注意要使用这个重载方法,不应该使用 Add(string)重载方法
            #endregion
 
            #region 5. Points 设置
 
            // 清除所有数据点
            chart.Series[0].Points.Clear();
 
            // 添加数据点
            int m = data_x.Length;
            for (int i = 0; i < m; i++)
            {
                chart.Series[0].Points.AddXY(data_x[i], data_y[i]);
            }
            #endregion
        }
 
        /// <summary>
        /// 得到基于回归分析预测的数据
        /// </summary>
        ///
        public double[] GetPredictData()
        {
            Series trendSeries = new Series();
            trendSeries.Name = "trend";
            trendSeries.ChartType = SeriesChartType.Line;
             
            // 关联
            trendSeries.ChartArea = chart_temp.ChartAreas[0].Name;
            chart_temp.Series.Add(trendSeries);
 
            string typeRegression = "2";
            // The number of days for Forecasting (备注:该数字对应的单位与X轴的数据间隔单位有关,并不一定是“天”)
            string forecasting = "4";
            string error = "false";
            string forecastingError = "false";
            string parameters = typeRegression + ‘,‘ + forecasting + ‘,‘ + error + ‘,‘ + forecastingError;
 
            chart_temp.DataManipulator.FinancialFormula(FinancialFormula.Forecasting, parameters, chart_temp.Series[0], chart_temp.Series["trend"]);
 
 
            for (int i = 0; i < 8; i++)  // 共4个预测值
            {
                predictData_Y[i] = Math.Round(chart_temp.Series["trend"].Points[i].YValues[0], 5);   // chart.Series["trend"]共8个数据点
            }
 
            return predictData_Y;
        }
    }
}

 

 

 

 

 

C# chart.DataManipulator.FinancialFormula()公式的使用 线性回归预测方法,布布扣,bubuko.com

C# chart.DataManipulator.FinancialFormula()公式的使用 线性回归预测方法

原文:http://www.cnblogs.com/liuxiaowei0543/p/3712522.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!