簡體   English   中英

用matplotlib繪制兩種不同的SVM方法時出現問題嗎?

[英]problems plotting two different SVMs approaches with matplotlib?

我想將分類算法的兩種不同方法作為此文檔示例 這是我嘗試的:

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
tfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True, sublinear_tf=False, ngram_range=(2,2))

import pandas as pd
df = pd.read_csv('/data.csv',
                     header=0, sep=',', names=['SentenceId', 'Sentence', 'Sentiment'])



X = tfidf_vect.fit_transform(df['Sentence'].values)
y = df['Sentiment'].values


from sklearn import cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,
                                                    y, test_size=0.33)
from sklearn.svm import SVC
#first svm
clf = SVC(kernel='linear')
clf.fit(reduced_data, y)
prediction = clf.predict(X_test)
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-10, 10)
yy = a * xx - clf.intercept_[0] / w[1]


# get the separating hyperplane using weighted classes

#second svm
wclf = SVC(kernel='linear', class_weight={5: 10},C=1000)
wclf.fit(reduced_data, y)
weighted_prediction = wclf.predict(X_test)



#PCA
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)


ww = wclf.coef_[0]
wa = -ww[0] / ww[1]
wyy = wa * xx - wclf.intercept_[0] / ww[1]

# plot separating hyperplanes and samples
import matplotlib.pyplot as plt
h0 = plt.plot(xx, yy, 'k-', label='no weights')
h1 = plt.plot(xx, wyy, 'k--', label='with weights')
plt.scatter(reduced_data[:, 0], reduced_data[:, 1], c=y, cmap=plt.cm.Paired)
plt.legend()

plt.axis('tight')
plt.show()

但是我得到以下異常:

Traceback (most recent call last):
  File "file.py", line 25, in <module>
    a = -w[0] / w[1]
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 253, in __getitem__
    return self._get_row_slice(row, col)
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 320, in _get_row_slice
    raise IndexError('index (%d) out of range' % i)
IndexError: index (1) out of range

如何使用matplotlib在2-D或3-D中正確繪制此任務? 我也嘗試過,但是顯然這是錯誤的:

在此處輸入圖片說明

在此先感謝您,這是我正在使用的數據

當我打印w ,會發生以下情況:

     (0, 911)   -0.352103548716
    a = -w[0] / w[1]
  (0, 2346) -1.20396753467
  File "/usr/local/lib/python2.7/site-packages/scipy/sparse/csr.py", line 253, in __getitem__
  (0, 2482) -0.352103548716
  (0, 2288) -0.733605938797
  (0, 1175) -0.868966214318
  (0, 1936) -0.500071158622
  (0, 2558) -0.40965370142
  (0, 788)  -0.485330735934
  (0, 322)  -0.575610464517
  (0, 453)  -0.584854414882
  (0, 1913) -0.300076915818
  (0, 2411) -0.419065159403
  (0, 2017) -0.407926583824
  (0, 2363) -0.407926583824
  (0, 815)  -1.09245625795
  (0, 543)  -0.248207856236
  (0, 1082) -0.366433457602
  (0, 1312) -0.286768829333
  (0, 1525) -0.286768829333
  (0, 1677) -0.286768829333
  (0, 2679) -0.688619491265
  (0, 413)  -0.101096807406
  (0, 1322) -0.13561265293
  (0, 1488) -0.120403497624
  (0, 1901) -0.337806267742
  : :
  (0, 1609) 0.100116485705
  (0, 581)  0.276579777388
  (0, 2205) 0.241642287418
  (0, 1055) 0.0166785719624
  (0, 2390) 0.349485515339
  (0, 1866) 0.357035248059
  (0, 2098) 0.296454010725
  (0, 2391) 0.45905660273
  (0, 2601) 0.357035248059
  (0, 619)  0.350880030278
  (0, 129)  0.287439419266
  (0, 280)  0.432180530894
  (0, 1747) -0.172314049543
  (0, 1211) 0.573579514463
  (0, 86)   0.3152907757
  (0, 452)  0.305881204557
  (0, 513)  0.212678772368
  (0, 946)  -0.347372778859
  (0, 1194) 0.298193025133
  (0, 2039) 0.34451957335
  (0, 2483) 0.245366213834
  (0, 317)  0.355996551812
  (0, 977)  0.355996551812
  (0, 1151) 0.284383826645
  (0, 2110) 0.120512273328

它返回了一個非常大的稀疏矩陣。

w = clf.coef_[0]
a = -w[0] / w[1]

看來您的“ w”列表僅包含一個值。 這就是您嘗試訪問第二個索引w [1]時收到錯誤的原因。

如果w是一個稀疏矩陣,則必須這樣訪問它。 嘗試:

a = -w[0,0] / w[0, 1]

盡管我必須警告您:以下用於可視化的示例是一個非常簡單的2D問題。 為了使可視化完全有意義,您必須在可視化問題之前執行降維(例如PCA)。 雖然您顯然可以繪制12k尺寸的前2個坐標,但這些尺寸恰好是最有用的尺寸,實際上是0。

編輯:看着你的w矩陣,這仍然行不通,但至少現在它應該給出除以零的問題,而不是索引超出范圍。 再多考慮一下,我不太確定如何解決您的問題。 如果您的目標是可視化數據,則可以使用PCA首先將數據縮減為2D,然后運行SVM查找分隔符(帶有或不帶有權重),但是SVM參數不太可能會推廣到實際問題。 另一方面,您可以在更高維度上運行SVM,並使用它為PCA中的解決方案着色。 最好的情況是,這將為您提供兩個相當分開的彩色組:在這種情況下,您的SVM確實運行良好,而PCA維護了問題的大部分結構。 但是,如果這兩個條件之一不成立(特別是對於大多數問題而言,后者不太可能成立),則您的顏色將獲得幾乎隨機的圖案。 在這種情況下,您根本無法得出任何結論。

編輯2:我寫了一個簡短的腳本,用於提取2個PCA尺寸並為您繪制它們。 請注意,我沒有減少到2,而是減少到10000,然后提取第一個2。實際上,它並沒有太大的區別(我的代碼效率較低),但是通過這種方式,我可以說明要點:如果縮小到10,000個尺寸,則不會失去代表性,這意味着您有大約2k個無用的尺寸(或更多,沒有嘗試進一步減小PCA)。 但是,減小到2太過分了:那么您將獲得0.07的冪,這太低了,無法執行任何有用的操作。 如您在情節中所見。 請注意,如果放大圖表上的劇烈變化,則PCA減少的前2個成分之間似乎存在線性關系。 不幸的是,我不是一個足夠好的統計學家,不能告訴你這意味着什么。 如果我不得不猜測,我會說您的數據中有很多協方差,但這是黑暗中的全部障礙。

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
tfidf_vect= TfidfVectorizer(use_idf=True, smooth_idf=True, sublinear_tf=False, ngram_range=(2,2))

import pandas as pd
df = pd.read_csv('corpus.txt',
                     header=0, sep=',', names=['SentenceId', 'Sentence', 'Sentiment'])



X = tfidf_vect.fit_transform(df['Sentence'].values)
y = df['Sentiment'].values


from sklearn.decomposition import PCA
pca = PCA(n_components=10000)
reduced = pca.fit_transform(X.toarray())
print sum(pca.explained_variance_ratio_)
print pca.explained_variance_ratio_[0] + pca.explained_variance_ratio_[1]

from matplotlib import pyplot as plt

by_class = {}
for i in range(0, len(y)):
  if not y[i] in by_class:
    by_class[y[i]] = []
  by_class[y[i]].append(reduced[i])

for c in by_class:
  toplt = np.array(by_class[c]).T
  plt.plot(toplt[0], toplt[1], linestyle='', marker='o')

plt.show()

上面的代碼生成的圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM