报错是因为数据集的问题还是程序出错了

img


import random
from numpy import *

def loadData(fileName):
    dateMat = []; labelMat = []
    fr = open(fileName,encoding='utf-8')
    for line in fr.readlines():
        lineAr = line.strip('\n')
        lineArr = lineAr.split(',')
        dateMat.append([float(lineArr[0]), float(lineArr[1])])
        labelMat.append(float(lineArr[2]))
    return dateMat, labelMat


def selectJrand(i, m):
    j = i
    while (j == i):
        j = int(random.uniform(0,m))
        return j


def clipAlpha(aj, H, L):
    if aj > H:
        aj = H
    if L > aj:
        aj = L
        return aj


def smoSimple(dataMatIn, classLabels, C, toler, maxIter):
    """smoSimple
    Args:
        dataMatIn    数据集
        classLabels  类别标签
        C   松弛变量(常量值),允许有些数据点可以处于分隔面的错误一侧。
            控制最大化间隔和保证大部分的函数间隔小于1.0这两个目标的权重。
            可以通过调节该参数达到不同的结果。
        toler   容错率(是指在某个体系中能减小一些因素或选择对某个系统产生不稳定的概率。)
        maxIter 退出前最大的循环次数
    Returns:
        b       模型的常量值
        alphas  拉格朗日乘子
    """
    dataMatrix = mat(dataMatIn)
    # 矩阵转置 和 .T 一样的功能
    labelMat = mat(classLabels).transpose()  # mat创建矩阵
    m, n = shape(dataMatrix)

    # 初始化 b和alphas(alpha有点类似权重值。)
    b = 0
    alphas = mat(zeros((m, 1)))

    # 没有任何alpha改变的情况下遍历数据的次数
    iter = 0
    while (iter < maxIter):
        # w = calcWs(alphas, dataMatIn, classLabels)
        # print("w:", w)

        # 记录alpha是否已经进行优化,每次循环时设为0,然后再对整个集合顺序遍历
        alphaPairsChanged = 0
        for i in range(m):
            # print 'alphas=', alphas
            # print 'labelMat=', labelMat
            # print 'multiply(alphas, labelMat)=', multiply(alphas, labelMat)
            # 我们预测的类别 y = w^Tx[i]+b; 其中因为 w = Σ(1~n) a[n]*lable[n]*x[n]
            fXi = float(multiply(alphas, labelMat).T * (dataMatrix * dataMatrix[i, :].T)) + b  #T表示转置,决策(拉格朗日)函数
            # 预测结果与真实结果比对,计算误差Ei
            Ei = fXi - float(labelMat[i])

            # 约束条件 (KKT条件是解决最优化问题的时用到的一种方法。我们这里提到的最优化问题通常是指对于给定的某一函数,求其在指定作用域上的全局最小值)
            # 0<=alphas[i]<=C,但由于0和C是边界值,我们无法进行优化,因为需要增加一个alphas和降低一个alphas。
            # 表示发生错误的概率:labelMat[i]*Ei 如果超出了 toler, 才需要优化。至于正负号,我们考虑绝对值就对了。
            '''
            # 检验训练样本(xi, yi)是否满足KKT条件
            yi*f(i) >= 1 and alpha = 0 (outside the boundary)
            yi*f(i) == 1 and 0<alpha< C (on the boundary)
            yi*f(i) <= 1 and alpha = C (between the boundary)
            '''
            if ((labelMat[i] * Ei < -toler) and (alphas[i] < C)) or ((labelMat[i] * Ei > toler) and (alphas[i] > 0)):
                # toler容错率,C松弛变量
                # 如果满足优化的条件,我们就随机选取非i的一个点,进行优化比较
                j = selectJrand(i, m)
                # 预测j的结果
                fXj = float(multiply(alphas, labelMat).T * (dataMatrix * dataMatrix[j, :].T)) + b
                Ej = fXj - float(labelMat[j])
                alphaIold = alphas[i].copy()
                alphaJold = alphas[j].copy()

                # L和H用于将alphas[j]调整到0-C之间。如果L==H,就不做任何改变,直接执行continue语句
                # labelMat[i] != labelMat[j] 表示异侧,就相减,否则是同侧,就相加。
                if (labelMat[i] != labelMat[j]):
                    L = max(0, alphas[j] - alphas[i])
                    H = min(C, C + alphas[j] - alphas[i])
                else:
                    L = max(0, alphas[j] + alphas[i] - C)
                    H = min(C, alphas[j] + alphas[i])
                # 如果相同,就没发优化了
                if L == H:
                    print("L==H")
                    continue

                # eta是alphas[j]的最优修改量,如果eta==0,需要退出for循环的当前迭代过程

                eta = 2.0 * dataMatrix[i, :] * dataMatrix[j, :].T - dataMatrix[i, :] * dataMatrix[i, :].T - dataMatrix[
                                                                                                            j,
                                                                                                            :] * dataMatrix[
                                                                                                                 j, :].T
                if eta >= 0:
                    print("eta>=0")
                    continue

                # 计算出一个新的alphas[j]值
                alphas[j] -= labelMat[j] * (Ei - Ej) / eta
                # 并使用辅助函数,以及L和H对其进行调整
                alphas[j] = clipAlpha(alphas[j], H, L)
                # 检查alpha[j]是否只是轻微的改变,如果是的话,就退出for循环。
                if (abs(alphas[j] - alphaJold) < 0.00001):
                    print("j not moving enough")
                    continue
                # 然后alphas[i]和alphas[j]同样进行改变,虽然改变的大小一样,但是改变的方向正好相反
                alphas[i] += labelMat[j] * labelMat[i] * (alphaJold - alphas[j])
                # 在对alpha[i], alpha[j] 进行优化之后,给这两个alpha值设置一个常数b。
                # w= Σ[1~n] ai*yi*xi => b = yj- Σ[1~n] ai*yi(xi*xj)
                # 所以:  b1 - b = (y1-y) - Σ[1~n] yi*(a1-a)*(xi*x1)
                # 为什么减2遍? 因为是 减去Σ[1~n],正好2个变量i和j,所以减2遍
                b1 = b - Ei - labelMat[i] * (alphas[i] - alphaIold) * dataMatrix[i, :] * dataMatrix[i, :].T - labelMat[
                    j] * (alphas[j] - alphaJold) * dataMatrix[i, :] * dataMatrix[j, :].T
                b2 = b - Ej - labelMat[i] * (alphas[i] - alphaIold) * dataMatrix[i, :] * dataMatrix[j, :].T - labelMat[
                    j] * (alphas[j] - alphaJold) * dataMatrix[j, :] * dataMatrix[j, :].T
                if (0 < alphas[i]) and (C > alphas[i]):
                    b = b1
                elif (0 < alphas[j]) and (C > alphas[j]):
                    b = b2
                else:
                    b = (b1 + b2) / 2.0
                alphaPairsChanged += 1
                print("iter: %d i:%d, pairs changed %d" % (iter, i, alphaPairsChanged))
        # 在for循环外,检查alpha值是否做了更新,如果在更新则将iter设为0后继续运行程序
        # 知道更新完毕后,iter次循环无变化,才推出循环。
        if (alphaPairsChanged == 0):
            iter += 1
        else:
            iter = 0
        print("iteration number: %d" % iter)
    return b, alphas

报错是因为数据集的问题还是程序出错了

从报错信息看 应该是程序的问题

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7680147
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:深入浅出 矩阵特征值 与 特征向量 的物理意义
  • 除此之外, 这篇博客: 爬虫爬取数据出现只有表头或者需要验证的情况中的 问题描述: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 小白在学习爬虫爬取猫眼电影的时候出现了只有空表头的情况:

    学习使用的代码为:

    import requests
    import bs4
    from requests.exceptions import RequestException
    import openpyxl
    
    
    def get_one_page(url, headers):
        try:
            response = requests.get(url, headers=headers)
            if response.status_code == 200:
                return response.text
            return None
        except RequestException:
            return None
    
    
    def parse_one_page(html):
        soup = bs4.BeautifulSoup(html, 'lxml')
        # 获取电影名
        movies = []
        targets = soup.find_all(class_='name')
        for each in targets:
            movies.append(each.get_text())
        # 获取评分
        scores = []
        targets = soup.find_all(class_='score')
        for each in targets:
            scores.append(each.get_text())
        # 获取主演信息
        star_message = []
        targets = soup.find_all(class_='star')
        for each in targets:
            star_message.append(each.get_text().split('\n')[1].strip())
            print(each.get_text().split('\n')[1].strip())
        # 获取上映时间
        play_time = []
        targets = soup.find_all(class_='releasetime')
        for each in targets:
            play_time.append(each.get_text())
        result = []
        length = len(movies)
        for j in range(length):
            result.append([movies[j], scores[j], star_message[j], play_time[j]])
    
        return result
    
    
    def save_to_excel(result):
        wb = openpyxl.Workbook()
        ws = wb.active
        ws['A1'] = '电影名称'
        ws['B1'] = '评分'
        ws['C1'] = '主演'
        ws['D1'] = '上映时间'
        for item in result:
            ws.append(item)
        wb.save('猫眼电影TOP100.xlsx')
    
    
    def main():
        result = []
        for i in range(10):
            headers = {
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
            }
            url = 'http://maoyan.com/board/4?offset=' + str(i * 10)
            html = get_one_page(url, headers)
            result.extend(parse_one_page(html))
        save_to_excel(result)
    
    
    if __name__ == '__main__':
        main()
    

    代码链接:

    https://blog.csdn.net/Waspvae/article/details/80617357?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 循环队列的入队出队扩容操作小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的参考资料和问题描述,我无法确定具体的报错信息或者问题内容。在你遇到报错时,可以尝试以下步骤来解决问题:

    1. 首先,复制报错信息。在控制台或错误日志中查找报错信息,并复制粘贴到问题描述中。这些信息通常包含有关错误类型、错误代码和错误的位置。复制报错信息可以帮助我更好地分析和解决问题。

    2. 排除数据集问题。如果报错与数据集相关,你可以检查数据集的格式、大小和内容是否符合程序的要求。特别注意确保数据集中没有缺失值、空值或异常值,在进行训练或预测时可能导致错误。

    3. 检查程序代码。如果报错是由于程序代码问题导致的,你可以逐步检查代码,确保语法正确、变量命名一致,并检查函数参数的传递是否正确。根据需要,你可以使用调试工具或打印语句来分析程序执行过程中的问题。

    4. 查阅相关文档和资料。如果你遇到了一个特定的编程问题,尝试在官方文档、论坛或其他技术资源中查找解决方案。通常,类似问题的解决方案已经在社区中有人提问并得到解答。

    如果你对问题的具体描述和报错信息进行补充,我将尽力提供更具体的解决方案。