libsvm C++での菜鳥レベルの使用
9520 ワード
今回はlibsvmを用いて二分類を行います.
データセットUCIのAdult:http://archive.ics.uci.edu/ml/datasets/Adult
ツール:libsvm
言語:C++
libsvm C++のブログをたくさん見て、糞と同じ人もいます.
この2人のブロガーに感謝します.
https://blog.csdn.net/lhanchao/article/details/53367532
https://blog.csdn.net/zilongreco/article/details/41390385
非常に多くの有用な情報を与えた.
私自身は文章が下手で、自分が意味をはっきり言っていないかもしれませんが、私は確かにみんなに分かち合いたいと思っています.
Libsvm構造体:
中にはsvm_が紹介されていますproblem、svm_Nodeなどの構造体は、とても大きな助けを与えてくれて、改めて感謝します.
C++のlibsvmを使ったコードを書くには、構造体を理解しなければなりません.
次はlibsvmソースコードの中の
svm_Nodeは、フィーチャーのシーケンス番号と値を格納します.indexはシーケンス番号で、値はvalueです.
例を挙げると,2つの特徴1つの結果のデータであり,1つの特徴は1つのnodeに対応する.
svm_problemは特徴全体を格納する構造体である
int lはデータの数で、あなたが何個のデータを持っているかです.yは各データの分類結果である.xは2次元配列で、あなたのデータのすべての特徴を詰めています.
二次元配列のような図で言えば、この図の大きなXと大きなYはsvm_です.problemの中のxとy.
分類するのは数歩にほかならない.
1.データのロード
2.洗浄データは正規化などを含む
3.給餌訓練データ訓練
4.予測検証
洗浄コードはPythonで書いたもので、文章の後ろにあります.
準備:
libsvmでまずダウンロードしなければなりませんか?
ダウンロードして、直接それを開けて、中のsvmを見つけます.h、svm-train.c、svm.cpp(これは使わないようです).
他の小さなツールを使うなら、このいくつかのファイルを同じディレクトリにすればいいだけで、どうせファイルを導入するだけで、何も言うことはありません.
VSを使うなら、新しいプロジェクトを作ってsvm.h導入してsvm-train.cとsvm.cppが導入された.
これであなたのプロジェクトはこのようなディレクトリになります.私のプロジェクトの名前はlibsvmです.プレイ、遊びです.
案内してsvmを見つけたcppのmain.
彼のこのmainは、コンソールを使っています.私たちのこのバージョンはコードで直接実行されています.だから、私たちは彼のこのmainを使わないで、直接削除したり注釈したりしません.
そうだVSならpchを使わないほうがいい.h……
コード解析:
データのロードと洗浄のデータコードはPythonで書かれていますが、文章の後では省略します.
洗浄したデータをDataという2次元配列に入れました.
TrainingNumberはトレーニングデータ量、FeatureNumberは特徴数(分類結果を含む).
新しいストレージフィーチャーのx_を先にnewしましたスペース、そしてsvm_problemのポインタがそれを指しているので、もっと便利です.
x_Nodeのindexが-1に等しいと,1つのデータの特徴の入力が終了することを示す.
必ず-1をプラスすることを覚えています!
書類全体を載せて、
コードは少し長くて、その中の肝心なのは私の上のデータをSVMに供給するだけで、train SVMは1つの関数を呼び出すだけでいいです.predictも同様に関数を呼び出すだけで、1行だけです.
添付:
このデータセットは文字型で、C++は相対的に下位の言語なので、pythonでデータ洗浄を行い、データプログラミングがSVMのデータに直接与えることができます.
Pythonコードを置いてください.
データセットUCIのAdult:http://archive.ics.uci.edu/ml/datasets/Adult
ツール:libsvm
言語:C++
libsvm C++のブログをたくさん見て、糞と同じ人もいます.
この2人のブロガーに感謝します.
https://blog.csdn.net/lhanchao/article/details/53367532
https://blog.csdn.net/zilongreco/article/details/41390385
非常に多くの有用な情報を与えた.
私自身は文章が下手で、自分が意味をはっきり言っていないかもしれませんが、私は確かにみんなに分かち合いたいと思っています.
Libsvm構造体:
中にはsvm_が紹介されていますproblem、svm_Nodeなどの構造体は、とても大きな助けを与えてくれて、改めて感謝します.
C++のlibsvmを使ったコードを書くには、構造体を理解しなければなりません.
次はlibsvmソースコードの中の
struct svm_node
{
int index;
double value;
};
struct svm_problem
{
int l;
double *y;
struct svm_node **x;
};
svm_Nodeは、フィーチャーのシーケンス番号と値を格納します.indexはシーケンス番号で、値はvalueです.
例を挙げると,2つの特徴1つの結果のデータであり,1つの特徴は1つのnodeに対応する.
svm_problemは特徴全体を格納する構造体である
int lはデータの数で、あなたが何個のデータを持っているかです.yは各データの分類結果である.xは2次元配列で、あなたのデータのすべての特徴を詰めています.
二次元配列のような図で言えば、この図の大きなXと大きなYはsvm_です.problemの中のxとy.
分類するのは数歩にほかならない.
1.データのロード
2.洗浄データは正規化などを含む
3.給餌訓練データ訓練
4.予測検証
洗浄コードはPythonで書いたもので、文章の後ろにあります.
準備:
libsvmでまずダウンロードしなければなりませんか?
ダウンロードして、直接それを開けて、中のsvmを見つけます.h、svm-train.c、svm.cpp(これは使わないようです).
他の小さなツールを使うなら、このいくつかのファイルを同じディレクトリにすればいいだけで、どうせファイルを導入するだけで、何も言うことはありません.
VSを使うなら、新しいプロジェクトを作ってsvm.h導入してsvm-train.cとsvm.cppが導入された.
これであなたのプロジェクトはこのようなディレクトリになります.私のプロジェクトの名前はlibsvmです.プレイ、遊びです.
案内してsvmを見つけたcppのmain.
彼のこのmainは、コンソールを使っています.私たちのこのバージョンはコードで直接実行されています.だから、私たちは彼のこのmainを使わないで、直接削除したり注釈したりしません.
そうだVSならpchを使わないほうがいい.h……
コード解析:
データのロードと洗浄のデータコードはPythonで書かれていますが、文章の後では省略します.
洗浄したデータをDataという2次元配列に入れました.
TrainingNumberはトレーニングデータ量、FeatureNumberは特徴数(分類結果を含む).
新しいストレージフィーチャーのx_を先にnewしましたスペース、そしてsvm_problemのポインタがそれを指しているので、もっと便利です.
x_Nodeのindexが-1に等しいと,1つのデータの特徴の入力が終了することを示す.
必ず-1をプラスすることを覚えています!
void FeedData(svm_problem *problem){
if (param.gamma == 0) param.gamma = 0.5;
problem->l = TrainingNumber;
problem->y = new double[problem->l];
svm_node *x_space = new svm_node[(FeatureNumber + 1)*problem->l];//to restore feature
problem->x = new svm_node *[problem->l]; //every X points to one sample
int cnt = 0;
for (int i = 0;i < TrainingNumber;i++) {
int before = cnt;
for (int j = 0;j < FeatureNumber-1;j++) {
x_space[cnt].index = j;
x_space[cnt].value = Data[i][j];
cnt++;
}
x_space[cnt].index = -1;
cnt++;
problem->x[i] = &x_space[before];
problem->y[i] = Data[i][FeatureNumber - 1];
}
}
書類全体を載せて、
コードは少し長くて、その中の肝心なのは私の上のデータをSVMに供給するだけで、train SVMは1つの関数を呼び出すだけでいいです.predictも同様に関数を呼び出すだけで、1行だけです.
#include
#include
#include
#include
#include
#include
添付:
このデータセットは文字型で、C++は相対的に下位の言語なので、pythonでデータ洗浄を行い、データプログラミングがSVMのデータに直接与えることができます.
Pythonコードを置いてください.
class Modifier:
def __init__(self):
self.Data=[]
self.RawData=[]
self.NUMOFDATA=0
self.NUMOFFEATURE=0
self.GetClass={}
self.SecondFeatureMin = 12285
self.SecondFeatureMax = 1484705
self.Second = self.SecondFeatureMax - self.SecondFeatureMin
def LoadData(self, PATH):
with open(PATH, 'r') as f:
for line in f:
self.RawData.append([thing.strip() for thing in line.split(',')])
self.RawData = self.RawData[:-1]
self.NUMOFDATA = len(self.RawData)
def ShowRawData(self):
for item in self.RawData:
print(item)
def WashData(self):
attribute = len(self.RawData[0])
# print("attribute: {}".format(attribute))
index = 0
while index < attribute:
# print('index: {}'.format(index))
cnt = 0
temp = [i[index] for i in self.RawData]
for item in temp:
if item not in self.GetClass:
self.GetClass[item] = cnt
cnt += 1
index += 1
self.NUMOFFEATURE = index
# print("feature number is {}.".format(self.NUMOFFEATURE))
for line in self.RawData:
t = []
for j, f in enumerate(line):
if j == 0:
t.append(float(f) / 10)
elif j == 2:
t.append(round(float(f) / self.Second, 4))
elif j == 10 or j == 11:
t.append(float(f) / 2000)
elif j == 12:
t.append(float(f) / 10)
elif j==14:
t.append(self.GetClass[f] )
else:
t.append(self.GetClass[f]/10)
self.Data.append(t)
# print("data length is {}".format(len(self.Data[0])))
def ShowData(self):
for item in self.Data:
print(item)
def WriteData(self,PATH):
with open(PATH,'w') as f:
for item in self.Data:
f.write(','.join([str(i) for i in item])+'
')
if __name__=='__main__':
m=Modifier()
m.LoadData(r"C:\Users\Lenovo\Desktop\adult.csv")
#m.ShowRawData()
m.WashData()
#m.ShowData()
m.WriteData(r"C:\Users\Lenovo\Desktop\adult_new.csv")