在实现多特征和多类别的Logistic回归时(我选择的数据集包含1、2、3、4和5五个类别),针对包含1到5类别的m(>100)个样本数据,我尝试找出独特的标签/类别数量,并将它们放入一个向量中。我编写了以下代码,其中Y是一个大小为(m,1)的列向量:
classes = [Y(1,1)]; #初始化类别for i = 2:m count = 0; for j = 1:length(classes) if Y(i,1) == classes(j,1) count = count + 1; end; end if count ==0 classes = [classes; Y(i,1)]; endend
这让我得到了向量Y中独特标签的列表。然而,我在想是否有更好的编写这段代码的方法(上面的代码行看起来有些幼稚),特别是通过向量化来实现。欢迎任何建议。谢谢。
回答:
看起来,如果代码的目的是生成Y中独特值的列表,你可以直接使用unique(Y)
。例如:
>> m = 10;>> Y = floor(rand(m,1)*5+1)Y = 5 1 5 4 2 2 1 5 1 4>> unique(Y)ans = 1 2 4 5
现在,你的函数输出按照它们首次出现在列表中的顺序排列。例如:
classes = 5 1 4 2
如果这很重要,你需要像这样做:
>> [sortedClasses idx] = unique(Y,"first")sortedClasses = 1 2 4 5idx = 2 5 4 1>> unsortedClasess = Y(sort(idx))unsortedClasess = 5 1 4 2
unique
和sort
都很好地进行了向量化处理以提高速度。并且移除classes
的重复扩展可以避免重复的变量复制,这在你有大量类别时会显著降低性能开销。