我有一个如下所示的重复字符串数据集。
[Building Repairs & Maintenance,Books-CDs-Audio-Video,Stationery,Other Services,Building Repairs & Maintenance]
我想使用上述数据集将相同的值聚集到一个簇中。输出应为
[Building Repairs & Maintenance,Building Repairs & Maintenance,…][Other Services,Other Services,…]
回答:
我不确定您确切想要什么,以及这与机器学习有什么关系。但您可以在不使用机器学习或kmeans聚类的情况下,通过Python轻松实现上述结果。
以下是实现此目的的示例代码:
import collections
data = ["Building Repairs & Maintenance","Books-CDs-Audio-Video","Stationery","Other Services","Building Repairs & Maintenance"]
duplicate_count = collections.Counter(data)
for key in duplicate_count:
print [key]*duplicate_count[key]
如果您能进一步详细说明您的问题以及它与机器学习的关系,那就太好了。
编辑 #1:
您是在说要在列表中查找相似的文本吗,例如[Books-Audio-CD, Audio, Textbook, Building Repair and Maintenance, Repair and Maintenance, Repairing]
给出以下输出
[Books-Audio-CD, Audio, Textbook][Building Repair and Maintenance, Apartment Services, Repairing]
在这种情况下,字符串不是完全匹配,但彼此在上下文和意义上是相关的,使用机器学习和聚类会更合适。
编辑 #2:
对于词袋方法,您可以参考以下代码。然而,这只是我刚刚完成的一个基本实现,需要进行修改以添加必要的功能,如词干提取、停用词删除以及使用tfidf代替简单的词袋表示,以提高准确性。
from sklearn.feature_extraction.text import CountVectorizer as _Vect
from sklearn.cluster import KMeans
simple_vectorizer = _Vect(min_df=1)
train_fit = vectorizer.fit_transform(data)
#假设聚类数为2的K-means的简单初始化。
km = KMeans(n_clusters=2, init='random', n_init=1)
km.fit(train_fit)
print km.labels_
编辑 #3
基于公共数据集的简单移动平均实现。为此,我将值保存到一个名为so.csv的临时文件中。
首先,看看您的数据,我认为您根本不需要对类别使用聚类技术,因为所有特定类别都是完全相同的。您可以轻松地过滤或使用分组来获取同一类别的行。
其次,由于我们不再关注聚类,因此没有必要为不同的字符串使用加权平均值。
虽然这种方法为每个类别提供了预测值,但我认为像arima这样的更robust的方法在您的情况下会更合适,因为您的数据明显反映出趋势和季节性的强烈暗示
所有这些建议完全基于您提供的公共数据集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
so = pd.read_csv('so.csv',parse_dates = ['Date'])
for category in list(set(so['Category'])):
filtered = so.loc[so['Category'] == category].sort_values(by='Date').set_index('Date')
ma = filtered.tail(3)['Amount'].mean()
print "类别:",category,"\t\n下一个预测金额(移动平均值 [过去三个月]) :",ma,"\n"
# 要绘制值,您可以取消注释下面的代码。
# y = list(filtered['Amount'])
# y.extend([ma])
# x = np.array(range(len(y)))
# plt.plot(x, y)
# plt.show()