问题描述
遇到项目,需要把Excel的宏改C#vba里有个trend函数TREND(known_y's,known_x's,new_x's,constant)函数用于执行线性回归。使用最小二乘准则,TREND尝试根据此准则得到最佳拟合。known_y's表示“因变量”的数据,known_x's表示一个或多个“自变量”的数据。TREND帮助文件讨论了可能省略第二个或第三个参数的极少数情况。TREND(known_y's,known_x's,new_x's,constant)参数known_y's、known_x's和new_x's必须是具有相关尺寸的数组或单元格区域。如果known_y's包含1列m行,则known_x's包含c列m行,其中c大于或等于1。请注意,c是预测值变量的数目;m是数据点数目。new_x's必须包含c列r行,其中r大于或等于1。(如果数据排列在行中而不是排列在列中,则必须保持类似的尺寸关系。)constant是一个逻辑参数,必须设置为TRUE或FALSE(或者0或1,Excel分别将其解释为FALSE或TRUE。)TREND的最后三个参数都是可选的;有关省略第二个参数、第三个参数或将这两个参数都省略掉的选项.对这个线性回归很是迷糊,不知道c#里该怎么实现这个算法。网上也找了资料,但是算出来结果都不对。请高手给个代码参考。。感激不尽!
解决方案
解决方案二:
解决方案三:
http://stackoverflow.com/questions/7437660/how-do-i-recreate-an-excel-formula-which-calls-trend-in-c
解决方案四:
引用2楼caozhy的回复:
http://stackoverflow.com/questions/7437660/how-do-i-recreate-an-excel-formula-which-calls-trend-in-c
谢谢版主给的参考。但是TREND(known_y's,known_x's,new_x's,constant)known_x's和new_x's都是单行多列的。不知道怎么弄?烦请指导下
解决方案五:
求解答啊,求解答
解决方案六:
版主给的帖子里不是有老外给出实现方式了吗,实测好用!///<summary>///GetsthevalueatagivenXusingthelineofbestfit(LeastSquareMethod)todeterminetheequation///</summary>///<paramname="points">Pointstocalculatethevaluefrom</param>///<paramname="x">Functioninput</param>///<returns>ValueatXinthegivenpoints</returns>publicstaticfloatLeastSquaresValueAtX(List<PointF>points,floatx){floatslope=SlopeOfPoints(points);floatyIntercept=YInterceptOfPoints(points,slope);return(slope*x)+yIntercept;}///<summary>///Getstheslopeforasetofpointsusingtheformula:///m=∑(x-AVG(x)(y-AVG(y))/∑(x-AVG(x))²///</summary>///<paramname="points">PointstocalculatetheSlopefrom</param>///<returns>SlopeOfPoints</returns>privatestaticfloatSlopeOfPoints(List<PointF>points){floatxBar=points.Average(p=>p.X);floatyBar=points.Average(p=>p.Y);floatdividend=points.Sum(p=>(p.X-xBar)*(p.Y-yBar));floatdivisor=(float)points.Sum(p=>Math.Pow(p.X-xBar,2));returndividend/divisor;}///<summary>///GetstheY-Interceptforasetofpointsusingtheformula:///b=AVG(y)-m(AVG(x))///</summary>///<paramname="points">Pointstocalculatetheinterceptfrom</param>///<returns>Y-Intercept</returns>privatestaticfloatYInterceptOfPoints(List<PointF>points,floatslope){floatxBar=points.Average(p=>p.X);floatyBar=points.Average(p=>p.Y);returnyBar-(slope*xBar);}