Добавление граничных условий или пределов в линейную модель несмешивания в Python - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь добавить в код граничное условие, но не знаю, как это сделать, не получая ошибок. Прямо сейчас я сравниваю минеральные спектры с неизвестным, чтобы увидеть этот состав. По существу, выходная часть представляет собой долю того, сколько каждого минерала содержится в неизвестном ОДНАКО, при суммированном выводе вы получаете значение, превышающее «1» (вы не можете иметь более 100% чего-либо, если это имеет смысл.)

Я определяю в своем l oop, чтобы убедиться, что значения складываются (или меньше) к 1, но опять же, выход по-прежнему больше 1.

Например, вывод для кода ниже : Расчетные содержания Acmite, Augite, Diopside, Hornblende, Labradorite, Microcline, Olivine и Orthoclase в SR373 составляют [0,9 -0,23 0,2 0,31 0,02 -0,01 -0,03 0,03] RMSE составляет 0,101 И хотя это хорошее значение RMSE, я не могу работать с этим b c все значения выше складываются в 1

 # these  are all the minerals and their spectra associated (reflectance value vs wavelength) 
libspecs=np.concatenate([AcmiteReflectance, \
              AugiteReflectance, \
                             DiopsideReflectance, \
                            HornblendeReflectance, \
                            LabradoriteReflectance, \
                            MicroclineReflectance, \
                            OlivineReflectance, \
                            OrthoclaseReflectance]).reshape(8, 1868)

    #Input the target spectra - this is your observed/collected spectra
    targetspecs=np.array([Reflectance_373])
    #Transpose arrays for input into least squares solver
    inA = libspecs.T
    inB = targetspecs.T
    #Calculate the solution X to XA=B
    coeffvals = np.linalg.lstsq(inA, inB)
    #Grab the weights (X) from the returned tuple
    weights = coeffvals[0]
    #Loop through the weight array and print out generated spectra
    specnames=['SR373']
    for weightsind in range(1):
        specweights=weights[:,weightsind]
        #Normalize the weights to sum to 1
        specweights/=np.linalg.norm(specweights)
        #Apply the weights to the library spectra to produce the modeled spectrum
        fitspec = np.dot(specweights,inA.T)
        print('Calculated abundances of Acmite, Augite, Diopside, Hornblende, Labradorite, Microcline, Olivine and Orthoclase in ' + \
              specnames[weightsind] + ' are ' + str(np.around(specweights,2)))
        rmse=np.sqrt(np.mean((fitspec-inB.T[weightsind,:])**2))
        print('RMSE is ' + str(np.around(rmse,3)))
    '''
...