请问怎么计算一组数据的趋势?

HC1qq 2021-01-26 04:56:35

需求:这个是数据在前端通过echarts展示出来的 现在我需要根据前几条数据的走势来判断当前数据点的状态
尝试:1.之前百度了 使用最小二乘法来拟合曲线 但是感觉返回的斜率对不上。不知道是不是我对返回值的理解有什么错误的地方
我的函数:

///<summary>
///用最小二乘法拟合二元多次曲线
///</summary>
///<param name="arrX">已知点的x坐标集合</param>
///<param name="arrY">已知点的y坐标集合</param>
///<param name="length">已知点的个数</param>
///<param name="dimension">方程的最高次数</param>

private double[] MultiLine(double[] arrX, double[] arrY, int length, int dimension)//二元多次线性方程拟合曲线
{
int n = dimension + 1; //dimension次方程需要求 dimension+1个 系数
double[,] Guass = new double[n, n + 1]; //高斯矩阵 例如:y=a0+a1*x+a2*x*x
for (int i = 0; i < n; i++)
{
int j;
for (j = 0; j < n; j++)
{
Guass[i, j] = SumArr(arrX, j + i, length);
}
Guass[i, j] = SumArr(arrX, i, arrY, 1, length);
}

return ComputGauss(Guass, n);

}


private double SumArr(double[] arr, int n, int length) //求数组的元素的n次方的和
{
double s = 0;
for (int i = 0; i < length; i++)
{
if (arr[i] != 0 || n != 0)
s = s + Math.Pow(arr[i], n);
else
s = s + 1;
}
return s;
}
private double SumArr(double[] arr1, int n1, double[] arr2, int n2, int length)
{
double s = 0;
for (int i = 0; i < length; i++)
{
if ((arr1[i] != 0 || n1 != 0) && (arr2[i] != 0 || n2 != 0))
s = s + Math.Pow(arr1[i], n1) * Math.Pow(arr2[i], n2);
else
s = s + 1;
}
return s;

}

private double[] ComputGauss(double[,] Guass, int n)
{
int i, j;
int k, m;
double temp;
double max;
double s;
double[] x = new double[n];

for (i = 0; i < n; i++) x[i] = 0.0;//初始化


for (j = 0; j < n; j++)
{
max = 0;

k = j;
for (i = j; i < n; i++)
{
if (Math.Abs(Guass[i, j]) > max)
{
max = Guass[i, j];
k = i;
}
}
if (k != j)
{
for (m = j; m < n + 1; m++)
{
temp = Guass[j, m];
Guass[j, m] = Guass[k, m];
Guass[k, m] = temp;

}
}

if (0 == max)
{
// "此线性方程为奇异线性方程"

return x;
}


for (i = j + 1; i < n; i++)
{

s = Guass[i, j];
for (m = j; m < n + 1; m++)
{
Guass[i, m] = Guass[i, m] - Guass[j, m] * s / (Guass[j, j]);

}
}


}//结束for (j=0;j<n;j++)


for (i = n - 1; i >= 0; i--)
{
s = 0;
for (j = i + 1; j < n; j++)
{
s = s + Guass[i, j] * x[j];
}

x[i] = (Guass[i, n] - s) / Guass[i, i];

}

return x;
}//返回值是函数的系数
...全文
2006 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
2539623892@qq.com 2021-01-29
  • 打赏
  • 举报
回复
请问数仓要求会Java算法、spark core算子编程吗
xiaoyin35 2021-01-29
  • 打赏
  • 举报
回复
引用 18 楼 xiaoyin35 的回复:
看见大佬的评论,本蒻菊瑟瑟发抖,但是我认为好像如果但是不要那么精确……我倒是认为有一种简单的方法 可以把数据看成直线,比如那条线,可以看成这样: 让后根据附近几条直线的方向往后延长一下,具体代码本蒻菊也不知道
然后就能看出红线和绿线差不多都是要一直是直线的,而蓝线是要往上增加(可能)
引用 15 楼 丁劲犇 的回复:
看标题以为是预测趋势,看内容似乎带有噪声环境下曲线拟合和跟踪的意思。会不会类似卡尔曼之类的操作可以解决
变成直线可能有一点降噪的感觉,改直线的数量可能会让他的清晰度(就是具体度)改变。
xiaoyin35 2021-01-29
  • 打赏
  • 举报
回复
看见大佬的评论,本蒻菊瑟瑟发抖,但是我认为好像如果但是不要那么精确……我倒是认为有一种简单的方法 可以把数据看成直线,比如那条线,可以看成这样: 让后根据附近几条直线的方向往后延长一下,具体代码本蒻菊也不知道
yifeiyuann 2021-01-29
  • 打赏
  • 举报
回复
写的很好,鼓掌
丁劲犇 2021-01-28
  • 打赏
  • 举报
回复
看标题以为是预测趋势,看内容似乎带有噪声环境下曲线拟合和跟踪的意思。会不会类似卡尔曼之类的操作可以解决
HC1qq 2021-01-27
  • 打赏
  • 举报
回复
引用 12 楼 wanghui0380 的回复:
使用方法和例子看这里 https://github.com/mpguard/BtHeart
好的 谢谢
wanghui0380 2021-01-27
  • 打赏
  • 举报
回复
使用方法和例子看这里 https://github.com/mpguard/BtHeart
wanghui0380 2021-01-27
  • 打赏
  • 举报
回复
按你的描述,你想消除噪声。 就像那篇文章讲的,去除噪声的主要手段就是“滤波”(或者重采样)--------当然滤波器就有很多种了,这需要你根据情况选择 如果我们选择mathnet这个工具箱,那么他的移动平均滤波器(采样器)方法很简单 静态统计分析 MathNet.Numerics.Statistics IEnumerable<double> MovingAverage(this IEnumerable<double> samples, int windowSize) //使用移动窗口进行,移动平均计算 标准滤波器工具集 MathNet.Filtering
HC1qq 2021-01-27
  • 打赏
  • 举报
回复
引用 7 楼 wanghui0380 的回复:
因为我们不知道你到底想要什么,只能尽量给点靠边的猜测和可以用工具 https://blog.csdn.net/qq_19600291/article/details/101010249 比如这篇文章是“移动平均滤波”,如果要完成这种东西,mathnet ,AccordNET这两个工具包我们都可以完成这个功能
想要的就是通过计算前半个小时以内的数据 走势 比如半个小时有10条温度记录 然后加上当前记录中的温度,整个温度数组呈现的是上升还是下降趋势。 如果是单一的还好直接通过计算斜率能得出结果,主要是如果有波动的话通过计算斜率就会有误差了。我主要的问题是这个,之前以为通过最小二乘法拟合曲线能算出趋势。。。
HC1qq 2021-01-27
  • 打赏
  • 举报
回复
引用 7 楼 wanghui0380 的回复:
因为我们不知道你到底想要什么,只能尽量给点靠边的猜测和可以用工具 https://blog.csdn.net/qq_19600291/article/details/101010249 比如这篇文章是“移动平均滤波”,如果要完成这种东西,mathnet ,AccordNET这两个工具包我们都可以完成这个功能
好的 我看看
ziqi0716 2021-01-27
  • 打赏
  • 举报
回复
你的趋势感念是啥呢?只要你能理清楚你要的是什么,就能写出对应的算法来.
MichaelGLX 2021-01-26
  • 打赏
  • 举报
回复
每组数据对比每相邻几个数据的变化量,找出最大变化值,, 比较 这几组数据的最大变化值不就出来了吗?(就是对比台阶式上升的那个点)
wanghui0380 2021-01-26
  • 打赏
  • 举报
回复
因为我们不知道你到底想要什么,只能尽量给点靠边的猜测和可以用工具 https://blog.csdn.net/qq_19600291/article/details/101010249 比如这篇文章是“移动平均滤波”,如果要完成这种东西,mathnet ,AccordNET这两个工具包我们都可以完成这个功能
HC1qq 2021-01-26
  • 打赏
  • 举报
回复
引用 4 楼 晨易夕 的回复:
我的意思是你这个返回的3个系数a0,a1,a2带入计算拟合曲线没 你把拟合曲线和你原曲线对比以下,看看?
这样吗 我之前是直接根据返回的系数来判断的 对这方面不是很明白 原来是我搞错了 拟合曲线和源曲线对比之后 就能得到趋势嘛 我试一试呢 谢谢
wanghui0380 2021-01-26
  • 打赏
  • 举报
回复
引用
现在我需要根据前几条数据的走势来判断当前数据点的状态
我猜你说的是移动均线 这块基本画在“时序信号处理”,当然理论上那玩意有成套理论“差分方程”,“回归趋势”,我估计你也不想看 从描述上,你可能只想简单做一下重采样(移动均线),但我们不知道你具体想干啥,所以只能告诉你可以用的工具类 通常可以用的工具类 1.mathnet -----------信号处理,汉明窗口,重采样,数据拟合,回归预测 2.AccordNET-----------也是一个工具包,不过信号处理这块他放在音频采样部分(因为音频采样其实也是时序信号,这个库把信号处理抽象放在音频的signal信号,complex signal复合信号)
晨易夕 2021-01-26
  • 打赏
  • 举报
回复
我的意思是你这个返回的3个系数a0,a1,a2带入计算拟合曲线没 你把拟合曲线和你原曲线对比以下,看看?
HC1qq 2021-01-26
  • 打赏
  • 举报
回复
引用 2 楼 晨易夕 的回复:
//高斯矩阵 例如:y=a0+a1*x+a2*x*x 这个计算了吗
12行就是组成的二元一次 数据源呀。我理解的话,然后下面就会计算这个矩阵数据
晨易夕 2021-01-26
  • 打赏
  • 举报
回复
//高斯矩阵 例如:y=a0+a1*x+a2*x*x 这个计算了吗
HC1qq 2021-01-26
  • 打赏
  • 举报
回复
我想的还有另外一种解决方案:取一段数据 通过峰值和低谷值来判断曲线 是不是单一走势 然后再设置一个波动区间,过滤小波动,不知道这种思路行不行

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧