2015-12-28 2 views
0

У меня есть папка, содержащая 7 подпапок, и каждая подпапка содержит 8 файлов. Вообще у меня есть 56 файлов для набора поездов. Для набора тестов у меня есть папка, которая содержит 7 подпапок, и каждая подпапка содержит 2 файла (обычно 14 файлов для тестового набора). У меня есть еще один файл, который содержит 1000 наиболее распространенных слов набора поездов. Я должен проверить, находятся ли эти 1000 слов в наборе поездов или нет. Если они существуют там, он должен возвращать +1, иначе он должен вернуть -1, чтобы сделать вектор. Затем мне нужно классифицировать тексты с биполярным персептроном (нейронной сетью). Порог составляет 0,1, а скорость обучения - 0,5. Часть после назначения весов не работает. как я могу изменить код?Персептрон, классифицирующий

import os 
file="c:/python34/1000CommonWords.txt" 
folder_path="c:/python34/train" 
def vector (folder_path, file): 
    t=[] 
    vector=[] 
    vector2=[] 
    m=[] 

    for folder in sorted(os.listdir(folder_path)): 
     folder_path1 = os.path.join(folder_path, folder) 
     for folder1 in sorted(os.listdir(folder_path1)): 
      file=os.path.join(folder_path1, folder1) 
      tex = open(file,encoding="utf-8") 
      tex=tex.read().split() 
      t=tex+t 






     with open (file, encoding="utf-8") as f1: 
      f1=f1.read().split() 


      for c in t:  # to make the [1, -1] vector 
       for i in c: 
        for j in f1: 
         if j in i: 
          m.append (+1) 
         else: 
          m.append (-1) 
        vector.append(m) 
        vector2.append(vector) 
        #return vector2 

        w=[[0 for row in range(len(vector2[0][0]))] for clmn in range(7)] # weights 
        b=[0 for wb in range(7)] # bias 
        l=0 
        while l<=1000: 
         w_old=w[:] 
         b_old=b[:] 
         for Class in vector2: 
          for text in Class: 
           node=0 
           while node<7: 
            i=0 
            y_in=0 
            while i<len(text): 
             y_in= text[i]*w[node][i] 
             i+=1 
             y_in=b[node]+y_in 
             if y_in<=-0.1: # activatin function 
              y=-1 
             elif (y_in <=0.1 and y_in>=-0.1): 
              y=0 
             else: 
              y=1 

             if node==vector2.index(Class): 
              target=1 # assign target 
             else: 
              target=-1 

             if target!=y: 
              for j in range(0,len(w[0])): # update weights 
               w[node][j]=w[nod][j]+0.5*text[j]*target 
               b[node]=b[node]+0.5*target 
               # print(len(w)) 
               # print(len(w[0])) 
               node+=1 
               l+=1 
               print (w) 
               print(b) 

имя папки (язык фарси)

[ 'اجتماعی', 'اديان', 'اقتصادی', 'سیاسی', 'فناوري', 'مسائل راهبردي ايران', «ورزشی ']

Каждая папка содержит следующие файлы:

[' 13810320-Txt-0132830_utf.txt ' '13810821-Txt-0172902_utf.txt', '13830627-Txt-0431835_utf.txt',' 13850502- txt-0751465_utf.txt ',' 13850506-txt-0754145_utf.txt ',' 13850723-txt-0802407_utf.txt ',' 13860630-txt-100203 3_utf.txt ',' 13870730-txt-1219770_utf.txt '] [' 13860431-txt-0963964_utf.txt ',' 13860616-txt-0992811_utf.txt ',' 13860625-txt-0997674_utf.txt ',' 13860722- txt-1013944_utf.txt ',' 13860802-txt-1021550_utf.txt ',' 13870329-txt-1149735_utf.txt ',' 13870903-txt-1240455_utf.txt ',' 13871001-txt-1256894_utf.txt '] [' 13860321-txt-0940314_utf.txt ',' 13860930-txt-1055987_utf.txt ',' 13870504-txt-1169324_utf.txt ',' 13880223-txt-1337283_utf.txt ',' 13890626-txt-1614537_utf.txt ',' 13891005-txt-1681151_utf.txt ',' 13891025-txt-1694816_utf.txt ',' 13891224-txt-1732745_utf.txt '] [' 13821109-txt-0342352_utf.txt ',' 13840501-txt-0558076_utf.txt ' , '13840725-txt-0599073_utf.txt', '13850728-txt-0809843_utf.txt', '13850910-txt-0834263_utf.txt', '13871015-txt-1264594_utf.txt', '13880304-txt-1345179_utf.txt' , '13890531-txt-1596470_utf.txt'] ['13850816-txt-0807093_utf.txt', '13850903-txt-0830601_ut f.txt ',' 13851012-txt-0853818_utf.txt ',' 13870605-txt-1185666_utf.txt ',' 13890301-txt-1542795_utf.txt ',' 13890626-txt-1614287_utf.txt ',' 13890716-txt- 1628932_utf.txt ',' 13900115-txt-1740412_utf.txt '] [' 13870521-txt-1177039_utf.txt ',' 13870706-txt-1196885_utf.txt ',' 13870911-txt-1220118_utf.txt ',' 13871029- txt-1273519_utf.txt ',' 13880118-txt-1312303_utf.txt ',' 13880303-txt-1202027_utf.txt ',' 13880330-txt-1132374_utf.txt ',' 13880406-txt-1360964_utf.txt '] [' 13840803-txt-0602704_utf.txt ',' 13841026-txt-0651073_utf.txt ',' 13880123-txt-1315587_utf.txt ',' 13880205-txt-1324336_utf.txt ',' 13880319-txt-1353520_utf.txt ',' 13880621-Txt-1401062_utf.txt», '13890318-Txt-1553380_utf.txt', '13890909-Txt-1665470_utf.txt']

+0

Можете ли вы подробнее рассказать? В чем проблема, которую вы пытаетесь решить? Каковы цели? – Amir

+0

Я не могу классифицировать текст. – vahideh

+0

Итак, вот мое понимание. Для каждого входа у вас есть вектор объектов размером 1000, и вы хотите классифицировать эти векторы на некоторое количество классов. Это правильно? – Amir

ответ

2

Хорошо вот общее правило для любой задачи классификации (в двух словах): для того, чтобы классифицировать ничего (текст , изображение, звук ...) сначала вам нужно извлечь функции из точек данных (в вашем случае каждый текстовый файл). Для вашего случая, функции - это 1000 слов, упомянутых вами. Поэтому каждый вектор функции для каждого учебного случая имеет длину 1000. Затем вы подаете эти примеры в нужную вам модель (любые нейронные сети или любую другую модель), а затем получаете выходы для каждого класса. Здесь вы должны иметь функцию стоимости, которая определяет, сколько выходов вашей модели отклоняются от истинной метки для каждого примера ввода (каждый текстовый файл в вашем случае) и минимизируют функцию стоимости по отношению к параметрам модели.

Существует довольно много реализаций для моделей вашего желания. Когда вы создадите свои векторы объектов, вы можете использовать эти общедоступные реализации.

Линейные нейронные сети тренировали с правилом обучения персептрона: http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html

нейронные сети, использующие другие функции активации и тренировались с градиентного спуска: http://scikit-learn.org/dev/modules/neural_networks_supervised.html

Я предлагаю вам использовать тип нейронных сетей обученного с градиентом descnet, а не с перцептронами нейронных сетей. Перцептроны способны изучать только линейно разделяемый классификатор. Их предположение, что ваши входные данные линейно-разъемные, такие как то, что было показано ниже:

https://upload.wikimedia.org/wikipedia/commons/2/20/Svm_separating_hyperplanes.png

Точки на этом графике являются точками данных. Однако в реальных сценариях большинство точек данных не являются линейно разделяемыми. Просто, чтобы дать вам идею, Спорт текстовые документы могут делиться много слов с социальных документов. Поэтому вам лучше использовать нелинейный классификатор, такой как нейронные сети.

+0

Что вы подразумеваете под линейными и нелинейными нейронными сетями? Я чувствую, что и вы, и инициатор нитей немного нечетко различают персептроны и нейронные сети. Персептрон может только классифицировать данные на основе линейной линии дискриминации. Не стоит ничего, что иногда полезно притворяться, что данные линейно отделимы (даже если это не так) из простоты. – stian

+0

Нейронная сеть состоит из иерархии узлов персептрона и затем может быть использована для перевода/сопоставления/проектирования нелинейно разделяемой задачи на линейно разделяемую, в зависимости от количества скрытых слоев и узлов внутри слоев. – stian

+0

@stian Вы правы. Я ошибся в своих заявлениях. Ну, я хотел бы подчеркнуть и функцию активации скрытых единиц. Извините за неприкосновенность – Amir

Смежные вопросы