Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 8

Как взять данные из файла для расчета коэффициента корреляции?

13.11.2014, 16:02. Показов 4127. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро!

Делаю программу расчета коэффициента корреляции. Значения массивов с x и y должны взяты с файла csv. Я не знаю как это сделать, с джавой я недавно знакома. Вот что у меня получилось.


Java
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
import java.util.*;
import java.lang.*;
class NewClass
{
    // private static ArrayList ArrayList;
    // private static double[] x;
    // private static double[] y;
    public static void main(String args[])
    {
 
        // ArrayList myAL = new ArrayList();
 
 
        double r,nr=0,dr_1=0,dr_2=0,dr_3=0,dr=0;
        double xx[],xy[],yy[];
        xx =new double[5];
        xy =new double[5];
        yy =new double[5];
 
        double x[]={44,61,55,63,65},y[]={3.1,3.6,3.8,4.0,4.1};
        ArrayList  = new ArrayList();
 
        double sum_y=0,sum_yy=0,sum_xy=0,sum_x=0,sum_xx=0;
        int i,n=5;
 
 
        for(i=0;i<n;i++)
        {
            xx[i]=x[i]*x[i];
            yy[i]=y[i]*y[i];
        }
        for(i=0;i<n;i++)
        {
            sum_x+=x[i];
            sum_y+=y[i];
            sum_xx+= xx[i];
            sum_yy+=yy[i];
            sum_xy+= x[i]*y[i];
        }
        nr=(n*sum_xy)-(sum_x*sum_y);
        double sum_x2=sum_x*sum_x;
        double sum_y2=sum_y*sum_y;
        dr_1=(n*sum_xx)-sum_x2;
        dr_2=(n*sum_yy)-sum_y2;
        dr_3=dr_1*dr_2;
        dr=Math.sqrt(dr_3);
        r=(nr/dr);
        String s = String.format("%.2f",r);
        if (r > 0.85){
            System.out.println(" Classificator:"+r);
        }
        if (r < 0.85){
            System.out.println(" Classificator:"+r);
        }
 
        // r = Double.parseDouble(s);
        System.out.println("Total Numbers:"+n+"Correlation Coefficient:"+r);
    }
 
}
И вот есть некий файл...но как совместить все не знаю.

Java
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
 import java.io.IOException;
import com.csvreader.CsvReader;
import com.csvreader.CsvReader;
 
public class NewClass1 {
    public static void main (String[] args) throws IOException{
 
        CsvReader reader = new CsvReader("D:\\Corr.csv");
        reader.setDelimiter(';');
        reader.readHeaders();
 
        while (reader.readRecord())
        {
 
            String P = reader.get("P");
            String Z = reader.get("Z");
            String T = reader.get("T");
            String M = reader.get("M");
 
            // perform program logic here
            System.out.println( P + " " + Z + " "+ T +" " + M +" ");
        }
 
        reader.close();
 
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2014, 16:02
Ответы с готовыми решениями:

Написать функцию для расчета коэффициента корреляции между двумя рандомными последовательностями
Доброго времени суток . Получил задание с программирования написать функцию автокорреляции, которая для каждой фазы последовательности...

Значимость коэффициента корреляции. Как сравнить его с t-критерием Стьюдента?
Как получить t?

Вычисление коэффициента корреляции
Нужна помощь в написании программы на Turbo Pascal-е следующих двух заданий: Буду благодарен...)

13
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
13.11.2014, 16:37
IDSS, а библиотека javacsv у вас подключена в проект?
maven
XML
1
2
3
4
5
<dependency>
    <groupId>net.sourceforge.javacsv</groupId>
    <artifactId>javacsv</artifactId>
    <version>2.0</version>
</dependency>


в первом листинге как минимум ошибка синтаксиса в 21 строке

Java
1
ArrayList /*тут надо вставить имя*/ = new ArrayList();
и не понятно что значит совместить?
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 8
14.11.2014, 13:46  [ТС]
Библиотека подключена. Эти листинги по отдельности работают. Первый код хорошо просчитывает коэффициент корреляции и выводится значение(+ условие), в другом (я написала как пример, чтобы понять как работает считывание значений с csv) идет считывание значений с независмого csv файла. Мне же нужно, чтобы значения для Х и У, что у первому листингу брались с csv файла. Как это написать я не знаю....Мне рекомендовали с ArrayList работать,но как и что я не знаю.
Если посоветуете что-буду рада. Или может примеры есть какие....
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
14.11.2014, 20:23
IDSS,

Java
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
import com.csvreader.CsvReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
class Test {
    static class Data{
        private String p;
        private String z;
        private String t;
        private String m;
 
        public Data() {
        }
 
        public Data(String p, String z, String t, String m) {
            this.p = p;
            this.z = z;
            this.t = t;
            this.m = m;
        }
 
        public String getP() {
            return p;
        }
 
        public String getZ() {
            return z;
        }
 
        public String getT() {
            return t;
        }
 
        public String getM() {
            return m;
        }
 
        public void setP(String p) {
            this.p = p;
        }
 
        public void setZ(String z) {
            this.z = z;
        }
 
        public void setT(String t) {
            this.t = t;
        }
 
        public void setM(String m) {
            this.m = m;
        }
    }
 
    /**
     * Этот метод читает группы данных из файла
     * и помещает из в массив
     * @param fileName имя файла для чтения
     * @return массив с группами данных
     */
    public static List<Data> readData(String fileName) {
        CsvReader reader = null;
        List<Data> array = new ArrayList<>();
        try {
            reader = new CsvReader(fileName);
            reader.setDelimiter(';');
            reader.readHeaders();
            while (reader.readRecord()) {
                // Я так понял, что в файле храняться несколько групп по 4 значения?
                // Тогда создадим класс упаковку для них.
                Data data = new Data();
 
                // Читаем первую группу значений и помещаем их в созданный объект
                // класса "упаковки"
                data.setP(reader.get("P"));
                data.setZ(reader.get("Z"));
                data.setT(reader.get("T"));
                data.setM(reader.get("M"));
 
                // Добавляем полученную группу значений в список
                array.add(data);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }finally {
            if (reader != null)
                reader.close();
        }
        return array;
    }
 
    public static void getCorrelationCoefficient(List<Data> array) {
        // тут уже можно производить расчеты с данными считанными из файла
        // извлекать, например можно так:
 
        //выведем значения первой группы
        System.out.printf(array.get(0).getP() + " " + array.get(0).getZ() + " " +
                array.get(0).getT() + " " + array.get(0).getM() + " ");
 
        //выведем все данные
        for (int i = 0; i < array.size(); i++) {
            System.out.printf(array.get(i).getP() + " " + array.get(i).getZ() + " " +
                    array.get(i).getT() + " " + array.get(i).getM() + " ");
        }
 
    }
 
    public static void main(String[] args) {
        // Читаем данные из файла
        List<Data> array = readData("D:\\Corr.csv");
        // Теперь полученный список данных можно послать в другой метод,
        // что бы произвести с ними какие то действия
        getCorrelationCoefficient(array);
    }
}
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 8
18.11.2014, 13:13  [ТС]
Спасибо огромное! Но все же задаче не решена...
Как через параметр передать извлеченные данные и использовать их в формуле?

double x[]={???????????},y[]={???????????????????};
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
18.11.2014, 13:22
Цитата Сообщение от IDSS Посмотреть сообщение
double x[]={???????????},y[]={???????????????????};
что это и откуда должно браться?
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 8
18.11.2014, 15:46  [ТС]
Это с формулы корреляции. В этом случае просчитывается корреляция между двумя векторами double x[]={44,61,55,63,65},y[]={3.1,3.6,3.8,4.0,4.1};
Вот эта запрограммированная формула. Она просчитывает корреляцию. Но данные должны браться автоматически-доставаться из файла. В файле есть некий вектор-он может быть произвольной длины. от 2 до 15 чисел. Между подобными векторами необходимо просчитать корреляцию. Эта формула работает. Но я не знаю как в эту формулу отправить значения 2 векторов, что находятся в файле.

Java
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
import java.util.*;
import java.lang.*;
class NewClass
{
    
    public static void main(String args[])
    {
  double r,nr=0,dr_1=0,dr_2=0,dr_3=0,dr=0;
        double xx[],xy[],yy[];
        xx =new double[5];
        xy =new double[5];
        yy =new double[5];
 
        double x[]={44,61,55,63,65},y[]={3.1,3.6,3.8,4.0,4.1}; // СДЕСЬ ДОЛЖНЫ БЫТЬ ЧИСЛА,ВЗЯТЫЕ С ФАЙЛА!!!
        double sum_y=0,sum_yy=0,sum_xy=0,sum_x=0,sum_xx=0;
        int i,n=5;
        for(i=0;i<n;i++)
        {
            xx[i]=x[i]*x[i];
            yy[i]=y[i]*y[i];
        }
        for(i=0;i<n;i++)
        {
            sum_x+=x[i];
            sum_y+=y[i];
            sum_xx+= xx[i];
            sum_yy+=yy[i];
            sum_xy+= x[i]*y[i];
        }
        nr=(n*sum_xy)-(sum_x*sum_y);
        double sum_x2=sum_x*sum_x;
        double sum_y2=sum_y*sum_y;
        dr_1=(n*sum_xx)-sum_x2;
        dr_2=(n*sum_yy)-sum_y2;
        dr_3=dr_1*dr_2;
        dr=Math.sqrt(dr_3);
        r=(nr/dr);
        String s = String.format("%.2f",r);
        if (r > 0.85){
            System.out.println(" Classificator:"+r);
        }
        if (r < 0.85){
            System.out.println(" Classificator:"+r);
        }
 
      System.out.println("Total Numbers:"+n+"Correlation Coefficient:"+r);
    }
 
}
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
18.11.2014, 16:41
IDSS, с этим стало понятно...
тогда не понятно с данными из файла...

в вашем примере читается 4 значения

Java
1
2
3
4
            String P = reader.get("P");
            String Z = reader.get("Z");
            String T = reader.get("T");
            String M = reader.get("M");
что из них должно попадать в x[] а что в y[]?

Или в вашем случае в файле всего 2 столбца?
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 8
18.11.2014, 16:47  [ТС]
P Z T M
10 15 44 32

Так выглядит csv файл. P,Z,T,M - есть некие признаки и я их так обозначаю. Их может быть от 2 до 15. По ходу разных "копаний" стало понятно, что не обязательно признаки именовать. На входе должен быть файл в котором имеется ряд чисел (вектор - 10 ,15, 44, 32, ..........). Файл может быть либо *.csv или *.txt.

x[] - это один такой вектор, извлечен с *.csv или *.txt. файла, а y[] - это другой(!!!) такой вектор, между ними находится коэффициент корреляции Пирсона.

Такая вот задача, извините, что сразу все не внятно было написано, я и правда с каждым днем разбираюсь и вот что в результате должно выйти.
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
18.11.2014, 16:59
IDSS, а откуда тогда должен извлекается y[]?

Добавлено через 3 минуты
IDSS, еще будет не плохо если вы прикрепите файл(ы) csv к сообщению
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 8
19.11.2014, 16:40  [ТС]
Векторы одинаковой длины должны быть. Но их размерность может меняться....Тоесть набор признаков может быть не 10 а больше или меньше. Должна быть уникальная программа, которая находит корреляцию между двумя загруженными векторами Х и Y. Потом допустим брать Х и загружать вектор Z. Там план большой. Но для начала хотя бы нужно найти между двумя векторами. А дальше как-то по циклу...
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 8
19.11.2014, 16:48  [ТС]
На сайте нет возможности csv прикрепить, по этому высылаю файлы в таком формате
Вложения
Тип файла: xlsx Вектор Y.xlsx (7.9 Кб, 6 просмотров)
Тип файла: xlsx Вектор Х.xlsx (7.9 Кб, 2 просмотров)
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
19.11.2014, 21:05
IDSS, У вас изначальные косяк с исходным файлом csv.

CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter) — запятой (,).
...то есть, он должен выглядеть так (что бы его мог прочитать тот пример, что вы привели в первом посте):
тыц
Если, все же, необходимо читать значение из двух раз то нужно будет править метод getData()

Code
1
2
3
4
5
6
7
8
9
10
11
x; y
44; 74
55; 83
76; 94
44; 44
32; 32
34; 34
11; 89
14; 14
45; 22
88; 60
и сам код:

Java
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
import com.csvreader.CsvReader;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
/**
 * Created by Igor on 19.11.2014.
 */
public class CorrelationCoefficient {
    private File file;
 
    public CorrelationCoefficient(File file) {
        this.file = file;
    }
 
    public void printCorrelationCoefficient() {
        Double[] x = getData("x");
        Double[] y = getData("y");
 
        double r;
        double nr;
        double dr_1;
        double dr_2;
        double dr_3;
        double dr;
        double[] xx;
        double yy[];
 
        xx = new double[5];
        yy = new double[5];
        double sum_y = 0;
        double sum_yy = 0;
        double sum_xy = 0;
        double sum_x = 0;
        double sum_xx = 0;
 
        int i;
        int n = 5;
 
        for (i = 0; i < n; i++) {
            xx[i] = x[i] * x[i];
            yy[i] = y[i] * y[i];
        }
        for (i = 0; i < n; i++) {
            sum_x += x[i];
            sum_y += y[i];
            sum_xx += xx[i];
            sum_yy += yy[i];
            sum_xy += x[i] * y[i];
        }
        nr = (n * sum_xy) - (sum_x * sum_y);
        double sum_x2 = sum_x * sum_x;
        double sum_y2 = sum_y * sum_y;
        dr_1 = (n * sum_xx) - sum_x2;
        dr_2 = (n * sum_yy) - sum_y2;
        dr_3 = dr_1 * dr_2;
        dr = Math.sqrt(dr_3);
        r = (nr / dr);
 
        if (r > 0.85) {
            System.out.println("Classifier: " + r);
        }
        if (r < 0.85) {
            System.out.println("Classifier: " + r);
        }
 
        System.out.println("Total Numbers: " + n + ";" + " Correlation Coefficient: " + r);
    }
 
    private Double[] getData(String columnName) {
        CsvReader reader = null;
        List<Double> list = new ArrayList<>();
 
        try {
            reader = new CsvReader(String.valueOf(file));
            reader.setDelimiter(';');
            reader.readHeaders();
            while (reader.readRecord()) {
                list.add(Double.valueOf(reader.get(columnName)));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } finally {
            if (reader != null)
                reader.close();
        }
        return list.toArray(new Double[list.size()]);
    }
 
    public static void main(String[] args) {
        File file = new File("D:\\corr.csv");
        CorrelationCoefficient coefficient = new CorrelationCoefficient(file);
        coefficient.printCorrelationCoefficient();
 
    }
}
Вложения
Тип файла: zip corr.zip (214 байт, 18 просмотров)
0
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 8
25.11.2014, 17:09  [ТС]
Спасибо, большое! Вы мне очень помогли!
Но вот да я пытаюсь все же прочитать значения х и y с двух разных файлов - у меня не все получается. Ошибки выдает. Если я Вам не сильно надоела, буду рада если что подскажете.

Добавлено через 6 минут
И еще..обязательно в самом файле писать х, y. Просто на вход мне будут давать большое колличество таких векторов. и врятле они будут именоваться....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2014, 17:09
Помогаю со студенческими работами здесь

Вычисление коэффициента корреляции
Добрый день. Подскажите пожалуйста как найти коэффициент корреляции, если даны 2 массива. Делал по этому примеру. Однако полученные данные...

Вычисление коэффициента взаимной корреляции
Здравствуйте! Помогите, пожалуйста, разобраться с такой задачей: Случайная величина Х равномерно распределена на отрезке . Случайная...

Подсчет коэффициента ранговой корреляции Спирмена
нужна программа для подсчета Коефициента ранговой кореляции Спирмена на C#

Ошибка при нахождении коэффициента корреляции
Здравствуйте! Не могу понять почему выдает ошибку при нахождении коэффициента корреляции двух изображений: ??? Error using ==&gt;...

Парсинг формулы или как взять из TextBox формулу для дальнейшего расчета в программе
Нужно забить формулу в TextBox и посчитать значение функции в точках. Как посчитать разберусь, но как вводить в TextBox формулы вида...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru