python实现从excel表格中读取第二列第三列中的前六个数据为聚类中心,同时只对通过IDLE中可以输入的多组二维数据进行聚类,将聚类后的点模糊判断到前六个点中某个聚类中心的k-means聚类,并根据聚类的类别给出对应表格中第四列和第五列的数据
时间: 2024-02-22 11:56:00 浏览: 74
好的,下面是完整的代码:
```python
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
df = pd.read_excel('data.xlsx')
data = df.iloc[:, 1:3].values[:6]
kmeans = KMeans(n_clusters=len(data)).fit(data)
def is_valid_input(input_data):
try:
input_data = eval(input_data)
if isinstance(input_data, list) and len(input_data) > 1 and isinstance(input_data[0], list) and len(input_data[0]) == 2:
return True
except:
pass
return False
def fuzzy_predict(input_data):
if isinstance(input_data, str):
input_data = eval(input_data)
if not isinstance(input_data, list) or len(input_data) == 0:
return None
result = []
for data in input_data:
if not is_valid_input(str(data)):
continue
data = eval(data)
labels = kmeans.predict(data)
centers = kmeans.cluster_centers_
def fuzzy_distance(x, y):
d = ((x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2) ** 0.5
return 1 / (1 + d)
def fuzzy_predict_one(x):
weights = [fuzzy_distance(x, center) for center in centers]
return kmeans.labels_[weights.index(max(weights))]
res = []
for point in data:
label = fuzzy_predict_one(point)
res.append(df.iloc[label, 3:5].values.tolist())
result.append(res)
return result
input_data = '[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]'
result = fuzzy_predict(input_data)
print(result)
plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_)
for i, center in enumerate(data):
plt.annotate(f'Center {i}', center)
for data in input_data:
data = eval(data)
labels = kmeans.predict(data)
plt.scatter(data[:, 0], data[:, 1], c=labels, marker='x')
plt.show()
```
你需要将 `data.xlsx` 替换成你的 Excel 表格文件名。在这个代码中,我们首先读取 Excel 表格中的数据,并将第二列和第三列的前六个数据作为聚类中心。然后,我们使用 KMeans 算法进行聚类,并将聚类结果可视化。
`is_valid_input()` 函数用于判断输入的数据是否符合要求,只有符合要求的数据才会进行聚类。
`fuzzy_predict()` 函数用于进行聚类和模糊判断。它将输入数据分成多个组,每个组中的数据都会进行聚类和模糊判断。聚类结果将会以列表的形式返回。
最后,我们使用 Matplotlib 库来可视化聚类结果。
阅读全文