前提・実現したいこと
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