gpt4 book ai didi

swift - 线性回归结果不符合预期,经过简单测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:50:59 25 4
gpt4 key购买 nike

我有一个函数,borrowed from Ray Wenderlich ,对于一系列点的线性回归:

extension Array where Element == CGFloat {
// A closed form solution
fileprivate var average: CGFloat {
return self.reduce(0, +) / CGFloat(self.count)
}
}

extension CGFloat {
fileprivate static func multiply(_ a: [CGFloat], _ b: [CGFloat]) -> [CGFloat] {
return zip(a,b).map(*)
}

static func linearRegression(a: [CGFloat], b: [CGFloat]) -> (_ a: CGFloat) -> CGFloat {
let sum1 = CGFloat.multiply(b, a).average - a.average * b.average
let sum2 = CGFloat.multiply(a, a).average - pow(a.average, 2)
let slope = sum1 / sum2
let intercept = b.average - slope * a.average
return { x in intercept + slope * x }
}
}

我添加了一个简单的测试以确保它能给我预期的结果:

class CGFloatExtensionsTests: XCTestCase {
func testLinearRegression() {
let points = [
CGPoint(x: 1, y: 2),
CGPoint(x: 2, y: 1),
CGPoint(x: 3, y: 4),
CGPoint(x: 4, y: 3)
]

let linearRegression = CGFloat.linearRegression(a: points.map({$0.x}), b: points.map({$0.y}))

let y1 = linearRegression(1)
let y2 = linearRegression(3)

XCTAssertEqual(y1, 1, accuracy: 0.0001)
XCTAssertEqual(y2, 3, accuracy: 0.0001)
}
}

所以我平均放置点,并期望线性回归线应该正好穿过这些点的中间。然而,这两个测试都失败了,第一个预期结果是 1.6,第二个是 2.8

为了演示.. 蓝色是重点。绿色是我预期的线性回归线,黄色是实际的线性回归线。

enter image description here

我对此的期望/理解不正确吗?算法不对?

最佳答案

你的期望是错误的。 simple linear regression是线

y = a * x + b

最小化观察到的差异的平方和y 值和内插 y 值,即 (a, b) 被确定为

sum( (a * xi + b - yi)^2, i=1,...,n)

越小越好。为了你的值(value)观

(1, 2), (2, 1), (3, 4), (4, 3)

这是一行

y = 0.6 x + 1

平方差之和为 3.2。对于行 y = x差平方和较大,即4.0。

关于swift - 线性回归结果不符合预期,经过简单测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51826911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com