1.1.18. Polynomial regression: extending linear models with basis functions(多项式回归:用基函数展开线性模型)

多项式回归是通过非线性变换扩展线性模型来适应更复杂数据的一种方法。它在保持快速计算速度的同时,能够捕捉数据的非线性模式,这是神经网络基础的一部分。在神经网络中,每个神经元接收上一层的线性组合,经过激活函数的非线性转换,形成新的特征传递给下一层。这一过程与多项式回归的思想相似,都是为了构建能表达非线性关系的模型。

1.1.18. Polynomial regression: extending linear models with basis functions

多项式回归:用基函数展开线性模型

在这里插入图片描述

机器学习中一种常见的模式,是使用线性模型训练数据的非线性函数。这种方法保持了一般快速的线性方法的性能,同时允许它们适应更广泛的数据范围。

比如,在上图的例子中,我们可以认为的将变量用非线性函数进行非线性变换,然后将得到的新的变量再带入线性模型中。

这种思想非常重要,是神经网络的基础。

神经网络中,每一个神经元都是先得到上一层网络输出的线性组合,再经过一个激活函数(非线性函数),然后再将得到的结果作为新的特征输入下一层神经网络中。

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "eid" (class com.tplink.cdd.component.datatrack.common.dto.SingleUpLoadDataDTO), not marked as ignorable (13 known properties: "scr", "sv", "tz", "apv", "uvi", "ex", "dataTrackEvent", "plv", "lg", "scl", "sr", "accountId", "apn"]) at [Source: (String)"{"eid":"vms.front","ct":1760959266904,"ep":{"env":{"browserInfo":{"type":"Chrome","version":"141"},"systemInfo":{"type":"Windows 10","framework":"win64"}},"errorInfo":[],"videoInfo":[{"pullStreamResult":false,"errorCode":-41002,"module":"live","type":"mediaServer","vmsModule":"Device"},{"pullStreamResult":false,"errorCode":-41002,"module":"live","type":"mediaServer","vmsModule":"Device"}],"featureInfo":[],"visitInfo":[]},"usi":"68c269674804b811bea339e3","uvi":"vms-8ff225f900a44a90a937143fe6774a9"[truncated 3 chars]; line: 1, column: 9] (through reference chain: com.tplink.cdd.component.datatrack.common.dto.SingleUpLoadDataDTO["eid"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1127) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2036) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1700) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1678) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:320) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3629) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3597) ~[jackson-databind-2.13.4.2.jar:2.13.4.2] at com.tplink.cdd.component.datatrack.common.util.JsonUtil.json2bean(JsonUtil.java:82) [components-datatrack-1.1.18.jar:1.1.18] at com.tplink.cdd.component.datatrack.port.evnetcenter.FrontDataTrackEventWatcher.handleEvent(FrontDataTrackEventWatcher.java:57) [components-datatrack-1.1.18.jar:1.1.18] at com.tplink.smb.eventcenter.core.DataProcessor.run(DataProcessor.java:31) [eventcenter.core-1.4.5.jar:1.4.5] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_362-362] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_362-362] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_362-362] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_362-362] at java.lang.Thread.run(Thread.java:750) [?:1.8.0_362-362] at java.lang.Thread.run(Thread.java:750) [?:1.8.0_362-362] at com.tplink.cdd.component.datatrack.common.threadpool.MdcAwareThreadFactory$MdcAwareThread.run(MdcAwareThreadFactory.java:42) [components-datatrack-1.1.18.jar:1.1.18] 10-20-2025 19:21:06.908 ERROR [Thread-107] [TID: N/A] [Reqid: 06fc6c0af135017912521beacfe02e14] [ReqTime: 2025-10-20 19:21:06] c.t.s.e.c.DataProcessor: Fail to process event, handler:com.tplink.cdd.component.datatrack.port.evnetcenter.FrontDataTrackEventWatcher java.lang.NullPointerException: null at com.tplink.cdd.component.datatrack.datacollect.DataCollectService.collectWholeEventData(DataCollectService.java:73) ~[components-datatrack-1.1.18.jar:1.1.18] at com.tplink.cdd.component.datatrack.port.evnetcenter.FrontDataTrackEventWatcher.handleEvent(FrontDataTrackEventWatcher.java:58) ~[components-datatrack-1.1.18.jar:1.1.18] at com.tplink.smb.eventcenter.core.DataProcessor.run(DataProcessor.java:31) [eventcenter.core-1.4.5.jar:1.4.5] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_362-362] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_362-362] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_362-362] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_362-362] at java.lang.Thread.run(Thread.java:750) [?:1.8.0_362-362] at java.lang.Thread.run(Thread.java:750) [?:1.8.0_362-362] at com.tplink.cdd.component.datatrack.common.threadpool.MdcAwareThreadFactory$MdcAwareThread.run(MdcAwareThreadFactory.java:42) [components-datatrack-1.1.18.jar:1.1.18] 10-20-2025 19:21:06.910 INFO [https-openssl-nio-8081-exec-2] [TID: N/A] [Reqid: ] [ReqTime: ] c.t.c.v.c.u.EventTrackUtil: [STAT] {"userId":"68c269674804b811bea339e3","vmsId":"vms-8ff225f900a44a90a937143fe6774a98","roleName":"org-creator","requestPattern":"/api/v1/vms/{vmsId}/eventReport","requestMethod":"POST","requestUri":"/api/v1/vms/vms-8ff225f900a44a90a937143fe6774a98/eventReport","loginSource":"NtutiAX4WbTJzA5n9H0NLQ==","sourceType":"vms_web","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0","statusCode":200,"errorCode":0,"requestBody":"{\"frontEventReport\":{\"eid\":\"vms.front\",\"ep\":{\"env\":{\"browserInfo\":{\"type\":\"Chrome\",\"version\":\"141\"},\"systemInfo\":{\"type\":\"Windows 10\",\"framework\":\"win64\"}},\"errorInfo\":[],\"videoInfo\":[{\"pullStreamResult\":false,\"errorCode\":-41002,\"module\":\"live\",\"type\":\"mediaServer\",\"vmsModule\":\"Device\"},{\"pullStreamResult\":false,\"errorCode\":-41002,\"module\":\"live\",\"type\":\"mediaServer\",\"vmsModule\":\"Device\"}],\"featureInfo\":[],\"visitInfo\":[]}}}","responseBody":"{\"errorCode\":0,\"message\":\"success.\"}","costTimeMs":10} 分析一下这个报错
10-21
<think>我们有两个主要的错误堆栈: 1. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "eid" 2. java.lang.NullPointerException 首先分析第一个异常: 异常信息: Unrecognized field "eid" (class com.tplink.cdd.component.datatrack.common.dto.SingleUpLoadDataDTO), not marked as ignorable 原因:在反序列化JSON字符串为`SingleUpLoadDataDTO`对象时,发现了未知属性"eid"。该字段在目标类中不存在,并且没有配置忽略未知属性。 观察JSON字符串的片段: Source: (String)"{"eid":"vms.front","ct":1760959266904, ... }" 目标类`SingleUpLoadDataDTO`已知属性(13个): "scr", "sv", "tz", "apv", "uvi", "ex", "dataTrackEvent", "plv", "lg", "scl", "sr", "accountId", "apn" 显然,JSON中的"eid"字段并不在其中。 第二个异常是NullPointerException: 出现在`DataCollectService.collectWholeEventData`的第73行(由`FrontDataTrackEventWatcher.handleEvent`的第58行调用) 结合第一个异常导致反序列化失败,可能返回了null,然后后续操作这个null对象导致了空指针。 具体代码位置(根据堆栈): FrontDataTrackEventWatcher.handleEvent 的第57行:使用JsonUtil.json2bean将JSON字符串转换为对象。 第58行:调用`DataCollectService.collectWholeEventData`,并传入转换后的对象。 由于第一个异常在json2bean时抛出(但被捕获?堆栈显示继续执行了58行),但注意异常堆栈中显示: at com.tplink.cdd.component.datatrack.port.evnetcenter.FrontDataTrackEventWatcher.handleEvent(FrontDataTrackEventWatcher.java:57) 然后跳到了58行,说明57行转换时可能捕获了异常,然后继续执行?或者没有处理异常导致后续NPE? 实际上,从堆栈来看,第一个异常(UnrecognizedPropertyException)是在json2bean方法中抛出的,但这个方法内部捕获了吗?堆栈显示异常被抛出,然后被事件中心的DataProcessor捕获,打印了错误日志,但随后又有一个NPE? 注意日志中有两段错误: 第一段是UnrecognizedPropertyException,然后紧接着是: 10-20-2025 19:21:06.908 ERROR ... c.t.s.e.c.DataProcessor: Fail to process event, handler:com.tplink.cdd.component.datatrack.port.evnetcenter.FrontDataTrackEventWatcher java.lang.NullPointerException: null 这说明事件处理器(FrontDataTrackEventWatcher)在处理事件时,先遇到了反序列化异常(可能被捕获后继续执行?),然后遇到了空指针。 具体到FrontDataTrackEventWatcher.handleEvent的代码(推测): 57行:SingleUpLoadDataDTO singleUpLoadData = JsonUtil.json2bean(event.getData(), SingleUpLoadDataDTO.class); 58行:dataCollectService.collectWholeEventData(singleUpLoadData); 如果json2bean方法遇到异常,它可能会返回null(根据堆栈中JsonUtil.json2bean的实现,如果抛异常,可能返回null?或者抛出运行时异常?)。因为异常是UnrecognizedPropertyException,它被抛出,但是否被捕获?从堆栈看,这个异常被抛出后,由事件中心的DataProcessor捕获并记录,然后事件处理结束。但是这里还有一个NPE,说明事件处理器还在继续执行? 实际上,从堆栈看,在FrontDataTrackEventWatcher.handleEvent的57行抛出了异常(通过json2bean),然后这个异常被传播到了DataProcessor.run方法,然后DataProcessor记录了错误。但是,为什么还会有NPE? 注意堆栈中,在FrontDataTrackEventWatcher.handleEvent的第58行又抛出了NPE。这似乎矛盾,因为57行已经抛异常,58行应该不会执行。可能是日志打印的堆栈是两次不同的错误?但是时间戳相同,且都是同一个线程(Thread-107)? 重新观察日志时间戳: 两个错误都是10-20-2025 19:21:06.908,且线程名都是[Thread-107],所以是同一个事件处理流程中连续发生了两个异常? 实际上,第一个异常(UnrecognizedPropertyException)在json2bean方法中抛出,然后被EventWatcher的handleEvent方法捕获?或者没有捕获?从堆栈看,json2bean内部调用了ObjectMapper.readValue,该方法抛出了异常,然后向上传递,直到handleEvent方法(第57行)抛出,然后被DataProcessor捕获(DataProcessor.run方法捕获了异常)。但是,在DataProcessor打印错误日志之前,handleEvent方法中可能已经发生了NPE? 另一种可能是:json2bean方法内部捕获了异常然后返回了null?我们看JsonUtil.json2bean的代码(根据堆栈第82行): at com.tplink.cdd.component.datatrack.common.util.JsonUtil.json2bean(JsonUtil.java:82) 假设JsonUtil.json2bean的实现可能是: try { return objectMapper.readValue(json, clazz); } catch (Exception e) { // 可能记录日志,然后返回null? return null; } 如果这样,当反序列化失败时,返回null。然后58行调用dataCollectService.collectWholeEventData(singleUpLoadData)时,传入null,导致NPE。 因此,根本问题是JSON中包含未知字段"eid",导致反序列化失败,返回null,然后后续使用这个null对象。 解决方案有两个方向: 1. 在接收数据的DTO(SingleUpLoadDataDTO)中添加一个字符串类型的eid字段,这样就能正确反序列化。 2. 如果无法修改DTO,则配置ObjectMapper忽略未知字段。 另外,还需要处理json2bean返回null的情况,避免NPE。 具体到代码层面: - 修改SingleUpLoadDataDTO类,添加eid字段(以及对应的getter/setter)。 - 或者,在ObjectMapper上配置:`objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);` 但是,注意这个JSON数据可能是由前端发送的,我们需要确定是否应该包含eid字段。如果前端发送了多余的字段,而我们不需要,则可以忽略。 另外,对于NullPointerException,应该在调用collectWholeEventData之前检查singleUpLoadData是否为null。 例如: SingleUpLoadDataDTO singleUpLoadData = JsonUtil.json2bean(event.getData(), SingleUpLoadDataDTO.class); if (singleUpLoadData == null) { // 记录错误,跳过处理 return; } dataCollectService.collectWholeEventData(singleUpLoadData); 总结: 这个错误是由于JSON数据中包含目标类不存在的字段(eid)导致反序列化失败,进而引起空指针异常。 建议步骤: 1. 在JsonUtil中配置ObjectMapper忽略未知字段(FAIL_ON_UNKNOWN_PROPERTIES=false),这样即使JSON中有多余字段也不会报错,而是忽略它们。 2. 在调用json2bean后,检查返回值是否为null,避免NPE。 如果无法修改JsonUtil的配置,则考虑修复DTO类(添加eid字段)。 从日志中可以看到,这个请求是由前端发送的,并且请求体中的确包含eid字段。因此,可能需要和前端协商是否应该发送这个字段,或者后端DTO需要扩展。 另外,第二个错误(NPE)是由于第一个错误导致的,解决了第一个错误,第二个错误就不会发生。 §§相关问题§§ 1. Jackson反序列化时如何处理未知字段? 2. 如何在Spring Boot中全局配置Jackson忽略未知字段? 3. 反序列化失败时,如何避免后续空指针异常? 4. 如何设计DTO类以兼容API版本变更? 5. 分布式系统中如何统一管理数据序列化配置? </think>### 错误分析报告 #### 核心问题:JSON反序列化异常 **错误类型**:`UnrecognizedPropertyException` **根本原因**: 尝试将JSON数据反序列化为`SingleUpLoadDataDTO`对象时,在JSON中发现了未定义的字段`"eid"`。该字段在目标类中不存在,且未配置忽略未知属性。 ```java // 问题类结构 class SingleUpLoadDataDTO { // 已知字段(共13个) String scr; String sv; String tz; // ...其他字段 // 缺少 eid 字段 } ``` #### 关键错误链 1. **反序列化失败**(主因): - JSON输入:`{"eid":"vms.front","ct":1760959266904, ...}` - 目标类缺少`eid`字段 → 触发`UnrecognizedPropertyException` - 导致`JsonUtil.json2bean()`返回`null` 2. **空指针异常**(衍生问题): ```java // FrontDataTrackEventWatcher.java:58 dataCollectService.collectWholeEventData(singleUpLoadData); // 此处传入null ``` - 因反序列化失败返回`null`,后续调用方法时触发`NullPointerException` #### 完整错误流程 ```mermaid graph TD A[JSON数据含未知字段'eid'] --> B[json2bean反序列化失败] B --> C[返回null对象] C --> D[collectWholeEventData传入null] D --> E[NullPointerException] ``` #### 解决方案 1. **DTO类扩展字段**(推荐): ```java public class SingleUpLoadDataDTO { private String eid; // 新增字段 // 原有字段... } ``` 2. **配置Jackson忽略未知字段**: ```java // 在ObjectMapper配置中 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ``` 3. **增加空指针防护**: ```java // FrontDataTrackEventWatcher.java SingleUpLoadDataDTO dto = json2bean(...); if (dto != null) { dataCollectService.collectWholeEventData(dto); } else { log.error("反序列化失败,跳过处理"); } ``` #### 日志关键线索 | 日志内容 | 说明 | |----------|------| | `Unrecognized field "eid"` | 明确指出未知字段 | | `known properties: "scr", "sv", "tz"...` | 列出所有合法字段 | | `NPE at DataCollectService:73` | 空指针具体位置 | | `requestBody`含`"eid":"vms.front"` | 确认请求包含非法字段 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值