from numpy import *
def loadSimData():
dataMat=matrix([[1.,2.1],[2.,1.1],[1.3,1.],[1.,1.],[2.,1.]])
classLabels=[1.0,1.0,-1.0,-1.0,1.0]
return dataMat,classLabels
def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):
retArray = ones((shape(dataMatrix)[0], 1))
if threshIneq == 'lt': # 如果分类标志为'lt',则分类规则:小于等于阈值,归类到-1
retArray[dataMatrix[:, dimen] <= threshVal] = -1.0 # 如果小于阈值,则赋值为-1
else:
retArray[dataMatrix[:, dimen] > threshVal] = -1.0 # 如果大于阈值,则赋值为-1
return retArray
def buildStump(dataArr, classLabels, D):
dataMatrix = mat(dataArr);
labelMat = mat(classLabels).T
m, n = shape(dataMatrix)
numSteps = 10.0;
bestStump = {};
bestClasEst = mat(zeros((m, 1))) # 初始化步长,最佳单层决策树,最佳分类结果
minError = float('inf') # 最小误差初始化为无穷大
for i in range(n):
rangeMin = dataMatrix[:, i].min();
rangeMax = dataMatrix[:, i].max() # 找到特征中最小的值和最大值
stepSize = (rangeMax - rangeMin) / numSteps # 计算步长
for j in range(-1, int(numSteps) + 1):
for inequal in ['lt', 'gt']: # 大于和小于的情况,均遍历
threshVal = (rangeMin + float(j) * stepSize) # 计算阈值
predictedVals = stumpClassify(dataMatrix, i, threshVal, inequal) # 计算分类结果
errArr = mat(ones((m, 1))) # 初始化误差矩阵
errArr[predictedVals == labelMat] = 0 # 分类正确的,赋值为0
weightedError = D.T * errArr # 计算误差
print("split: dim %d, threshVal %.2f, thresh ineqal: %s, the weighted error is %.3f" % (
i, threshVal, inequal, weightedError))
if weightedError < minError: # 找到误差最小的分类方式
minError = weightedError
bestClasEst = predictedVals.copy()
bestStump['dim'] = i
bestStump['thresh'] = threshVal
bestStump['ineq'] = inequal
return bestStump, minError, bestClasEst
D=mat(ones((5,1))/5)
datMat,classLabels=adaboost.loadSimData()
adaboost.buildStump(datMat,classLabels,D)
一样的数据为什么我的输出结果和书上不一样
问题出现在buildStump函数的最后。你的return语句在for循环内部,而应该在for循环结束后才返回最终的结果。
拉长缩进你看看
def buildStump(dataArr, classLabels, D):
dataMatrix = mat(dataArr)
labelMat = mat(classLabels).T
m, n = shape(dataMatrix)
numSteps = 10.0
bestStump = {}
bestClasEst = mat(zeros((m, 1))) # 初始化步长,最佳单层决策树,最佳分类结果
minError = float('inf') # 最小误差初始化为无穷大
for i in range(n):
rangeMin = dataMatrix[:, i].min()
rangeMax = dataMatrix[:, i].max() # 找到特征中最小的值和最大值
stepSize = (rangeMax - rangeMin) / numSteps # 计算步长
for j in range(-1, int(numSteps) + 1):
for inequal in ['lt', 'gt']: # 大于和小于的情况,均遍历
threshVal = (rangeMin + float(j) * stepSize) # 计算阈值
predictedVals = stumpClassify(dataMatrix, i, threshVal, inequal) # 计算分类结果
errArr = mat(ones((m, 1))) # 初始化误差矩阵
errArr[predictedVals == labelMat] = 0 # 分类正确的,赋值为0
weightedError = D.T * errArr # 计算误差
print("split: dim %d, threshVal %.2f, thresh ineqal: %s, the weighted error is %.3f" % (
i, threshVal, inequal, weightedError))
if weightedError < minError: # 找到误差最小的分类方式
minError = weightedError
bestClasEst = predictedVals.copy()
bestStump['dim'] = i
bestStump['thresh'] = threshVal
bestStump['ineq'] = inequal
return bestStump, minError, bestClasEst
model = YOUR_changed_model(**)
问题标题:程序输出与预期结果不相同 问题内容:当使用相同的数据时,为什么我的输出结果与书上的结果不一样?
首先,理解问题的原因可能有多种。以下是一些可能导致输出结果不同的原因以及解决方案:
代码错误:检查你的代码是否有任何语法或逻辑错误。确保你理解代码并正确地实现了所需的功能。使用调试工具或打印语句来帮助你识别问题所在。
数据差异:确保你的输入数据与书上的数据相匹配。检查数据类型、格式和内容是否与书上的示例一致。
算法参数:有些算法可能具有一些可调整的参数,这些参数会影响输出结果。确保你对算法的参数进行了正确的设置,并与书上的示例进行比较。
环境差异:你的程序可能在不同的环境中运行。验证你的程序运行的环境是否与书上的示例环境相同。包括操作系统、库版本等方面。
以下是一个示例解决方案:
# 问题标题:程序输出与预期结果不相同
# 问题内容:当使用相同的数据时,为什么我的输出结果与书上的结果不一样?
# 1. 代码错误:
# 检查你的代码是否有任何语法或逻辑错误。确保你理解代码并正确地实现了所需的功能。使用调试工具或打印语句来帮助你识别问题所在。
def your_function(data):
# 代码逻辑...
pass
# 2. 数据差异:
# 确保你的输入数据与书上的数据相匹配。检查数据类型、格式和内容是否与书上的示例一致。
data = [1, 2, 3, 4, 5]
expected_result = [2, 4, 6, 8, 10]
result = your_function(data)
# 检查结果是否与预期结果相同
if result == expected_result:
print("输出结果与预期结果相同")
else:
print("输出结果与预期结果不相同")
# 3. 算法参数:
# 有些算法可能具有一些可调整的参数,这些参数会影响输出结果。确保你对算法的参数进行了正确的设置,并与书上的示例进行比较。
def your_algorithm(data, parameter):
# 算法逻辑...
pass
# 设置算法参数
parameter = 0.5
result = your_algorithm(data, parameter)
# 检查结果是否与预期结果相同
if result == expected_result:
print("输出结果与预期结果相同")
else:
print("输出结果与预期结果不相同")
# 4. 环境差异:
# 你的程序可能在不同的环境中运行。验证你的程序运行的环境是否与书上的示例环境相同。包括操作系统、库版本等方面。
# 检查你的环境和库版本是否与书上的示例环境相同
希望以上的解决方案能够帮助你找到问题所在,如果仍然存在问题,请提供更多详细信息以便我们提供更准确的帮助。