Я покажу вам два метода, с помощью которых вы можете динамически применять ng-class
Используя трехмерный оператор
<div ng-class="condition?'class1':'class2'"></div>
Если ваше условие истинно, тогда класс 1 будет применен к вашему элементу, будет применен класс2.
Когда вы попытаетесь изменить условное значение во время выполнения класс каким-то образом не изменится. Поэтому я предлагаю вам перейти на этап 2, если у вас есть требование, подобное динамическому изменению класса.
<div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>
, если ваше условие соответствует с value1, тогда класс 1 будет применен к вашему элементу, если совпадения со значением2, тогда будет применен класс2 и так далее. И динамическое изменение класса будет отлично работать с ним.
Надеюсь, это вам поможет.
From the numpy.polyfit documentation, it is fitting linear regression. Specifically, numpy.polyfit with degree 'd' fits a linear regression with the mean function
E(y|x) = p_d * x**d + p_{d-1} * x **(d-1) + ... + p_1 * x + p_0
So you just need to calculate the R-squared for that fit. The wikipedia page on linear regression gives full details. You are interested in R^2 which you can calculate in a couple of ways, the easisest probably being
SST = Sum(i=1..n) (y_i - y_bar)^2
SSReg = Sum(i=1..n) (y_ihat - y_bar)^2
Rsquared = SSReg/SST
Where I use 'y_bar' for the mean of the y's, and 'y_ihat' to be the fit value for each point.
I'm not terribly familiar with numpy (I usually work in R), so there is probably a tidier way to calculate your R-squared, but the following should be correct
import numpy
# Polynomial Regression
def polyfit(x, y, degree):
results = {}
coeffs = numpy.polyfit(x, y, degree)
# Polynomial Coefficients
results['polynomial'] = coeffs.tolist()
# r-squared
p = numpy.poly1d(coeffs)
# fit values, and mean
yhat = p(x) # or [p(z) for z in x]
ybar = numpy.sum(y)/len(y) # or sum(y)/len(y)
ssreg = numpy.sum((yhat-ybar)**2) # or sum([ (yihat - ybar)**2 for yihat in yhat])
sstot = numpy.sum((y - ybar)**2) # or sum([ (yi - ybar)**2 for yi in y])
results['determination'] = ssreg / sstot
return results
Из scipy.stats.linregress источника. Они используют средний метод суммы квадратов.
import numpy as np
x = np.array(x)
y = np.array(y)
# average sum of squares:
ssxm, ssxym, ssyxm, ssym = np.cov(x, y, bias=1).flat
r_num = ssxym
r_den = np.sqrt(ssxm * ssym)
r = r_num / r_den
if r_den == 0.0:
r = 0.0
else:
r = r_num / r_den
if r > 1.0:
r = 1.0
elif r < -1.0:
r = -1.0
R-квадрат - это статистика, которая применяется только к линейной регрессии.
По сути, она измеряет, насколько вариативность ваших данных может быть объяснена линейной регрессией.
Итак, вы вычислите «общую сумму квадратов», которая представляет собой общий квадрат отклонения каждой из ваших конечных переменных от их среднего значения. . .
\ sum_ {i} (y_ {i} - y_bar) ^ 2
где y_bar - это среднее значение y.
Затем вы вычисляете «сумму квадратов регрессии», то есть насколько ваши FITTED-значения отличаются от среднего
\ sum_ {i} (yHat_ {i} - y_bar) ^ 2
, и находите соотношение этих двух.
Теперь все, что вам нужно сделать для полиномиального подбора, - это вставить y_hat из этой модели, но называть это r-квадрат некорректно.
Вот ссылка, которую я нашел, которая немного говорит о нем.
В статье в Википедии о r-квадратах предполагается, что его можно использовать для подбора общей модели, а не только для линейной регрессии.
Очень поздний ответ, но на всякий случай кому-то понадобится готовая функция для этого:
т.е.
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
, как в ответе @Adam Marples.