libsvm for python学习(2)

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()

所以这个类的重点就在于那些参数了。

你可能感兴趣的:(libsvm for python学习(2))