Python 3将元素识别为字符串
我定义了一个损失函数Python 3将元素识别为字符串,python,python-3.x,Python,Python 3.x,我定义了一个损失函数L(X,Y,c,b,d),其中X和Y应该是数组,c,b,d是浮点数。这是我的密码: def L(X,Y,c,b,d): error=0 a=Y[0] for i in range(len(X)): error = error + ((c*X[i]+(a/b)*np.sqrt(b**2-X[i]**2)+d)-Y[i])**2 return error 我要走了 "TypeError: unsupported operand t
L(X,Y,c,b,d)
,其中X和Y应该是数组,c,b,d是浮点数。这是我的密码:
def L(X,Y,c,b,d):
error=0
a=Y[0]
for i in range(len(X)):
error = error + ((c*X[i]+(a/b)*np.sqrt(b**2-X[i]**2)+d)-Y[i])**2
return error
我要走了
"TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'",
这似乎意味着python将X[i]识别为字符串。我该怎么办
这是完整的代码,X是一列数字
def L(X,Y,c,b,d):
error=0
a=Y[0]
for i in range(len(X)):
error = error + ((c*X[i]+(a/b)*np.sqrt(b**2-X[i]**2)+d)-Y[i])**2
return error
def L_prime_c(X,Y,c,b,d):
p=0
for i in range(len(X)):
p=p+2*L(X,Y,c,b,d)*X[i]
return p
def L_prime_d(X,Y,c,b,d):
r=0
for i in range(len(X)):
r=r+2*L(X,Y,c,b,d)
return r
def fit(X,Y,learning_rate=1e-3,max_iter=20000,epsilon=1e-5):
c=1
b=1
d=Y[0]
for i in range(max_iter):
gradient_c = L_prime_c(X,Y,c,b,d)
c_new = c - learning_rate * gradient_c
gradient_b = L_prime_b(X,Y,c,b,d)
b_new = b - learning_rate * gradient_b
gradient_d = L_prime_d(X,Y,c,b,d)
d_new = d - learning_rate * gradient_d
if np.abs(c_new - c) < epsilon and np.abs(d_new - d) < epsilon and np.abs(b_new - b) < epsilon:
break
c=c_new
b=b_new
d=d_new
return np.array([c,b,d])
#getting X, Y
In = xlrd.open_workbook(r'C:\Users\gris_\Desktop\calculation4.xlsx')
isheet = In.sheet_by_name('Sheet1')
X=isheet.col_values(0)
Y=isheet.col_values(1)
a=Y[0]
#Calculation & Output
result=fit(X,Y,learning_rate=1e-3,max_iter=20000,epsilon=1e-5)
定义L(X,Y,c,b,d):
错误=0
a=Y[0]
对于范围内的i(len(X)):
误差=误差+((c*X[i]+(a/b)*np.sqrt(b**2-X[i]**2)+d)-Y[i])**2
返回错误
定义L_素数c(X,Y,c,b,d):
p=0
对于范围内的i(len(X)):
p=p+2*L(X,Y,c,b,d)*X[i]
返回p
定义L_素数d(X,Y,c,b,d):
r=0
对于范围内的i(len(X)):
r=r+2*L(X,Y,c,b,d)
返回r
def拟合(X,Y,学习率=1e-3,最大iter=20000,ε=1e-5):
c=1
b=1
d=Y[0]
对于范围内的i(最大值):
梯度=素数(X,Y,c,b,d)
c_new=c-学习率*梯度
梯度b=L素数b(X,Y,c,b,d)
b_new=b-学习率*梯度
梯度d=L素数d(X,Y,c,b,d)
d_new=d-学习率*梯度
如果np.abs(c_new-c)问题解决:我有6个不同长度的列,所以当从一列中读取数据时,python实际上添加了这些“以使较短的列与最长的列长度相同。当我删除其他列时,情况会很好。非常感谢您的帮助!:D看到您刚才添加的代码,尝试重写X,Y,如下所示:
X=list(map(float,isheet.col_values(0)))
Y=list(map(float,isheet.col_values(1)))
另一个:您的函数可以简化为所有错误的总和
import numpy as np
# Another way of writing it
#def L(X,Y,c,b,d):
# error=0
# a=Y[0]
# for x,y in zip(X,Y):
# error += ((c*x+(a/b)*np.sqrt(b**2-x**2)+d)-y)**2
# return error
# Or even better:
def L(X,Y,c,b,d):
a = Y[0]
error = sum(((c*x+(a/b)*np.sqrt(b**2-x**2)+d)-y)**2 for x,y in zip(X,Y))
return error
X = [2.2,2.2,3.2]
Y = [2.0,2.1,3.1]
c = 1
b = 20
d = 1
print(L(X,Y,c,b,d))
返回:29.148285465180138
其中,将X和Y更改为:
X = [2.2,2.2,3.2,'a']
Y = [2.0,2.1,3.1,'b']
返回:
TypeError:**或pow()不支持的操作数类型:'str'和'int'
X包含什么?您有示例输入吗?我在定义此函数后导入X,它是一个浮点数组。我应该在定义此函数之前定义X吗?您应该确保您的X
(和Y
)列表只包含数字元素(或者至少包含支持算术操作数的元素),现在的情况是X
包含Python所抱怨的字符串(即,在您的情况下,不知道如何将字符串提升到2的幂)。谢谢!这确实比我自己的代码简洁多了!我按照你说的修改了我的代码,但是我得到了“ValueError:无法将字符串转换为浮点”。所以我检查了我的excel工作簿,它实际上是一个49*1的数字矩阵…@GrisNX just print(X)不进行转换并将其发布到此处!这是一个伟大的举动!我不知道是什么导致了此问题,但这里是:[595.703,更多的数字我想我已经找到了答案:我有6个不同长度的列,所以当从一列中读取数据时,python实际上添加了这些“以使较短的列与最长的列具有相同的长度。当我删除其他列时,情况会很好。