title: Sklearn AffinityPropagation MemoryError
body: <p>I think I already know my answer but there's a lot smarter and experienced people out there than me so I wanted to ask.</p>
  
  <p>I'm running into <code>MemoryError</code> when trying to fit my <code>hash_matrix</code> (<code>&lt;class 'scipy.sparse.csr.csr_matrix'&gt;</code>) to <code>AffinityPropagation</code>.  It's failing on just 10,000 samples which is relatively small in the scope of my actual dataset.</p>
  
  <p><strong>My problem</strong>: I like the results I'm seeing from <code>AffinityPropagation</code> on smaller datasets but it's useless unless I am able to apply it to my larger dataset.</p>
  
  <p><strong>My question</strong>: Is trying to fit AffinityPropagation on hundreds of thousands of items not likely to happen on a standard laptop?</p>
  
  <p><strong>What I've learned:</strong></p>
  
  <ol>
  <li><code>AffinityPropagation</code> <a href="http://scikit-learn.org/stable/modules/scaling_strategies.html#incremental-learning" rel="noreferrer">does not support</a> <code>partial_fit</code> and incremental learning.</li>
  <li><a href="http://scikit-learn.org/stable/modules/clustering.html#affinity-propagation" rel="noreferrer">time complexity</a> is a main drawback of <code>AffinityPropagation</code></li>
  <li><code>Affinity Propagation [is] most appropriate for small to medium sized datasets.</code></li>
  </ol>
  
  <p>The error thrown:</p>
  
  <pre><code>Traceback (most recent call last):
    File "C:/Users/my.name/Documents/my files/Programs/clustering_test/SOexample.py", line 68, in &lt;module&gt;
      aff.fit(hash_matrix)
    File "C:\Python34\lib\site-packages\sklearn\cluster\affinity_propagation_.py", line 301, in fit
      copy=self.copy, verbose=self.verbose, return_n_iter=True)
    File "C:\Python34\lib\site-packages\sklearn\cluster\affinity_propagation_.py", line 105, in affinity_propagation
      S += ((np.finfo(np.double).eps * S + np.finfo(np.double).tiny * 100) *
  MemoryError
  </code></pre>
  
  <p>Full working code example:</p>
  
  <pre><code>import pandas as pd
  import numpy as np
  
  from nltk.stem import PorterStemmer
  
  from sklearn.feature_extraction.text import HashingVectorizer
  from sklearn import cluster
  
  data = ['10 news headlines', '3 current events in the news today',
   '5 day break in new york', '7 breaking news', '7 news breaking news',
   '7 news headlines', '7 news online', '7 news today', 'america current news',
   'america new york time', 'america news latest', 'america news online',
   'america news paper', 'america news today', 'america recent news',
   'american news channel', 'american news channels', 'any news today',
   'article about new york', 'article about new york city',
   'article in newspaper today', 'article news today', 'article today news',
   'articles about new york', 'articles on new york', 'articles usa',
   'best news channel', 'best news homepage', 'best newspaper websites',
   'big news stories', 'big news stories of 2013', 'break in new york',
   'break news today', 'break to new york', 'breaking cnn news',
   'breaking entertainment news', 'breaking global news', 'breaking headlines',
   'breaking international news', 'breaking international news today',
   'breaking latest news', 'breaking nation news', 'breaking new cnn',
   'breaking new for today', 'breaking new of today', 'breaking new today',
   'breaking news', 'breaking news america today',
   'breaking news and top stories', 'breaking news around the world',
   'breaking news around the world today', 'breaking news brooklyn',
   'breaking news cnn', 'breaking news cnn alerts', 'breaking news cnn live',
   'world important news today', 'world latest breaking news',
   'world latest news', 'world latest news headlines', 'world latest news today',
   'world latest news update', 'world latest news updates', 'world new headlines',
   'world new now', 'world new today', 'world news', 'world news articles',
   'world news articles today', 'world news breaking',
   'world news breaking headlines', 'world news cnn today',
   'world news current events', 'world news events', 'world news for this week',
   'world news for today', 'world news headline', 'world news headlines',
   'world news headlines daily nation', 'world news headlines today live',
   'world news highlights', 'world news latest headlines', 'world news now',
   'world news now cnn', 'world news recent', 'world news report',
   'world news sites', 'world news sources', 'world news stories',
   'world news today', 'world news today 2014', 'world news today cnn',
   'world news today headlines', 'world news today live',
   'world news today video', 'world news update', 'world news update today',
   'world news updates', 'world news updates today', 'world news video',
   'world news videos', 'world news website', 'world news websites',
   'world newspaper', 'world newspaper articles', 'world newspaper online',
   'world recent news', 'world times news', 'world today news', 'world top news',
   'world top news today', 'world updated news', 'world wide latest news',
   'world wide news today', 'worlds news', 'worlds news headlines',
   'worlds news today', 'worldwide breaking news', 'worldwide news today',
   'www.headline news today', 'www.headlines news', 'www.news headlines today',
   'www.news today.in', 'www.today news paper.com', 'www.todays news headlines',
   'www.todays news headlines.com', 'www.todays news.com',
   'www.world latest news']
  
  #data = pd.read_csv('myfile.csv')['SomeColumn'].drop_duplicates().reset_index(drop=True).to_frame()[:10000]
  #data.columns = ['Keyword']
  #data = data['Keyword'].tolist()
  
  stemmer = PorterStemmer()
  
  stemmed_data = [stemmer.stem_word(word) for word in data]
  
  hasher = HashingVectorizer(stop_words='english', ngram_range=(1,2), analyzer='word')
  hash_matrix = hasher.transform(stemmed_data)
  
  aff = cluster.AffinityPropagation()
  aff.fit(hash_matrix)
  
  df = pd.DataFrame({'Keyword': data, 'Cluster': aff.labels_.tolist()})
  grouped = df.groupby('Cluster').apply(lambda frame: frame['Keyword']).reset_index(1, drop=True).to_frame('Keyword')
  </code></pre>