这是一个创建于 3370 天前的主题,其中的信息可能已经有所发展或是发生改变。
不懂java,现在要将一些代码转成其他语言。有些地方搞不明白。
public class LogisticRegression {
public int N;
public int n_in;
public int n_out;
public double[][] W;
public double[] b;
public LogisticRegression(int N, int n_in, int n_out) {
//.......
}
public void train(int[] x, int[] y, double lr) {
double[] p_y_given_x = new double[n_out];
double[] dy = new double[n_out];
for(int i=0; i<n_out; i++) {
p_y_given_x[i] = 0;
for(int j=0; j<n_in; j++) {
p_y_given_x[i] += W[i][j] * x[j];
}
p_y_given_x[i] += b[i];
}
softmax(p_y_given_x); // ① ? ? ?
for(int i=0; i<n_out; i++) {
dy[i] = y[i] - p_y_given_x[i];
for(int j=0; j<n_in; j++) {
W[i][j] += lr * dy[i] * x[j] / N;
}
b[i] += lr * dy[i] / N;
}
}
public void softmax(double[] x) { // ② ? ? ?
double max = 0.0;
double sum = 0.0;
for(int i=0; i<n_out; i++) {
if(max < x[i]) {
max = x[i];
}
}
for(int i=0; i<n_out; i++) {
x[i] = Math.exp(x[i] - max);
sum += x[i];
}
for(int i=0; i<n_out; i++) {
x[i] /= sum;
}
}
}
上述 softmax 这个方法没有返回值,也没修改类的任何属性值。那这个方法的对外作用是什么?
在①处的调用,意思是什么?是以 p_y_given_x 这个变量为参数,然后执行结果也赋值给 p_y_given_x 了吗?
5 条回复 • 2015-08-04 17:00:24 +08:00
|
|
1
liprais 2015-08-04 00:22:14 +08:00
p_y_given_x是个数组吧 执行前后打出来看看有没有变不就知道了
|
|
|
2
dotCom 2015-08-04 00:54:05 +08:00 1
①处的调用传入p_y_given_x所引用的数组(相当于指针),所以这个方法里的操作是直接施加在该数组上的。
|
|
|
3
SoloCompany 2015-08-04 00:57:59 +08:00 1
卧槽 不用 markdown 这空格是咋加上去的 黑魔法么
原来是全角空格。。。。
|
|
|
5
leolusir 2015-08-04 17:00:24 +08:00 1
softmax方法修改了传入数组中元素的值,里面先求出最大值,再将每个值与最大值作差,结果作为自然数 e 的次方得出的值赋给本身,sum此时会变成新数组各元素之和,最后再将新数组每个元素除以sum得到的值再次赋给本身,又得到一个新的数组,可能讲的优点乱,注意到传入到这个方法的数组,内部各元素值会经过一系列运算被修改,得到一串新的元素
|