KNN(k-nearest neighbor algorithm)
1. 算法描述
2. 代码实现
3. 改进思路
KNN算法的步骤可以描述:
- 计算出样本数据和待分类数据的距离;
- 为待分类数据选择K个与其距离最小的样本;
- 统计出K个样本中大多数样本所属的分类;
- 这个分类就是待分类数据所属的分类。
KNN代码实现:
加载数据集
def fit(self, data, target):
self.data = data
self.target = target计算欧式距离
def distance(self, movie, item):
dis = 0
for i in range(len(item)):
dis += (movie[i] - item[i]) ** 2
# dis += Kernel(movie[i], item[i])
dis = numpy.sqrt(dis)
return dis计算K近邻
def neighbors(self, row):
dis = []
knn_many = []
for i in range(self.data.shape[0]):
dis.append((i, self.distance(self.train_data[row], self.data[i])))
dis.sort(key=lambda dis: dis[1])
for i in range(1, self.k + 1):
knn_many.append(self.target[dis[i][0]])
return knn_many训练一行数据
def train(self, row):
neighbors = self.neighbors(row)
preds = {}
for neighbor in neighbors:
if neighbor not in preds:
preds[neighbor] = 1
else:
preds[neighbor] = preds[neighbor] + 1
return sorted(preds.items(), key=lambda d: d[1], reverse=True)[0][0]训练多条数据
def predict(self, train_data):
result = []
self.train_data = train_data
for i in range(0, train_data.shape[0]):
result.append(self.train(i))
return result
改进思路
- 当执行大数据集时候,该代码效率明显下降,可使用Kd-tree with BBF
- 对统计出K个样本,计算每一类样本的均值,分别求出与待分类样本的欧式距离,根据此距离进行分类