【发布时间】:2020-02-23 08:38:37
【问题描述】:
我正在尝试创建一个程序来从两个 CSV 中获取数据,然后计算距离并对特征进行分类。我的代码目前仅在第一次迭代中正常工作,整个代码工作正常,直到我更改了 weight_based_approach() 函数的返回,之前 weight_based_approach() 返回 2 个浮点值,现在它只返回一个值,这里是更改部分
代码:
return (eucl_weight_prediction_count / len(test_data) * 100), (
manhattan_metric_prediction_count / len(test_data) * 100)
当前完整代码:
import numpy as np
import matplotlib.pyplot as plt
class Implementation:
def __init__(self):
pass
def Distancess(self, training_sub_data, query_instance):
query_params = query_instance[:10]
eucl = np.sqrt(np.sum((training_sub_data - query_params) ** 2, axis=-1))
return eucl, np.argsort(eucl)
def weight(self, training_data, distances, sorted_indices, k):
i = 1
samples_class = training_data[sorted_indices[:k]][:, -1]
nearest_distances = distances[sorted_indices[:k]]
nearest_weights = np.divide(1, np.square(nearest_distances))
class_0_weights_sum = np.sum(nearest_weights[samples_class == 0])
class_1_weights_sum = np.sum(nearest_weights[samples_class == 1])
class_2_weights_sum = np.sum(nearest_weights[samples_class == 2])
if class_0_weights_sum > class_1_weights_sum and class_0_weights_sum > class_2_weights_sum:
return 0
elif class_1_weights_sum > class_0_weights_sum and class_1_weights_sum > class_2_weights_sum:
return 1
else:
return 2
def weight_based_approach(training_data, test_data, kn_k_value):
training_data_10_columns = training_data[:, :10]
kn = Implementation()
eucl_weight_prediction_count = 0
for query_instance in test_data:
distances, euclidean_indices = kn.Distancess(training_data_10_columns, query_instance)
weight_based_average = kn.weight(training_data, distances, euclidean_indices, kn_k_value)
if query_instance[-1] == weight_based_average:
eucl_weight_prediction_count += 1
return eucl_weight_prediction_count / len(test_data) * 100
def main():
global accuracies
euclidean_accuracies = []
k_samples = []
k_samples.extend(list(range(1, 4, 1)))
print("Range" + str(k_samples))
for k in k_samples:
training_file = "classification/trainingData.csv"
test_file = "classification/testData.csv"
kn_k_value = k
training_data = np.genfromtxt(training_file, delimiter=",")
test_data = np.genfromtxt(test_file, delimiter=",")
accuracies = weight_based_approach(training_data, test_data, kn_k_value)
euclidean_accuracies.append(accuracies[0])
print("distance: " + str(euclidean_accuracies))
plt.plot(k_samples, euclidean_accuracies, 'r')
plt.xlabel('K{Number of Nearest Neighbour(s)}')
plt.ylabel('Accuracy %')
plt.title('K vs Accuracy graph')
plt.grid(True)
plt.show()
if __name__ == '__main__':
main()
错误:
Traceback (most recent call last):
File "A:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3296, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-2-e142ccdf3a2c>", line 1, in <module>
runfile('A:/Workspace/PML/R00182527/Part2a.py', wdir='A:/Workspace/PML/R00182527')
File "C:\Program Files\JetBrains\PyCharm 2019.2.2\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
pydev_imports.execfile(filename, global_vars, local_vars) # execute the script
File "C:\Program Files\JetBrains\PyCharm 2019.2.2\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "A:/Workspace/P7/Part.py", line 143, in <module>
main()
File "A:/Workspace/P7/Part.py", line 126, in main
euclidean_accuracies.append(accuracies[0])
TypeError: 'float' object is not subscriptable
期望准确率 % 作为输出
【问题讨论】:
-
"在我更改 weight_based_approach() 函数的返回之前,整个代码运行良好" 那么,之前是什么?你为什么改变它?以及为什么您希望此更改不会影响代码中使用结果的行?
-
@KarlKnechtel,更改只是我从该函数返回的浮点值的数量。用以前的代码更新了问题。
-
所以您看到您的
eucl_weight_prediction_count / len(test_data) * 100如何返回一个浮点数为accuracies,然后您尝试附加该数字accuracies[0],这没有意义吗?感谢您发布完整的追溯,所以 +1。
标签: python python-3.x list for-loop typeerror