提问人:Steplet 提问时间:11/16/2023 最后编辑:Steplet 更新时间:11/16/2023 访问量:57
Python 中的 K-nn 没有库
K-nn in Python without libraries
问:
我实现了一个没有像 sklearn 这样的库的 K-nn 模型。动作逻辑如下:
- 对数据进行规范化。
- 将数据分为测试数据和训练数据。
- 计算点与测试样本的距离。
- 计算相同最近邻类的数量。
- 做出预测。
- 计算预测数,然后除以测试样本总数。
没有sklearn的程序的准确性: 0.9444444,k = 5
使用 sklearn: 1.0,k = 5
为什么不相等?
数据
wine = sklearn.datasets.load_wine()
data = pd.DataFrame(wine.data, columns=wine.feature_names)
data['Wine'] = wine.target
data_norm = (data.drop('Wine', axis=1)-data.drop('Wine', axis=1).min()) / (data.drop('Wine', axis=1).max () - data.drop('Wine', axis=1).min())
data_norm.insert(loc=len(data.columns)-1, column='Wine', value=data['Wine'])
功能:
def dist(data, x):
list_t = []
for i in range(len(data)):
dist = 0
for j in range(len(data.iloc[i]) - 1):
dist += (x[j] - data.iloc[i][j])**2
dist = math.sqrt(dist)
list_t.append([data['Wine'].iloc[i], dist])
return list_t
def predict(data):
count = {}
for i in data:
if i[0] in count:
count[i[0]] += 1
else:
count[i[0]] = 1
return max(count.items())[0]
def acc(data, test):
count = 0
for i in range(len(data)):
if data[i] == test.iloc[i]:
count += 1
return (count / len(test))
主要:
y = data_norm['Wine']
X_train, X_test, y_train, y_test = train_test_split(data_norm, y, test_size = 0.3, random_state = 0)
p = []
for i in range(len(X_test)):
dists = dist(X_train, X_test.iloc[i])
dists_sort = sorted(dists, key=lambda x:x[1])
dists_sort = dists_sort[:5]
# print(dists_sort)
p.append(predict(dists_sort))
数据集: 葡萄酒数据集
正常化:最小MaxScaler
答: 暂无答案
评论
data_norm
data = pd.read_csv('WineDataset.csv')
data_norm = (data.drop('Wine', axis=1)-data.drop('Wine', axis=1).min()) / (data.drop('Wine', axis=1).max () - data.drop('Wine', axis=1).min()) data_norm.insert(loc=len(data.columns)-1, column='Wine', value=data['Wine'])
wine = sklearn.datasets.load_wine()