libsvm for python学習(2)

2568 ワード

svm_parameter
構造体でもあり、メンバーはその大きな列のパラメータです.このクラスを初期化するときに主に呼び出される関数はoptionを解析することである.例えば私が呼び出したとき、このような言葉があったかもしれません.
param = svm_parameter('-s 3 -c 5 -h 0')

この文字列はライブラリでoptionと呼ばれ、optionになるのはデフォルト値があるからです.
optionを解析する操作は、switch case文に似ています.
def parse_options(self, options):
	if isinstance(options, list):
		argv = options
	elif isinstance(options, str):
		argv = options.split()
	else:
		raise TypeError("arg 1 should be a list or a str.")
	self.set_to_default_values()
	self.print_func = cast(None, PRINT_STRING_FUN)
	weight_label = []
	weight = []

	i = 0
	while i < len(argv):
		if argv[i] == "-s":
			i = i + 1
			self.svm_type = int(argv[i])
		elif argv[i] == "-t":
			i = i + 1
			self.kernel_type = int(argv[i])
		elif argv[i] == "-d":
			i = i + 1
			self.degree = int(argv[i])
		elif argv[i] == "-g":
			i = i + 1
			self.gamma = float(argv[i])
		elif argv[i] == "-r":
			i = i + 1
			self.coef0 = float(argv[i])
		elif argv[i] == "-n":
			i = i + 1
			self.nu = float(argv[i])
		elif argv[i] == "-m":
			i = i + 1
			self.cache_size = float(argv[i])
		elif argv[i] == "-c":
			i = i + 1
			self.C = float(argv[i])
		elif argv[i] == "-e":
			i = i + 1
			self.eps = float(argv[i])
		elif argv[i] == "-p":
			i = i + 1
			self.p = float(argv[i])
		elif argv[i] == "-h":
			i = i + 1
			self.shrinking = int(argv[i])
		elif argv[i] == "-b":
			i = i + 1
			self.probability = int(argv[i])
		elif argv[i] == "-q":
			self.print_func = PRINT_STRING_FUN(print_null)
		elif argv[i] == "-v":
			i = i + 1
			self.cross_validation = 1
			self.nr_fold = int(argv[i])
			if self.nr_fold < 2:
				raise ValueError("n-fold cross validation: n must >= 2")
		elif argv[i].startswith("-w"):
			i = i + 1
			self.nr_weight += 1
			nr_weight = self.nr_weight
			weight_label += [int(argv[i-1][2:])]
			weight += [float(argv[i])]
		else:
			raise ValueError("Wrong options")
		i += 1

	libsvm.svm_set_print_string_function(self.print_func)
	self.weight_label = (c_int*self.nr_weight)()
	self.weight = (c_double*self.nr_weight)()
	for i in range(self.nr_weight):
		self.weight[i] = weight[i]
		self.weight_label[i] = weight_label[i]

ここから分かるように、受け入れられるoptionフォーマットは文字列またはlistであり、明らかに私の一番上の例は文字列である.
if isinstance(options, list):
	argv = options
elif isinstance(options, str):
	argv = options.split()

このクラスのポイントはパラメータにあります