You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

李奇 2005200123
倪梓乘 2005200206
周文 2005200228
1. 答:
推荐系统的目标在信息过载的时代根据用户的历史数据找到用户感兴趣的物品进而实现个性化推荐。推荐算法的本质是通过一定的方式将用户和物品联系起来推荐系统的应用广泛比如网易云音乐的音乐推荐Netflix的电影推荐Amazon的商品推荐等等。
协同过滤 Collaborative Filtering
基于物品的推荐(Item-based)
适合Amanzon等电商平台用户的数量往往大大超过物品的数量同时物品的数据相对稳定因此计算物品的相似度不但计算量较小同时也不必频繁更新。
基于物品的 CF 的原理和基于用户的 CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度,即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。
下图给出了一个例子,对于物品 A根据所有用户的历史偏好喜欢物品 A 的用户都喜欢物品 C得出物品 A 和物品 C 比较相似,而用户 C 喜欢物品 A那么可以推断出用户 C 可能也喜欢物品 C。
基于用户的推荐(User-based) 适合社交网络
基于用户对物品的偏好找到相邻邻居用户,然后将邻居用户喜欢的推荐给当前用户。计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,找到 K 邻居后,根据邻居的相似度权重以及他们对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。
下图给出了一个例子,对于用户 A根据用户的历史偏好这里只计算得到一个邻居 - 用户 C然后将用户 C 喜欢的物品 D 推荐给用户 A。
其中相似性的度量可以是皮尔逊相关系数、余弦相似度、欧氏距离等等。
2. 答:
1-插入排序
描述
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中从而得到一个新的、个数加一的有序数据算法适用于少量数据的排序时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:
第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
def insert_sort(lists):
# 插入排序
count = len(lists)
for i in range(1, count):
key = lists[i]
j = i - 1
while j >= 0:
if lists[j] > key:
lists[j + 1] = lists[j]
lists[j] = key
j -= 1
return lists
2-希尔排序
描述
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DLShell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组对每组使用直接插入排序算法排序随着增量逐渐减少每组包含的关键词越来越多当增量减至1时整个文件恰被分成一组算法便终止。
'''
遇到问题没人解答小编创建了一个Python学习交流QQ群778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书
'''def shell_sort(lists):
# 希尔排序
count = len(lists)
step = 2
group = count / step
while group > 0:
for i in range(0, group):
j = i + group
while j < count:
k = j - group
key = lists[j]
while k >= 0:
if lists[k] > key:
lists[k + group] = lists[k]
lists[k] = key
k -= group
j += group
group /= step
return lists
1516
3-冒泡排序
描述
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
def bubble_sort(lists):
# 冒泡排序
count = len(lists)
for i in range(0, count):
for j in range(i + 1, count):
if lists[i] > lists[j]:
lists[i], lists[j] = lists[j], lists[i]
return lists8
4-快速排序
描述
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
'''
遇到问题没人解答小编创建了一个Python学习交流QQ群778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书
'''def quick_sort(lists, left, right):
# 快速排序
if left >= right:
return lists
key = lists[left]
low = left
high = right
while left < right:
while left < right and lists[right] >= key:
right -= 1
lists[left] = lists[right]
while left < right and lists[left] <= key:
left += 1
lists[right] = lists[left]
lists[right] = key
quick_sort(lists, low, left - 1)
quick_sort(lists, left + 1, high)
return lists
22
5-
1r1 ~ r[n]r12r2 ~ r[n]r2ir[i] ~ r[n]r[i]使
def select_sort(lists):
#
count = len(lists)
for i in range(0, count):
min = i
for j in range(i + 1, count):
if lists[min] > lists[j]:
min = j
lists[min], lists[i] = lists[i], lists[min]
return lists0
6-堆排序
描述
堆排序(Heapsort)是指利用堆积树这种数据结构所设计的一种排序算法它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
'''
遇到问题没人解答小编创建了一个Python学习交流QQ群778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书
'''def adjust_heap(lists, i, size):
lchild = 2 * i + 1
rchild = 2 * i + 2
max = i
if i < size / 2:
if lchild < size and lists[lchild] > lists[max]:
max = lchild
if rchild < size and lists[rchild] > lists[max]:
max = rchild
if max != i:
lists[max], lists[i] = lists[i], lists[max]
adjust_heap(lists, max, size)
def build_heap(lists, size):
for i in range(0, (size/2))[::-1]:
adjust_heap(lists, i, size)
def heap_sort(lists):
size = len(lists)
build_heap(lists, size)
for i in range(0, size)[::-1]:
lists[0], lists[i] = lists[i], lists[0]
adjust_heap(lists, 0, i)
7
7-归并排序
描述
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法Divide and Conquer的一个非常典型的应用。将已有序的子序列合并得到完全有序的序列即先使每个子序列有序再使子序列段间有序。若将两个有序表合并成一个有序表称为二路归并。
归并过程为比较a[i]和a[j]的大小若a[i]≤a[j]则将第一个有序表中的元素a[i]复制到r[k]中并令i和k分别加上1否则将第二个有序表中的元素a[j]复制到r[k]中并令j和k分别加上1如此循环下去直到其中一个有序表取完然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。
'''
遇到问题没人解答小编创建了一个Python学习交流QQ群778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书
'''def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def merge_sort(lists):
#
if len(lists) <= 1:
return lists
num = len(lists) / 2
left = merge_sort(lists[:num])
right = merge_sort(lists[num:])
return merge(left, right)
26
8-
radix sortdistribution sortbucket sortbin sortO (nlog®m)rm
import mathdef radix_sort(lists, radix=10):
k = int(math.ceil(math.log(max(lists), radix)))
bucket = [[] for i in range(radix)]
for i in range(1, k+1):
for j in lists:
bucket[j/(radix**(i-1)) % (radix**i)].append(j)
del lists[:]
for z in bucket:
lists += z
del z[:]
return lists
3.
Web
Python Web 广使 DjangoFlaskTornado Web Python
Python /
Instagram
Quora
Dropbox
Reddit
App Python
Web Python Python 使 Python Python Linux Python
使 Python使 Facebook Python 广 API
Python Python Scrapy
-- Google Python使 Python Python Guido van Rossum Google
Python NumPyPandasMatplotlib
Matlab Python 广NumPySciPyBioPythonSunPy
NASA Python
Python 广
Scikit-learn
NLTK
KerasGoogle TensorFlowFacebook PyTorchAmazon MxNet
Python Python Python AI
Python Python
使 Python
使 Python
PyQTwxPythonTkinter GUI