knn分類器實現,執行極慢不推薦;
執行結果:#coding=utf-8
from numpy import *
from scipy import sparse,io
from sklearn.datasets import load_files
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import countvectorizer
from sklearn.feature_extraction.text import tfidfvectorizer
from sklearn.feature_selection import selectkbest, chi2
from sklearn.*****_bayes import multinomialnb
from sklearn.linear_model import logisticregression
from sklearn import neighbors
from sklearn import metrics
from operator import itemgetter
import warnings
warnings.filterwarnings("ignore")
defcalculate_result
(actual,pred):
m_precision = metrics.precision_score(actual,pred)
m_recall = metrics.recall_score(actual,pred)
m_acc = metrics.accuracy_score(actual,pred)
'predict info:'
'accuracy:'.format(m_acc)
'precision:'.format(m_precision)
'recall:'.format(m_recall)
'f1-score:'.format(metrics.f1_score(actual,pred))
deftext_classsfier
(train_dir,test_dir):
#load datasets
doc_train = load_files(train_dir)
doc_test = load_files(test_dir)
#切分資料集,由於有單獨的測試集,故省略
#doc_terms_train, doc_terms_test, doc_class_train, doc_class_test = train_test_split(doc_train.data, doc_train.target, test_size = 0.2)
#呼叫vectorizer提取文字特徵
#bool型特徵(one-hot)
#count_vec = countvectorizer(binary = true,decode_error='replace')
#tf-idf特徵(詞頻)
count_vec = tfidfvectorizer(min_df=1,decode_error='replace')
doc_train_bool = count_vec.fit_transform(doc_train.data)
doc_test_bool = count_vec.transform(doc_test.data)
#呼叫knn分類器**分類
predicted =
test = doc_test_bool.toarray()
for i in doc_test.target:
print i,
for i in xrange(shape(test)[0]):
x = classify(test[i], doc_train_bool.toarray(), doc_train.target,10)
print x,
#計算分類準確度資訊
calculate_result(doc_test.target,predicted)
#儲存分類結果
file_o = open('result_knn.txt', 'w')
file_o.write(str(predicted))
#knn分類器,使用歐式距離度量,未使用kd樹
defclassify
(inx, dataset, labels, k):
datasetsize = dataset.shape[0]
diffmat = tile(inx, (datasetsize,1)) - dataset#將陣列a作為元素構造m行n列的陣列
#以矩陣為單位計算距離
sqdiffmat = diffmat**2
sqdistances = sqdiffmat.sum(axis=1)#(axis=1)按行累加
distances = sqdistances**0.5
sorteddistindicies = distances.argsort()#每個元素的排序序號
classcount = {}#sorteddistindicies[0]表示排序後排在第乙個的那個數在原來陣列中的下標
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
classcount[voteilabel] = classcount.get(voteilabel,0) + 1
#獲取key對應的value,沒有key返回0
sortedclasscount = sorted(classcount.iteritems(), key=itemgetter(1), reverse=true)#按照value逆向排序
return sortedclasscount[0][0]
if __name__ == '__main__':
text_classsfier('training','test')
accuracy
:0.811
precision
:0.816
recall
:0.811
f1-score
:0.808
文字分類學習(一) 開篇
今天開始,就要認真開始對待文字分類,在此之前只是稀疏的看過一些部落格,了解一下貝葉斯分類。之所以要學習文字分類,是因為我做的畢業設計就是關於文字分類和機器學習的。突然感覺到時間不太夠用了,而擺在我面前的實際上是乙個很浩大的工程,不得不抓緊時間開始研究。至於為什麼畢業設計會選擇文字分類演算法,因為覺得...
文字分類學習(一) 開篇
今天開始,就要認真開始對待文字分類,在此之前只是稀疏的看過一些部落格,了解一下貝葉斯分類。之所以要學習文字分類,是因為我做的畢業設計就是關於文字分類和機器學習的。突然感覺到時間不太夠用了,而擺在我面前的實際上是乙個很浩大的工程,不得不抓緊時間開始研究。至於為什麼畢業設計會選擇文字分類演算法,因為覺得...
文字分類學習(六) AdaBoost和SVM
直接從特徵提取,跳到了boostsvm,是因為自己一直在寫程式,分析垃圾文字,和思考文字分類用於識別垃圾文字的短處。自己學習文字分類就是為了識別垃圾文字。中間的部落格待自己研究透徹後再補上吧。因為獲取垃圾文字的時候,發現垃圾文字不是簡單的垃圾文字,它們具有多個特性 1.種類繁多,難有共同的特徵。涵蓋...