前提・実現したいこと
Processingからサーバーに値を渡して、Pythonで記述した機械学習のプログラムで計算した後、Processingに値を返すものを作成しています。
それぞれのパーツを書いて、つなげて実行しようとした時にエラーになりました。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "/Users/username/miniforge3/envs/myenv/lib/python3.9/site-packages/flask/app.py", line 2070, in wsgi_app response = self.full_dispatch_request() File "/Users/username/miniforge3/envs/myenv/lib/python3.9/site-packages/flask/app.py", line 1515, in full_dispatch_request rv = self.handle_user_exception(e) File "/Users/username/miniforge3/envs/myenv/lib/python3.9/site-packages/flask/app.py", line 1513, in full_dispatch_request rv = self.dispatch_request() File "/Users/username/miniforge3/envs/myenv/lib/python3.9/site-packages/flask/app.py", line 1499, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "/Users/username/flask/flask-mini-api/app.py", line 13, in api food_list = calc(food_id_list) File "/Users/username/flask/flask-mini-api/test.py", line 20, in calc abc = pd.DataFrame(nnls(A,B)[0]*100) File "/Users/username/miniforge3/envs/myenv/lib/python3.9/site-packages/scipy/optimize/_nnls.py", line 82, in nnls raise RuntimeError("too many iterations") **RuntimeError: too many iterations**
該当のソースコード
flask_mini
Processing
1import http.requests.*; 2 3String URL = "http://127.0.0.1:3000/api?food_id=130,355,529,630,706,995,1758,1922,1943,1966,2296"; 4 5void setup() { 6 GetRequest get = new GetRequest(URL); 7 get.send(); 8 JSONObject result = parseJSONObject(get.getContent()); 9 println(result); 10} 11 12void draw() { 13}
app.py
Python
1from flask import Flask, request, jsonify 2from test import calc 3 4app = Flask(__name__) 5 6@app.route("/api", methods=["GET"]) 7def api(): 8 req = request.args 9 food_id_param = req.get("food_id") 10 11 food_id_list = food_id_param.split(',') 12 13 food_list = calc(food_id_list) 14 return jsonify({"food": food_list}) 15 16if __name__ == "__main__": 17 app.run(port=3000) 18
test.py
Python
1import pandas as pd 2import numpy as np 3from scipy.optimize import nnls 4 5def calc(food_id_list): 6 df = pd.read_csv('nutrients_data_shaped.csv') 7 data=df[['NO','food','ENERC_KCAL','PROT-','FAT-','CHOAVLDF-','K','CA','MG','P','FE','ZN','CU','VITA_RAE','VITD','TOCPHA','VITK ','THIA','RIBF','NE','VITB6A','VITB12','FOL','PANTAC','VITC','FIB-','NACL_EQ']] 8 9 data2= data[data['NO'].isin(food_id_list)] 10 11 data2matrix=np.delete(data2.to_numpy(),[0,1],1).astype('float').T 12 13 A=data2matrix 14 B=np.array([2650,65,59,384,2500,800,340,1000,7.5,11,0.9,850,8.5,6.0,150,1.4,1.6,15,1.4,2.4,240,5,100,24,5]) 15 16 data2_food_name = pd.DataFrame(data2['food']) 17 18 data2_food_name.reset_index(drop=True, inplace=True) 19 20 abc = pd.DataFrame(nnls(A,B)[0]*100) 21 data2_need_nutrients_amount = pd.concat([data2_food_name, abc], axis=1) 22 data2_need_nutrients_amount = data2_need_nutrients_amount.rename(columns={0:'必要な量(g)'}) 23 24 return_arr = [] 25 for data in data2_need_nutrients_amount.values: 26 return_arr.append({ 27 "food_name": data[0], 28 "weight": data[1] 29 }) 30 return return_arr
試したこと
test.pyのnnlsのところが問題になっていると考え、AとBの要素を減らして実行しましたが、同じ結果になりました。また、nnlsの中身をみて、modeが1にならないといけないのかなと思いましたが、jupyter notebookでは動いています。
nnls.py
Python
1from __future__ import division, print_function, absolute_import 2 3from . import _nnls 4from numpy import asarray_chkfinite, zeros, double 5 6__all__ = ['nnls'] 7 8 9def nnls(A, b): 10 """ 11 Solve ``argmin_x || Ax - b ||_2`` for ``x>=0``. This is a wrapper 12 for a FORTAN non-negative least squares solver. 13 14 Parameters 15 ---------- 16 A : ndarray 17 Matrix ``A`` as shown above. 18 b : ndarray 19 Right-hand side vector. 20 21 Returns 22 ------- 23 x : ndarray 24 Solution vector. 25 rnorm : float 26 The residual, ``|| Ax-b ||_2``. 27 28 Notes 29 ----- 30 The FORTRAN code was published in the book below. The algorithm 31 is an active set method. It solves the KKT (Karush-Kuhn-Tucker) 32 conditions for the non-negative least squares problem. 33 34 References 35 ---------- 36 Lawson C., Hanson R.J., (1987) Solving Least Squares Problems, SIAM 37 38 """ 39 40 A, b = map(asarray_chkfinite, (A, b)) 41 42 if len(A.shape) != 2: 43 raise ValueError("expected matrix") 44 if len(b.shape) != 1: 45 raise ValueError("expected vector") 46 47 m, n = A.shape 48 49 if m != b.shape[0]: 50 raise ValueError("incompatible dimensions") 51 52 w = zeros((n,), dtype=double) 53 zz = zeros((m,), dtype=double) 54 index = zeros((n,), dtype=int) 55 56 x, rnorm, mode = _nnls.nnls(A, m, n, b, w, zz, index) 57 if mode != 1: 58 raise RuntimeError("too many iterations") 59 60 return x, rnorm
補足情報(ツールのバージョンなど)
M1 mac miniforge3
Processing 3.5.4
Python 3.9.1
flask 2.0.1
scipy 1.7.0
numpy 1.21.0
pandas 1.3.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/10 06:11
2021/07/12 00:46
2021/07/13 02:35