def exhSearch(self, trainFeatureName, trainData, trainFeatureList, trainLabel, totalK, creterionFunc): myClassRules = classRules() featureList = [] featureNoList = [] n = len(trainFeatureList) combinationTuples = self.getCombinations(n, totalK) # print len(combinationTuples), type(combinationTuples), type(combinationTuples[0]) combinationList = [list(i) for i in combinationTuples] # print len(combinationList), type(combinationList), type(combinationList[0]), len(combinationList[0]), type(combinationList[0][0]) # featureNoList = [trainFeatureName[i] for i in combinationList[0]] # print featureNoList featureNoList = combinationList[0] featureList = [trainFeatureList[featureNo] for featureNo in featureNoList] maxJ = creterionFunc(myClassRules.DLDA, trainLabel, trainData, featureList) # print maxJ for combination in combinationList[1 : ]: featureList = [trainFeatureList[featureNo] for featureNo in combination] jValue = creterionFunc(myClassRules.DLDA, trainLabel, trainData, featureList) if jValue > maxJ: featureNoList = combination maxJ = jValue featureNameList = [trainFeatureName[i] for i in featureNoList] print 'maxJ when totalK is', totalK, ':', maxJ return featureNameList
def seqFwdSearch(self, trainFeatureName, trainData, trainFeatureList, trainLabel, totalK, creterionFunc): # preserve the original lists thisTrainFeatureName = trainFeatureName thisTrainFeatureList = trainFeatureList myClassRules = classRules() featureList = [] featureNoList = [] k = 0 d = len(trainData) if totalK > d: totalK = d roundNo = 1 while True: # print 'this is', roundNo, 'round' roundNo = roundNo + 1 # classRule, trainLabel, trainData, featureData # print 'calculating maxJ for the first time' # print len(featureList + trainFeatureList[0]) # currentFeatureList = featureList if len(featureList) != 0: # print featureList newFeatureList = [] for feature in featureList: newFeatureList.append(feature) newFeatureList.append(thisTrainFeatureList[0]) maxJ = creterionFunc(myClassRules.DLDA, trainLabel, trainData, newFeatureList) else: maxJ = creterionFunc(myClassRules.DLDA, trainLabel, trainData, [thisTrainFeatureList[0]]) # print len(featureList) # print 'maxJ value is:', maxJ bestFeatureNo = 0 featureNo = 1 for feature in thisTrainFeatureList[1: ]: # print 'doing the feature number:', featureNo, thisTrainFeatureName[featureNo] # print feature if featureNo in featureNoList: # print 'continue' continue # print 'now computing feature number:', featureNo if len(featureList) != 0: newFeatureList = [] for features in featureList: newFeatureList.append(features) newFeatureList.append(feature) jValue = creterionFunc(myClassRules.DLDA, trainLabel, trainData, newFeatureList) else: # print 'no feature yet' jValue = creterionFunc(myClassRules.DLDA, trainLabel, trainData, [feature]) # print 'jValue is:', jValue if jValue > maxJ: maxJ = jValue bestFeatureNo = featureNo # print maxJc featureNo = featureNo + 1 featureNoList.append(thisTrainFeatureName[bestFeatureNo]) featureList.append(thisTrainFeatureList[bestFeatureNo]) del thisTrainFeatureList[bestFeatureNo] del thisTrainFeatureName[bestFeatureNo] # print len(thisTrainFeatureList), len(thisTrainFeatureName) # print featureNoList, featureList if len(featureNoList) == totalK: print 'maxJ when totalK is', totalK, ':', maxJ break return featureNoList