Java 如何为线性回归得到斜率的正确变化量?

Java 如何为线性回归得到斜率的正确变化量?,java,processing,linear-regression,gradient-descent,Java,Processing,Linear Regression,Gradient Descent,我想编程一个带处理的线性回归。但我搞混了哪些参数需要乘以,然后从斜率中加减 我试图改变参数(使其为负值,改变学习率)。b确实起作用,但是我有一些问题要解决 //数据 float[]P1={100100}; float[]P2={200300}; float[]P3={300250}; float[]allData={P1,P2,P3}; //随机起始值 浮动w1=随机(0,3); 浮动b=随机(-100100); 浮动学习率=0.01; int i=0; 无效设置(){ 尺寸(10001000)

我想编程一个带处理的线性回归。但我搞混了哪些参数需要乘以,然后从斜率中加减

我试图改变参数(使其为负值,改变学习率)。b确实起作用,但是我有一些问题要解决

//数据
float[]P1={100100};
float[]P2={200300};
float[]P3={300250};
float[]allData={P1,P2,P3};
//随机起始值
浮动w1=随机(0,3);
浮动b=随机(-100100);
浮动学习率=0.01;
int i=0;
无效设置(){
尺寸(10001000);
}
作废提款(){
背景(255);
轴();
//抽签

对于(int j=0;j而言,线性回归基于以下形式的a方程

条款

应该计算直线方程相对于采样点的误差,但您的计算是错误的

恒定误差(
b
error)是样本y坐标和由样本x坐标上的直线方程计算的y坐标的差值。
线性误差(
w1
error)由梯度差计算。梯度差是高度和宽度(y/x)的商,而不是乘积。
这意味着计算必须:

dcost\u dreg+=(Y目标Y回归);
dcost_dtar+=(Y目标Y回归)/点[0];
表情

计算样本的平均误差,并通过考虑学习率对直线方程进行校正

更改函数
draw
,以解决问题:

void draw(){
背景(255);
轴();
//抽签
对于(int j=0;j)绘制轴和当前直线方程:

void linearPoints(浮点w1,浮点b){
冲程重量(3);
冲程(100100255);
浮动x0=宽度;
浮动x1=宽度;
浮动y0=x0*w1+b;
浮动y1=x1*w1+b;
线(x0+宽度/2,-y0+高度/2,x1+宽度/2,-y1+高度/2);
}
空心轴(){
冲程重量(1);
冲程(255100,0);
行(0,高度/2,宽度,高度/2);
线条(宽度/2,0,宽度/2,高度);
}

感谢您的快速响应!@rabbi76我试过这么做,但没有成功…我使用了P1(100100)、P2(200200)和P3(300300)点。因此,我可以清楚地看到它是否有效。我还打印了线性回归的成本,开始它似乎变小了,但随后它又开始增长。我的线性回归开始翻转,并得到负斜率。@enwo02我无法复制此结果。但您可以尝试
dcost\u dtar+=(yTarget yRegression+b)/point[0];
y = w1 * x + b
dcost_dreg += -2*(yRegression-yTarget); 
dcost_dtar += -2*(yRegression-yTarget)*point[0];
w1 += learningRate * (dcost_dtar/allData.length);
b  += learningRate * (dcost_dreg/allData.length);