【问题标题】:Vehicle gear prediction using clustering algorithm (machine learning) [closed]使用聚类算法(机器学习)进行车辆齿轮预测
【发布时间】:2020-09-19 10:53:11
【问题描述】:

我正在尝试预测驾驶哪种齿轮车辆。 我在数据集中有Engine_Speedvehicle_Speed 列:

我试过k-means clustering算法,但没有成功。

我必须使用哪种算法?以及如何使用 Python 实现它?

【问题讨论】:

  • 如果你有特征但没有标签,这似乎是这种情况,你必须考虑无监督学习指标。大多数人最先学习并且跑得最快的是kmeans。这并不意味着它是最好的,也不意味着它会给你带来好的结果,但你必须应用一种无监督的学习方法,这是一个很好的起点。
  • k-means 聚类算法在什么方面没有成功?

标签: python machine-learning deep-learning cluster-analysis


【解决方案1】:

查看与发动机转速相关的车速,不同的坡度应该给出不同的档位。


我最初的反应是说这是一个线性回归问题。你没有足够的数据来做其他事情。但是,查看数据,我们可以看到它实际上是两个线性回归问题:

[![发动机转速与车速][2]][2]

在 700 转左右有一个拐点,因此您应该设计一个截止点,选择两条回归线之一,具体取决于您是高于还是低于截止点。

要确定 Python 中的回归,您可以使用任意数量的包。在 scikit-learn 中,它看起来像这样: https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

这里给出的示例,使用 Python 控制台,是

>>> import numpy as np
>>> from sklearn.linear_model import LinearRegression
>>> X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
>>> # y = 1 * x_0 + 2 * x_1 + 3
>>> y = np.dot(X, np.array([1, 2])) + 3
>>> reg = LinearRegression().fit(X, y)
>>> reg.score(X, y)
1.0
>>> reg.coef_
array([1., 2.])
>>> reg.intercept_
3.0000...
>>> reg.predict(np.array([[3, 5]]))
array([16.])

显然,您需要将自己的数据放在 X 和 y 中,实际上您需要两个数组用于图表的两个部分。您还将有两个 reg = LinearRegression().fit(X, y) 表达式和一个 if 语句来决定使用哪个 reg,具体取决于输入。拐点在两条回归线的交点处。

两条回归线的形式为 y = m1 x + c1 和 y = m2 x + c2,其中 m1、m2 是线的梯度,c1、c2 是截距。在交点 m1x + c1 = m2x + c2。如果你不想做数学,那么你可以使用 Shapely:

import shapely
from shapely.geometry import LineString, Point

line1 = LineString([A, B])
line2 = LineString([C, D])

int_pt = line1.intersection(line2)
point_of_intersection = int_pt.x, int_pt.y

print(point_of_intersection)

(取自 Stack Overflow 上的这个答案:How do I compute the intersection point of two lines?


与 Sanjiv 讨论后,这里是更新的代码(改编自这里:https://machinelearningmastery.com/clustering-algorithms-with-python/

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from sklearn.cluster import KMeans

matplotlib.use('TkAgg')

df = pd.read_excel("GearPredictionSanjiv.xlsx", sheet_name='FullData')
x = []
y = []
x = round(df['Engine_speed'])
y = df['Vehicle_speed']
if 'Ratio' not in df.columns or not os.path.exists('dataset.xlsx'):
    df['Ratio'] = round(x/y)


model = KMeans(n_clusters=5)

# Fit the model
model.fit(X)

# Assign a cluster to each example
yhat = model.predict(X)


# Plot
plt.scatter(yhat, X['Ratio'], c=yhat, cmap=plt.cm.coolwarm)

# Show the plot
plt.show()

【讨论】:

  • :- 我想我必须为此使用聚类算法。?
  • 我的意思是,这会给你发动机转速和车速之间的关系,但它不会告诉你车辆处于什么档位,这就是最初的问题。跨度>
  • 抱歉,我假设档位是标有车速的列,因为它的值从 2 到 5。如果您应该使用聚类,那么您需要假设如何有很多齿轮。 5 是一个合理的假设,但您将无法区分 1 和 2,因为您没有 1 的数据,因此您实际上需要一个四集群模型。作为一个回归问题,它对我来说仍然更有意义,因为在某处车辆速度存在转换错误。问题出在哪里?
  • 您好 Sanjiv,车速与发动机转速的关系图正是您列出的比率。每个不同的坡度是不同的齿轮。我无法理解为什么在大约 750 转和 900 转之间没有车速增加 - 你只会在空档时得到它。要在 python 中实现,计算 3 个工作齿轮的斜率。然后,对于任何新的一对(车辆速度,发动机速度),按照您所说的计算比率,然后选择具有最接近比率的齿轮。您也可以说任何超过 10% 的齿轮比都属于错误或其他齿轮。
  • 另外,请发布可用的完整数据。
【解决方案2】:

这个问题有点令人困惑。

我假设您想使用 engine_speed 推断车速。那么这个数据集中只有一个特征(即发动机速度),类别标签是车速。实际上,一个简单的 IF THEN ELSE 可以解决该语句,但为了使用机器学习方法(例如决策树)回答您的问题,我将分享如何在 Python 中使用 scikit-learn 将其作为分类问题来解决。

import numpy as np
from sklearn import tree
from sklearn.metrics import accuracy_score

###  np.reshape(array, (-1, 1)) is to convert the array to 2D array
engine_speed = np.reshape([1124, 974, 405, 865, 754, 200], (-1, 1))
vehicle_speed = np.reshape([5, 4, 3, 4, 4, 2], (-1, 1))

test_engine_speed = np.reshape([1000, 900, 800, 700, 600, 500, 400], (-1, 1))
test_vehicle_speed = np.reshape([5, 4, 4, 4, 4, 3, 3], (-1, 1))

clf = tree.DecisionTreeClassifier()
clf = clf.fit(engine_speed, vehicle_speed)

y_pred = clf.predict(test_engine_speed)

print(accuracy_score(test_vehicle_speed, y_pred))
print(test_vehicle_speed.ravel()) # ravel() is to convert 2D array to 1D array
print(y_pred.ravel())             # ravel() is to convert 2D array to 1D array

我希望这会有所帮助。

【讨论】:

  • :- 实际上要求是:- 我有两列,即Engine_speedVehicle_speed。根据这两列记录,我必须找到我的车辆在哪个档位上行驶。 逻辑是Ratio= Engine_speed/Vehicle_speed。比率越高,齿轮越低。
猜你喜欢
  • 2012-11-16
  • 2016-09-15
  • 2012-05-30
  • 2017-05-03
  • 2018-03-05
  • 2016-12-04
  • 2016-08-30
  • 2020-04-19
  • 2017-06-05
相关资源
最近更新 更多