MemoryError, это только потому, что оперативная память или вложенный для - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть исследование о кластеризации данных NSL KDD с использованием DBSCAN в python.Когда я пытаюсь запустить программу с лимитом 10.000 данных, он говорит MemoryError, в то время как при запуске всех данных (NSL KDD имеет 125.973 строк, 41 столбец), он говорит что-то вроде достигнутого максимального размера.Это просто потому, что вопрос спецификации компьютера (я использую 8 ГБ ОЗУ) или вопрос кода?Как это решить?Наконец, как обновить результат кластера каждой строки для сохранения в MySQL?Я новичок на питоне, извините, если вы подумали, что я задаю глупый вопрос

def set2List(NumpyArray):
    list = []
    for item in NumpyArray:
        list.append(item.tolist())
    return list 

def GenerateData():
    mydb = pymysql.connect(
    host="localhost",user="root", password="", database="ta")
    mycursor = mydb.cursor()
    mycursor.execute("SELECT * FROM data_trans LIMIT 10000")
    myresult = mycursor.fetchall() 
    final_result= numpy.array(myresult)
    return final_result

def DBSCAN(Dataset, Epsilon,MinumumPoints,DistanceMethod = 'euclidean'):

    m,n=Dataset.shape
    Visited=numpy.zeros(m,'int')
    Type=numpy.zeros(m)

    ClustersList=[]
    Cluster=[]
    PointClusterNumber=numpy.zeros(m)
    PointClusterNumberIndex=1
    PointNeighbors=[]
    DistanceMatrix = scipy.spatial.distance.squareform(scipy.spatial.distance.pdist(Dataset, DistanceMethod))
    for i in xrange(m):
       if Visited[i]==0:
          Visited[i]=1
          PointNeighbors=numpy.where(DistanceMatrix[i]<Epsilon)[0]
          if len(PointNeighbors)<MinumumPoints:
            Type[i]=-1
          else:
            for k in xrange(len(Cluster)):
                Cluster.pop()
            Cluster.append(i)
            PointClusterNumber[i]=PointClusterNumberIndex               

            PointNeighbors=set2List(PointNeighbors)    
            ExpandClsuter(Dataset[i], PointNeighbors,Cluster,MinumumPoints,Epsilon,Visited,DistanceMatrix,PointClusterNumber,PointClusterNumberIndex  )
            Cluster.append(PointNeighbors[:])
            ClustersList.append(Cluster[:])
            PointClusterNumberIndex=PointClusterNumberIndex+1

     return PointClusterNumber 

 def ExpandClsuter(PointToExapnd, PointNeighbors, Cluster, MinumumPoints, Epsilon, Visited, DistanceMatrix, PointClusterNumber, PointClusterNumberIndex  ):
     Neighbors=[] 
     for i in PointNeighbors:
       if Visited[i]==0:
         Visited[i]=1
         Neighbors=numpy.where(DistanceMatrix[i]<Epsilon)[0]
         if len(Neighbors)>=MinumumPoints: 
            for j in Neighbors:
                try:
                    PointNeighbors.index(j)
                except ValueError:
                    PointNeighbors.append(j)

         if PointClusterNumber[i]==0:
            Cluster.append(i)
            PointClusterNumber[i]=PointClusterNumberIndex
return

Data=GenerateData()

fig = plt.figure()
ax1=fig.add_subplot(2,1,1) #row, column, figure number

ax1.scatter(Data[:,0],Data[:,1], alpha =  0.5 ) 

Epsilon=300
MinumumPoints=50
result =DBSCAN(Data,Epsilon,MinumumPoints) 
print result     
plt.show()

Сообщение об ошибке:

Traceback (most recent call last):

File "<ipython-input-8-20458e6efb7c>", line 1, in <module>
runfile('C:/Users/Ji Min/Downloads/oprek.py', wdir='C:/Users/Ji Min/Downloads')

File "C:\Users\Ji Min\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
execfile(filename, namespace)

File "C:\Users\Ji Min\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 87, in execfile
exec(compile(scripttext, filename, 'exec'), glob, loc)

File "C:/Users/Ji Min/Downloads/oprek.py", line 95, in <module>
result =DBSCAN(Data,Epsilon,MinumumPoints)

File "C:/Users/Ji Min/Downloads/oprek.py", line 44, in DBSCAN
DistanceMatrix = scipy.spatial.distance.squareform(scipy.spatial.distance.pdist(Dataset, DistanceMethod))

File "C:\Users\Ji Min\Anaconda2\lib\site-packages\scipy\spatial\distance.py", line 1652, in pdist
dm = np.empty((m * (m - 1)) // 2, dtype=np.double)

MemoryError

1 Ответ

0 голосов
/ 01 октября 2018

Ключ в том, чтобы не вычислять матрицу расстояний .

Матрицам расстояний требуется слишком много памяти.

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

...