Advertisement
Guest User

Untitled

a guest
Nov 16th, 2023
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.52 KB | None | 0 0
  1. package breeze.stats.regression
  2.  
  3. import breeze.generic.UFunc
  4. import breeze.linalg._
  5. import org.netlib.util.intW
  6. import dev.ludovic.netlib.lapack.LAPACK.{getInstance => lapack}
  7. import java.util.Arrays
  8.  
  9. private object leastSquaresSingleImplementation {
  10. def doLeastSquaresSingle(
  11. data: DenseMatrix[Float],
  12. outputs: DenseVector[Float],
  13. workArray: Array[Float]): LeastSquaresRegressionSingleResult = {
  14. require(data.rows == outputs.size)
  15. require(data.rows > data.cols + 1)
  16. require(workArray.length >= 2 * data.rows * data.cols)
  17.  
  18. val info = new intW(0)
  19. lapack.sgels(
  20. "N",
  21. data.rows,
  22. data.cols,
  23. 1,
  24. data.data,
  25. data.rows,
  26. outputs.data,
  27. data.rows,
  28. workArray,
  29. workArray.length,
  30. info)
  31. if (info.`val` < 0) {
  32. throw new ArithmeticException("Least squares did not converge.")
  33. }
  34.  
  35. val coefficients = new DenseVector[Float](Arrays.copyOf(outputs.data, data.cols))
  36. var r2 = 0.0
  37. for (i <- 0 until (data.rows - data.cols)) {
  38. r2 = r2 + math.pow(outputs.data(data.cols + i), 2)
  39. }
  40. LeastSquaresRegressionSingleResult(coefficients, r2.toFloat)
  41. }
  42. }
  43.  
  44. case class LeastSquaresRegressionSingleResult(coefficients: DenseVector[Float], rSquared: Float)
  45. extends RegressionResult[DenseVector[Float], Float] {
  46. def apply(x: DenseVector[Float]): Float = coefficients.dot(x)
  47.  
  48. def apply(X: DenseMatrix[Float]): DenseVector[Float] = X * coefficients
  49. }
  50.  
  51. object leastSquaresSingle extends UFunc {
  52. implicit val matrixVectorWithWorkArray
  53. : Impl3[DenseMatrix[Float], DenseVector[Float], Array[Float], LeastSquaresRegressionSingleResult] =
  54. new Impl3[DenseMatrix[Float], DenseVector[Float], Array[Float], LeastSquaresRegressionSingleResult] {
  55. def apply(
  56. data: DenseMatrix[Float],
  57. outputs: DenseVector[Float],
  58. workArray: Array[Float]): LeastSquaresRegressionSingleResult =
  59. leastSquaresSingleImplementation.doLeastSquaresSingle(data.copy, outputs.copy, workArray)
  60. }
  61.  
  62. implicit val matrixVectorSpecifiedWork
  63. : Impl3[DenseMatrix[Float], DenseVector[Float], Int, LeastSquaresRegressionSingleResult] =
  64. new Impl3[DenseMatrix[Float], DenseVector[Float], Int, LeastSquaresRegressionSingleResult] {
  65. def apply(data: DenseMatrix[Float], outputs: DenseVector[Float], workSize: Int): LeastSquaresRegressionSingleResult =
  66. leastSquaresSingleImplementation.doLeastSquaresSingle(data.copy, outputs.copy, new Array[Float](workSize))
  67. }
  68.  
  69. implicit val matrixVector: Impl2[DenseMatrix[Float], DenseVector[Float], LeastSquaresRegressionSingleResult] =
  70. new Impl2[DenseMatrix[Float], DenseVector[Float], LeastSquaresRegressionSingleResult] {
  71. def apply(data: DenseMatrix[Float], outputs: DenseVector[Float]): LeastSquaresRegressionSingleResult =
  72. leastSquaresSingleImplementation.doLeastSquaresSingle(
  73. data.copy,
  74. outputs.copy,
  75. new Array[Float](math.max(1, data.rows * data.cols * 2)))
  76. }
  77. }
  78.  
  79. object leastSquaresSingleDestructive extends UFunc {
  80. implicit val matrixVectorWithWorkArray
  81. : Impl3[DenseMatrix[Float], DenseVector[Float], Array[Float], LeastSquaresRegressionSingleResult] =
  82. new Impl3[DenseMatrix[Float], DenseVector[Float], Array[Float], LeastSquaresRegressionSingleResult] {
  83. def apply(
  84. data: DenseMatrix[Float],
  85. outputs: DenseVector[Float],
  86. workArray: Array[Float]): LeastSquaresRegressionSingleResult =
  87. leastSquaresSingleImplementation.doLeastSquaresSingle(data, outputs, workArray)
  88. }
  89.  
  90. implicit val matrixVectorSpecifiedWork
  91. : Impl3[DenseMatrix[Float], DenseVector[Float], Int, LeastSquaresRegressionSingleResult] =
  92. new Impl3[DenseMatrix[Float], DenseVector[Float], Int, LeastSquaresRegressionSingleResult] {
  93. def apply(data: DenseMatrix[Float], outputs: DenseVector[Float], workSize: Int): LeastSquaresRegressionSingleResult =
  94. leastSquaresSingleImplementation.doLeastSquaresSingle(data, outputs, new Array[Float](workSize))
  95. }
  96.  
  97. implicit val matrixVector: Impl2[DenseMatrix[Float], DenseVector[Float], LeastSquaresRegressionSingleResult] =
  98. new Impl2[DenseMatrix[Float], DenseVector[Float], LeastSquaresRegressionSingleResult] {
  99. def apply(data: DenseMatrix[Float], outputs: DenseVector[Float]): LeastSquaresRegressionSingleResult =
  100. leastSquaresSingleImplementation.doLeastSquaresSingle(
  101. data,
  102. outputs,
  103. new Array[Float](math.max(1, data.rows * data.cols * 2)))
  104. }
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement